Компьютерный форум 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.05 от 15 декабря 2019 года
Скачать | Архив сборок версии

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

ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по 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

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

Попытаюсь примерами "подогреть" интерес к 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

Ещё пример для функции 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

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

Для разнообразия оформления прогрессбара, существует занятная библиотека - 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

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

Эффект "кругов на воде" на 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

Эффект пламени на 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

Цитата:

Цитата 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

Таймер обратного отсчёта на кнопке 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

Цитата:

Цитата 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::Call `user32::SetWindowLong(ir6,i${GWL_USERDATA},lr5)`
  System::Call `user32::ShowWindow(ir6,i${SW_HIDE})`
  System::Call `user32::ShowWindow(ir6,i${SW_SHOW})`
  System::Call `user32::SendDlgItemMessage(i$HWND,i1206,i${WM_SETTEXT},i0,ts)`
  System::Call `user32::SendDlgItemMessage(i$HWND,i1207,i${WM_SETTEXT},i0,ts)`
  System::Call `user32::SendDlgItemMessage(i$HWND,i1208,i${WM_SETTEXT},i0,ts)`

  System::Call `user32::SendDlgItemMessage(i$HWND,i1209,i${WM_SETTEXT},i0,ts)`
  System::Call `user32::SendDlgItemMessage(i$HWND,i1210,i${WM_SETTEXT},i0,ts)`
  System::Call `user32::SendDlgItemMessage(i$HWND,i1211,i${WM_SETTEXT},i0,ts)`
  System::Call `user32::SendDlgItemMessage(i$HWND,i1212,i${WM_SETTEXT},i0,ts)`

  System::Call `user32::SendDlgItemMessage(i$HWND,i1213,i${WM_SETTEXT},i0,ts)`
  System::Call `user32::SendDlgItemMessage(i$HWND,i1214,i${WM_SETTEXT},i0,ts)`
  System::Call `user32::SendDlgItemMessage(i$HWND,i1215,i${WM_SETTEXT},i0,ts)`
  System::Call `user32::SendDlgItemMessage(i$HWND,i1216,i${WM_SETTEXT},i0,ts)`

  System::Call `user32::SendDlgItemMessage(i$HWND,i1217,i${WM_SETTEXT},i0,ts)`
  System::Free $R1
  end:
FunctionEnd

Function SetSampleText
  System::Call `user32::SendDlgItemMessage(i$HWND,i1232,i${WM_GETTEXT},i${NSIS_MAX_STRLEN},t.s)`
  System::Call `user32::SendMessage(ir0,i${WM_SETTEXT},i0,ts)`
  System::Call `user32::ShowWindow(ir0,i${SW_HIDE})`
  System::Call `user32::ShowWindow(ir0,i${SW_SHOW})`
FunctionEnd

Function .onGUIEnd
  System::Free $R0
  System::Free $5
FunctionEnd

Section
SectionEnd

PS после компиляции будет немного ругани, не влияющей на работоспособность. И похоже опять - из nsWindows.nsh...

MKN 02-10-2013 16:40 2227480

Информация об установленных жестких дисках.

Может быть получена при помощи спец. DLL и следующего кода :
читать дальше »
Код:

!AddPluginDir .
!include "LogicLib.nsh"
Caption "HardDisk Info"
OutFile "GetHardDiskInfo.exe"

Section
StrCpy $0 0
${Do}
        HddInfo::GetModelNumber $0
        Pop $1
        ${IfThen} $1 == "" ${|} ${ExitDo} ${|}
        HddInfo::GetSerialNumber $0
        Pop $2
        HddInfo::GetBufferSize $0
        Pop $3
        HddInfo::GetDiskSize $0
        Pop $4
        Call GetDiskPos
        MessageBox MB_ICONINFORMATION|MB_OK "Жесткий диск (HDD $0)  модель: $1 $\r$\n\
        Cерийный номер : $2 $\r$\n\
        Размер кэш-памяти : $3 $\r$\n\
        Объём жесткого диска: $4 $\r$\n\
        Установлен (подключен) как : $R0"
IntOp $0 $0 + 1
${Loop}
SectionEnd

Function GetDiskPos
        Intop $R0 $0 / 2
        ${Select} $R0
        ${Case} "0"
                StrCpy $R1 "Primary"
        ${Case} "1"
            StrCpy $R1 "Secondary"
        ${Case} "2"
            StrCpy $R1 "Tertiary"
        ${Case} "3"
            StrCpy $R1 "Quaternary"
        ${EndSelect}
       
        Intop $R0 $0 % 2
        ${Select} $R0
        ${Case} "0"
                StrCpy $R0 "Master"
        ${Case} "1"
            StrCpy $R0 "Slave"
        ${EndSelect}
        StrCpy $R0 "$R1 $R0"
FunctionEnd


alexfinik 02-10-2013 19:29 2227554

Не могу понять как использовать массивы nsArray или NSISArray:(((
Как это сделать? Может кто-то привести программку, которая сначала задает массив z[0]=a, z[1]=b, z[2]=c, z[3]=d, z[4]=e с последующей выдачей

Код:

${ForEach} $i 0 4 + 1
        MessageBox MB_OK $z[$i]
${Next}

Что-то типа того... Мануалов как-то негусто... По примерам - не все работают. Может потому что у меня unicode-версия...

kotkovets 03-10-2013 11:17 2227825

Цитата:

Не могу понять как использовать
массивы nsArray или NSISArray
читать дальше »
Код:

!include MUI2.nsh
!include NSISArray.nsh

Name 'Write'
OutFile 'NSISArrayExample.exe'

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

${Array} "Ar_1" 1 4 ;объявляем массив "Ar_1"
${ArrayFunc} Write ;объявляем функции массива  "Ar_1"
${ArrayFunc} Read  ;

Section

  ${Ar_1->Init} ;иницилизируем массив "Ar_1"

  ; запол "Ar_1"
  ${Ar_1->Write} 0 "Что-то"
  ${Ar_1->Write} 1 "типа"
  ${Ar_1->Write} 2 "того"
  ${Ar_1->Write} 3 "массив"
  ${Ar_1->Write} 4 "работает"
 
  ; читаем массив "Ar_1"
  ${ForEach} $R1 0 4 + 1
      ${Ar_1->Read} $R0 $R1
      MessageBox MB_OK "Ar_1[$R1]=$R0" IDOK
  ${Next}
 
  ${Ar_1->Delete} ;удаляем массив "Ar_1"

SectionEnd


alexfinik 03-10-2013 19:58 2228108

Еще вопрос. Не смог понять и найти как задать размер окна в nsDialogs. Например где тут задавать? В мануале не нашел. Там только описание всяких операторов. Спасибо!
Код:

Function nsDialogsPage1

        nsDialogs::Create 1018
       
        Pop $Dialog
        ${If} $Dialog == error
                Abort
        ${EndIf}
       
        ${NSD_CreateLabel} 0 0 100% 12u "Label1"
        Pop $Label1
        ${NSD_CreateText} 0 13u 100% 12u "X"
        Pop $X

       
        nsDialogs::Show

FunctionEnd


kotkovets 03-10-2013 22:37 2228207

Цитата:

Цитата alexfinik
Еще вопрос. Не смог понять и найти как задать размер окна в nsDialogs. Например где тут задавать? В мануале не нашел »

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

alexfinik 04-10-2013 10:39 2228385

kotkovets, Не понял слово "ресурсы" в этом контексте, но правильно ли я понимаю, что невозможно в ходе программы размер окна поменять? Что же делать, если мне нужно создать окно то с 1, то с 10 полями, в зависимости от того, что выберет пользователь?

MKN 04-10-2013 11:54 2228416

Цитата:

Цитата alexfinik
что невозможно в ходе программы размер окна поменять? »

Не совсем ясно, что означает "в ходе программы" ? А вообще, самое простое для изменения размера окон - использовать плагин nsResize. Или, если не лень, размер окон можно изменять с помощью System плагина, вызывая соответствующие API.

alexfinik 04-10-2013 13:06 2228454

Цитата:

Цитата MKN
Не совсем ясно, что означает "в ходе программы" ? А вообще, самое простое для изменения размера окон - использовать плагин nsResize. Или, если не лень, размер окон можно изменять с помощью System плагина, вызывая соответствующие API. »

MKN, типа если в первом окне задаю цифру 10 для некоторой переменной, в следующем окне появляется 10 строчек. Разумеется для этого окно должно быть увеличено в размерах.
По-видимому nsResize мне подойдет, спасибо!

MKN 04-10-2013 16:24 2228611

Подскажите пожалуйста : как запускать NSIS инсталлятор в режиме "always on top - всегда поверх всех окон" ? Хотя бы одну страницу (но желательно сохранять этот режим для каждой последующей)
Пробовал так :
читать дальше »
Код:

OutFile "TOP.exe"
!define SWP_NOSIZE 0x0001
!define SWP_NOMOVE 0x0002
!define HWND_TOPMOST  -1

Function .onInit

  System::Call "user32::SetWindowPos(i $HWNDPARENT, i ${HWND_TOPMOST}, i0, i0, i0, i0, i ${SWP_NOSIZE}|${SWP_NOMOVE})"

; или :

; System::Call "user32::SetWindowPos(i $HWNDPARENT, i -1,i0, i0, i0, i0, i 3)"

FunctionEnd

Section
SectionEnd


не работает...

И как бы сделать кнопочку-переключатель режима "always on top" - где нибудь в верхнем правом углу окна ?

kotkovets 04-10-2013 20:52 2228734

Цитата:

Цитата MKN
Подскажите пожалуйста : как запускать NSIS инсталлятор в режиме "always on top - всегда поверх всех окон" ? Хотя бы одну страницу (но желательно сохранять этот режим для каждой последующей)
Пробовал так : »

MKN твоя ошибка в том, что ты рано применяешь команду, в функции иницилизации приложения - нет окна, $HWNDPARENT = 0
Нужно в функции иницилизации окна, когда окно есть, но его не видно.. :)
Код:

!include "MUI2.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT GUIInit
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

OutFile "TOP.exe"

Function GUIInit
  System::Call "user32::SetWindowPos(i$HWNDPARENT,i-1,i,i,i,i,i3)"
FunctionEnd

Section
SectionEnd


Limonica 10-10-2013 18:15 2232155

1. Как завершить процесс, с помощью плагина System?

2. Как освободить dll-библиотеку от блокирующих дискрипторов?

kotkovets 10-10-2013 19:01 2232207

Limonica,
1. через справочник на русском..
2. через reboot

Limonica 10-10-2013 19:09 2232213

Цитата:

Цитата kotkovets
1. через справочник на русском..
2. через reboot »

2. Средствами Windows это выглядит так taskkill /f /fi "modules eq name.dll", нужна альтернатива для NSIS, чтоб не зависеть от наличия taskkill, есть варианты?

kotkovets 10-10-2013 19:35 2232224

Цитата:

Цитата Limonica
Средствами Windows это выглядит так taskkill /f /fi "modules eq name.dll", нужна альтернатива для NSIS, чтоб не зависеть от наличия taskkill, есть варианты? »

я же вам сказал, откройте справочник по NSIS на русском - там ответ...

Limonica 10-10-2013 20:00 2232238

kotkovets, можете подправить WinVer2.nsh что правильно определяло редакцию на Windows 7, так удобно пользоваться...

kotkovets 10-10-2013 20:34 2232260

Цитата:

Цитата Limonica
можете подправить WinVer2.nsh что правильно определяло редакцию на Windows 7 »

есть такое дело... скорее на сл. неделе выложу - пока поправляю..

vahe-91 10-10-2013 21:47 2232279

kotkovets, заодно и ${WinName} для Windows 8/8.1 поправьте. А ${WinVersion} и в 8 и в 8.1 возвращает 6.2, но в 8.1 должно было быть 6.3

MKN 11-10-2013 17:30 2232766

Цитата:

Цитата Limonica
хочу снять защиту notepad.exe на XP для замены на свой »

Дык и снимай тогда защиту (если включена) с Notepad.exe и заменяй файл на свой. Заменяют обычно в c:\windows\system32\dllcache , в
c:\windows\system32 , в C:\WINDOWS\ServicePackFiles\i386 и в c:\windows - опять же, по обстановке.
Отключить защиту ( на время замены) можно в реестре :
Код:

поменять значение [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon] "SfcDisable"
на "dword:ffffff9d".
Для того чтобы включить его обратно, этот же ключ надо изменить на 0.

Защита отключится только после перезагрузки, которую надо организовать в скрипте.
Защищён ли файл , можно проверить с помощью функции SfcIsFileProtected - как то так :
System::Call "sfc::SfcIsFileProtected(i 0, w R4) i.R0"
каллбак в $R0 - если 0 - файл незащищен
Также повсеместно предлагают для этого батник http://geekswithblogs.net/robz/archi...ws-xp-sp3.aspx
Так гласит Гугл. :)

MKN 11-10-2013 17:52 2232777

Цитата:

Цитата Limonica
хотелось бы без перезагрузки, причем такая возможность есть: »

То что ты написал - никаким боком "не возможность"...
Теоретически можно , как описано здесь : http://xaknotdie.org/22h/5/11.html
в разделе "Отключение Windows File Protection на лету"
Только гемор это ещё тот. Не проще ли один раз перезагрузиться ? Или блокнот предполагается менять ежедневно ? :)

vahe-91 11-10-2013 20:45 2232883

в NSIS нельзя слить arc и exe как в Inno Setup ? :dont-know
Чтобы не копировать куда-то перед распаковкой.

MKN 12-10-2013 13:36 2233141

Цитата:

Цитата Limonica
Завершить все процессы в данный момент использующие библиотеку dll не используя утилиту taskkill, то есть силами самого NSIS »

Сделать это можно, но как уже говорилось, сложно в NSIS. Почитай как это делается в принципе :
http://www.transl-gunsmoker.ru/2012/...g-post_18.html
http://www.transl-gunsmoker.ru/2012/...g-post_19.html
Может быть когда нибудь, какой добрый программер и реализует это для NSIS... Готовых решений - похоже нет.

kotkovets 13-10-2013 23:23 2233913

Обновленный winver2.nsh
1. Исправлена определение редакции в win7
2. Добавлена поддержка win8 и win8.1

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

в определение редакции операционной системы добавлены сл. значения:
${WinType} $var
$var = Windows 8
$var = Windows 8 N
$var = Windows 8 China
$var = Windows 8 Single Language
редакция Core: $var = Windows 8 - так официально задокументировано.
;;;
;;;
в определении названия ОС добавлены сл. значения:
${WinName} $var
$var = Win8
$var = Win8.1
$var = Server 2012
$var = Server 2012 R2
---
как пользоваться, подробно читаем в справке по NSIS - ссылка в шапке


Как пользоваться читаем в нашем справочнике.

Limonica 14-10-2013 15:15 2234265

А Server 2012 R2 ? :(

vahe-91 14-10-2013 15:25 2234270

Цитата:

Цитата kotkovets
Тестируем, отписываемся о работе.. »

На Win8 x86, Win8.1 x64 Win8.1 x86 пробовал, все было гладко :)

kotkovets 14-10-2013 19:11 2234382

Цитата:

Цитата Limonica
А Server 2012 R2 ? »

ну можно всего лишь так подправить, добавить, где происходит определение "Win8.1" - R2:
Код:

              ${If} $0 == 6 ;MajorVersion
              ${AndIf} $1 == 3 ;MinorVersion
                  ${If} $8 == ${VER_NT_WORKSTATION}
                      Push "Win8.1"
                  ${Else}
                      Push "Server 2012 R2"
                  ${EndIf}


diakov 15-10-2013 09:22 2234673

kotkovets, подскажи пожалуйста, можно ли средствами NSIS определить семейство процессора машины AMD или Intel. (вот как идет определение ОС)

MKN 15-10-2013 09:31 2234679

Цитата:

Цитата diakov
определить семейство процессора машины AMD или Intel »

http://nsis.sourceforge.net/CPUFeatures_plug-in

diakov 15-10-2013 10:07 2234697

MKN, спасибо, но есть еще один вопрос, в описании пишет:
Код:

${CPUFeatures.GetVendor} out_var
Result: "Intel", "AMD" or "Other"

Но в ходе выполнения скрипта результат вместо "Intel" просто буква "I" это возможно поправить как то?
Проблема решена, плаг не той кодировки скинул в папку.

Вот код может кому пригодится:
Код:

!include "LogicLib.nsh" - первым делом
!include "CPUFeatures.nsh"


${CPUFeatures.GetFlags} $0
        ${CPUFeatures.GetCount} $0
        DetailPrint "CPU Count: $0"
        ${CPUFeatures.GetVendor} $1
        DetailPrint "CPU Vendor: $1"
  MessageBox MB_OK "У вас установлен $0-ядерный процессор $1."
  ${If} ${CPUIsIntel}
MessageBox MB_OK "Інтел проц."
        ${EndIf}
        ${If} ${CPUIsAMD}
MessageBox MB_OK "Амд проц."
        ${EndIf}


MKN 16-10-2013 15:51 2235558

Хедер ToolTips

Как и что - видно из примера :
Код:

!AddIncludeDir .
!include "ToolTips.nsh"
OutFile "ToolTips_test.exe"
InstallDir "$TEMP"
;Текст на кнопке
MiscButtonText "" "" "" "Готово"

!include "MUI2.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirShow
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Section
${SetCtlToolTips} $mui.Button.Next $R0 "Нажмите для выхода"
SectionEnd

Function DirShow
${CreateBalloonToolTip} $mui.DirectoryPage $0
${SetCtlToolTips} $mui.DirectoryPage.BrowseButton $0 "Нажмите для выбора папки"
${SetCtlToolTips} $mui.DirectoryPage.Directory $0 "Путь установки"
SendMessage $0 ${TTM_SETTITLE} ${TTI_INFO} "STR:Заголовок сообщения-подсказки"   
FunctionEnd

Function onGUIInit
${CreateToolTip} $HWNDPARENT $R0     
${SetCtlToolTips} $mui.Button.Cancel $R0 "Нажмите для отмены установки"
${SetCtlToolTips} $mui.Button.Next $R0 "Нажмите для продолжения установки"
FunctionEnd


alexfinik 18-10-2013 19:20 2236753

Друзья, ситуация такая:

Код:

       
!include nsDialogs.nsh
!include LogicLib.nsh
!include zipdll.nsh
!include MUI2.nsh
!include NSISArray.nsh

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

Name "Формирование установочных файлов -"
OutFile testik.exe

XPStyle on

Var Dialog
Var Label1
Var Label2

Page custom Test0 Test0Leave
Page custom Test1 Test1Leave
Page custom Test2 Test2Leave
Page instfiles

Function Test0
        nsDialogs::Create 1018
       
        Pop $Dialog
        ${If} $Dialog == error
                Abort
        ${EndIf}
       
        ${NSD_CreateLabel} 0 0 100% 12u "Тестирование №0"
        Pop $Label1
        ${NSD_CreateLabel} 0 13u 100% 12u "Задаем количество менеджерских"
        Pop $Label2
        ${NSD_CreateText} 0 25u 100% 13u "1"
        Pop $R4
       
        nsDialogs::Show

FunctionEnd

Function Test0Leave
        ${NSD_GetText} $R4 $R4
        MessageBox MB_OK "R4=$R4" ;выдает R4=1
FunctionEnd

Function Test1
        nsDialogs::Create 1018
               
        Pop $Dialog
        ${If} $Dialog == error
                Abort
        ${EndIf}
       
        nsDialogs::Show
FunctionEnd

Function Test1Leave
${NSD_GetText} $R4 $R4
FunctionEnd

Function Test2

        nsDialogs::Create 1018
       
        Pop $Dialog
        ${If} $Dialog == error
                Abort
        ${EndIf}
       
        nsDialogs::Show

FunctionEnd

Function Test2Leave
        ${NSD_GetText} $R4 $R4
        MessageBox MB_OK "R4=$R4" ;выдает R4=
FunctionEnd

Section
SectionEnd

Не знаю как сделать, чтобы переменная выдавала R4=1 в функции Test2Leave

vahe-91 19-10-2013 19:04 2237382

Если Function .onInit поместить впереди всех секций, то невозможно будет из него управлять флагами секций, а если после всех секций, то при запуске установщика идет какая-то распаковка файлов. Так и должно быть ? :dont-know

kotkovets 19-10-2013 20:29 2237432

Цитата:

Цитата vahe-91
Function .onInit поместить впереди всех секций, то невозможно будет из него управлять флагами секций »

при таком раскладе (управлять флагами секций) -> Function .onInit поместить ПОСЛЕ всех секций.
Это нужно для компилятора NSIS - время когда создается проект.

vahe-91 19-10-2013 20:32 2237437

Цитата:

Цитата kotkovets
при таком раскладе (управлять флагами секций) -> Function .onInit поместить ПОСЛЕ всех секций. »

это уже понял, мне больше интересует распаковка данных, которое не было раньше (до перемещения Function .onInit после секций) или это может быть связано с увеличением размера словаря компрессора до 128 мб ?

icq99999999 20-10-2013 11:34 2237703

рядом с exe лежит ini в зависимости от значения в нём нужно выполнить разные действия
например в секции "setup" параметр "user" значение "q"
нужно выполнить
Rename $INSTDIR\P.dll $INSTDIR\rbp.dll


например в секции "setup" параметр "user" значение "w"
нужно выполнить
Rename $INSTDIR\E.dll $INSTDIR\rbe.dll

vahe-91 20-10-2013 13:42 2237759

icq99999999, в справочнике, что в шапке, описано, как работать с ini файлами

Код:

ReadINIStr $0 "$EXEDIR\что-то.ini"  "setup" "user"
${If} $0 == q
Rename $INSTDIR\P.dll $INSTDIR\rbp.dll
${ElseIf} $0 == w
Rename $INSTDIR\E.dll $INSTDIR\rbe.dll
${EndIf}


kotkovets 20-10-2013 15:42 2237806

Цитата:

Цитата vahe-91
или это может быть связано с увеличением размера словаря компрессора до 128 мб »

легко..

icq99999999 20-10-2013 20:58 2237980

почему нельзя Два раза проверять файлы?

vahe-91 20-10-2013 21:02 2237981

Цитата:

Цитата icq99999999
почему нельзя Два раза проверять файлы? »

а более конкретно ?

icq99999999 20-10-2013 21:12 2237984

Вложений: 1
Цитата:

Цитата vahe-91
а более конкретно ? »

Файл 105625
есть 2 файла рядом с exe нужно в зависимости от того есть они или нету выполнять действия
в этом коде у меня ничего не получается

kotkovets 20-10-2013 22:38 2238044

icq99999999, если вы не в состоянии разобраться в переходах и метках, то пишите так:
Код:

!include "LogicLib.nsh"


${If} ${FileExists} "$EXEDIR\mod.ini"
            ;+100500 команд, если есть файл
${Else}
            ;+100500 команд, если нет файла
${EndIf}

---
зы. две метки с одним именем не могут сосуществовать..

vahe-91 21-10-2013 00:36 2238131

kotkovets, откуда можно узнать список тех команд, которые можно применить с ${If} ?. Например вы вверху написали ${If} ${FileExists}, а я этого не знал :) (про IfFileExists конечно знал)

kotkovets 21-10-2013 09:15 2238215

Цитата:

Цитата vahe-91
откуда можно узнать список тех команд »

справочник: Логические конструкции
из файла примера и logiclib.nsh..
Цитата:

Цитата vahe-91
которые можно применить с ${If} »

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

alexfinik 21-10-2013 11:01 2238268

Я конечно, дико извиняюсь, но вот это http://forum.oszone.net/post-2236753-599.html неужто никто не знает. Как сделать неизменяемым значение переменной на протяжении трех функций?

MKN 21-10-2013 13:53 2238387

alexfinik,
Честно говоря, не фига не понятно что ты хочешь.. Если неизменность значения переменной, взятого из текстового поля на первой страницы - для остальных страниц, то это вроде как очевидно, типа :
Код:

!include "MUI2.nsh"
OutFile "3customPage.exe"
page custom func1
page custom func2
page custom func3
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English
Var Txt

Function func1
  nsDialogs::Create 1018
  pop $0
    !insertmacro MUI_HEADER_TEXT_PAGE "Первая страница" ""
        ${NSD_CreateText} 0 25u 100% 13u "1"
        Pop $Txt
        ${NSD_GetText} $Txt $1 
        MessageBox MB_OK "$1"
        nsDialogs::Show
FunctionEnd

Function func2
  nsDialogs::Create 1018
  pop $0
  !insertmacro MUI_HEADER_TEXT_PAGE "Вторая страница" ""
  Pop $Txt
  MessageBox MB_OK "$1"
  nsDialogs::Show
FunctionEnd

Function func3
  nsDialogs::Create 1018
  pop $0
  !insertmacro MUI_HEADER_TEXT_PAGE "Третья страница" ""
  MessageBox MB_OK "$1"
  nsDialogs::Show
FunctionEnd

Section
SectionEnd

Если не то, объясни понятнее...

MKN 21-10-2013 14:20 2238403

Цитата:

Цитата vahe-91
список тех команд, которые можно применить с ${If} ? »

Док гласит так :
читать дальше »
Код:

Conditionally executes a block of statements, depending on the value of an expression.
Syntax:
${If} expression

The following "expressions" are available:
Standard (built-in) string tests (which are case-insensitive):
    a == b; a != b
Additional case-insensitive string tests (using System.dll):
    a S< b; a S>= b; a S> b; a S<= b
Case-sensitive string tests:
    a S== b; a S!= b
Standard (built-in) signed integer tests:
    a = b; a <> b; a < b; a >= b; a > b; a <= b
Standard (built-in) unsigned integer tests:
    a U< b; a U>= b; a U> b; a U<= b
64-bit integer tests (using System.dll):
    a L= b; a L<> b; a L< b; a L>= b; a L> b; a L<= b
Built-in NSIS flag tests:
    ${Abort}; ${Errors}; ${RebootFlag}; ${Silent}
Built-in NSIS other tests:
    ${FileExists} a
Any conditional NSIS instruction test:
    ${Cmd} a
Section flag tests:
    ${SectionIsSelected} a; ${SectionIsSectionGroup} a;
    ${SectionIsSectionGroupEnd} a; ${SectionIsBold} a;
    ${SectionIsReadOnly} a; ${SectionIsExpanded} a;
    ${SectionIsPartiallySelected} a

Examples:

Check if condition is met
StrCpy $0 true

${If} $0 == true
    MessageBox MB_OK "It's true"
${Else}
    MessageBox MB_OK "This will never be true"
${EndIf}
Integer tests
${If} 1 > 0
    MessageBox MB_OK "1 is greater than 0"
${EndIf}

${If} 2 > 1
${AndIf} 2 < 3
    MessageBox MB_OK "2 is greater than 1 and smaller than 3"
${EndIf}
File conditions
${If} ${FileExists} $SYSDIR\notepad.exe
    Exec $SYSDIR\notepad.exe
${Else}
    MessageBox MB_OK "Could not find notepad.exe"
${EndIf}

${If} ${FileExists} $PROGAMFILES\*.*
    MessageBox MB_OK "Directory $$PROGRAMFILES exists"
${EndIf}
Section test
Section "My Section" mySection
    MessageBox MB_OK "Executing section"

    ${If} ${SectionIsSelected} ${mySection}
        MessageBox MB_OK "It's selected, dummy!"
    ${EndIf}
SectionEnd


vahe-91 21-10-2013 14:55 2238415

kotkovets, если в NSIS 3.0a1 сделать unicode установщик, то ${WinVersion} в Windows 8.1 выдаст 6. вместо 6.3

alexfinik 21-10-2013 15:02 2238418

MKN, В func1 задается переменная. В msgbox в func3 отображается заданное значение этой переменной. У меня оно пустое... Я, наверное, плохо объясняю. Сейчас понятно объяснил?
Твой скрипт эту задачу не выполняет - проверил. Задаю 5 - отображает 1

MKN 21-10-2013 15:26 2238437

Цитата:

Цитата alexfinik
Задаю 5 - отображает 1 »

С чего бы вдруг ? Задаю 5 - отображается ессно 5. Задаю 25 - 25 и т.д. Только надо добавить регистрацию изменений ввода.
Я ведь только пример привёл основы.

alexfinik 21-10-2013 15:35 2238445

MKN, разобрался. Зря использовал в Test1Leave и Test2Leave "${NSD_GetText} $R4 $R4"

Это я про свой пример http://www.oszone.net/go.php?url=htt...36753-599.html

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

Вот так работает:
Код:

       
!include nsDialogs.nsh
!include LogicLib.nsh
!include zipdll.nsh
!include MUI2.nsh
!include NSISArray.nsh

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

Name "Формирование установочных файлов -"
OutFile testik.exe

XPStyle on

Var Dialog
Var Label1
Var Label2

Page custom Test0 Test0Leave
Page custom Test1 Test1Leave
Page custom Test2 Test2Leave
Page instfiles

Function Test0
        nsDialogs::Create 1018
       
        Pop $Dialog
        ${If} $Dialog == error
                Abort
        ${EndIf}
       
        ${NSD_CreateLabel} 0 0 100% 12u "Тестирование №0"
        Pop $Label1
        ${NSD_CreateLabel} 0 13u 100% 12u "Задаем количество менеджерских"
        Pop $Label2
        ${NSD_CreateText} 0 25u 100% 13u "1"
        Pop $9
       
        nsDialogs::Show

FunctionEnd

Function Test0Leave
        ${NSD_GetText} $9 $9
        MessageBox MB_OK "Переменная=$9" ;выдает Переменная=1
FunctionEnd

Function Test1
        nsDialogs::Create 1018
               
        Pop $Dialog
        ${If} $Dialog == error
                Abort
        ${EndIf}
       
        nsDialogs::Show
FunctionEnd

Function Test1Leave
;${NSD_GetText} $9 $9
FunctionEnd

Function Test2

        nsDialogs::Create 1018
       
        Pop $Dialog
        ${If} $Dialog == error
                Abort
        ${EndIf}
       
        nsDialogs::Show

FunctionEnd

Function Test2Leave
        ;${NSD_GetText} $9 $9
        MessageBox MB_OK "Переменная=$9" ;выдает Переменная=
FunctionEnd

Section
SectionEnd


MKN 21-10-2013 15:42 2238450

alexfinik,
Если надо править, то добавь OnChange, как уже вышесказано :

Код:

......
Pop $Txt
${NSD_OnChange} $Txt Change
nsDialogs::Show
FunctionEnd

Function Change
Pop $Txt
${NSD_GetText} $Txt $1 
FunctionEnd
......


alexfinik 21-10-2013 19:10 2238547

MKN, хм, а зачем, если у меня работает и так?

Правда есть другой "простой", просто "элементарный" вопрос.
По запросу "числа", "сложение" - я ничего не нашел
Как выполнить операцию $NumMan=$NumMan-1 ??
У меня for работает только с нуля почему-то. Приходят в голову всякие извраты типа сделать строку длиной $NumMan Отнять единицу, подсчитать его размер и присвоить $NumMan. Бывает что-то попрощу? Плохо ли искал в мануале, но нашел только сравнение чисел...
Терпеть не могу писать в форумы, а вот зачастил что-то... И главное простейший вопрос, а не нашел ничего...

kotkovets 21-10-2013 19:30 2238552

Цитата:

Цитата alexfinik
Как выполнить операцию $NumMan=$NumMan-1 ?? »

Код:

IntOp $NumMan $NumMan - 1

alexfinik 21-10-2013 19:40 2238557

kotkovets, Спасибо! Нашел еще вот такое:
Код:

System::Int64Op $NumMan - 1
Pop $NumMan

Хотя у меня 64-битная система, но NSIS не 64-бит. Ну что попалось.

kotkovets 21-10-2013 19:51 2238563

Цитата:

Цитата alexfinik
Нашел еще вот такое:
System::Int64Op $NumMan - 1
Pop $NumMan »

разрядность здесь по барабану - позволяет работать с большими числами, чем IntOp

Limonica 22-10-2013 17:33 2239015

Ошибка в WinVer2.nsh:



Система Windows XP SP2 Home Edition.

alexfinik 22-10-2013 19:19 2239072

Limonica, а вы уверены, что это ошибка? Может просто неверно используете модуль? Похоже на вывод справки.

kotkovets 22-10-2013 20:35 2239129

Цитата:

Цитата Limonica
Ошибка в WinVer2.nsh: »

макрос FUNC_WindowsServerName ($WinServerName) не может по сценарию возвращать - Home Edition
проверял на WinXP Professional:
http://img203.imageshack.us/img203/7199/l5hn.png
---
vahe-91 по поводу юникода:
http://img844.imageshack.us/img844/9172/eeuv.png

Limonica 23-10-2013 01:37 2239292

Для убидительности проверил и на SP3 (Windows XP Home Edition)
http://dropi.ru/qMy.jpg

Все образы с MSDN. Баг реально есть и именно на Home Edition.
ссылка на оригинальные образы http://yadi.sk/d/OOa1SUsk7oKs0

MKN 23-10-2013 17:45 2239673

Ещё раз об определении архитектуры процессора. Был предложен плагин, но можно и так (когда то уже было...) :
Код:

OutFile "PROCESSOR_ARCHITECTURE.exe"
; Функция GetNativeSystemInfo получает информацию о текщей системе приложению, которое запущено под WOW64.
; Если функция вызывается из 64-битного приложения, она эквивалентна функции GetSystemInfo.

Section
    ;System::Alloc 32
    System::Alloc 36
    Pop $0
    System::Call "Kernel32::GetNativeSystemInfo(i) v (r0)"
    System::Call "*$0(&i2 .r1)"
    System::Free $0
   
    StrCmp $1 0 0 +2
    MessageBox MB_OK "PROCESSOR_ARCHITECTURE :  INTEL "

    StrCmp $1 9 0 +2
    MessageBox MB_OK "PROCESSOR_ARCHITECTURE :  AMD64"
     
    StrCmp $1 6 0 +2
    MessageBox MB_OK "PROCESSOR_ARCHITECTURE : IA64 "
                 
    StrCmp $1 0xffff 0 +2
    MessageBox MB_OK "PROCESSOR_ARCHITECTURE :  UNKNOWN "
SectionEnd


Limonica 23-10-2013 23:13 2239893

kotkovets, когда ожидать фикс?

kotkovets 24-10-2013 00:54 2239933

Цитата:

Цитата Limonica
Баг реально есть и именно на Home Edition »

а именно в OSVERSIONINFOEX :unsure:
неправильно возвращается значение, возвращаются в стек два значения: Professional и Home Edition с учетом этого факта
подправил winver2.nsh
p.s
исправлена работа в юникодной версии NSIS

alexfinik 24-10-2013 01:21 2239943

Друзья, заколебался:((( Не понимаю что делать:((

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

Помогите, пожалуйста, или направьте на нужную литературу, да хоть на английском. Может пойму...

Код:

!include nsDialogs.nsh
!include LogicLib.nsh

Name "nsDialogs Example"
OutFile "nsDialogs Example.exe"

XPStyle on

var Num1
var NumCash
var Dialog
var Label1
var Label2

Page custom test0 test1

Function test0
        MessageBox MB_OK "До цикла"
       
       
  ${ForEach} $R6 0 1 + 1
        nsDialogs::Create 1018
        Pop $Dialog
        ${If} $Dialog == error
                Abort
        ${EndIf}
        ${NSD_CreateLabel} 0 0 100% 33u "окно цикла 1 $\n R6=$R6"
        Pop $Label1
        MessageBox MB_OK "Цикл1 $R6"
        StrCpy $Num1 $NumCash
        nsDialogs::Show
        ${ForEach} $R5 0 1 + 1
                nsDialogs::Create 1018
                Pop $Dialog
                ${If} $Dialog == error
                        Abort
                ${EndIf}
                ${NSD_CreateLabel} 0 0 100% 33u "окно цикла 2 $\n R5=$R5"
                Pop $Label2
                MessageBox MB_OK "Цикл2 $R5"
                nsDialogs::Show
        ${Next}
${Next}
FunctionEnd

Function test1
${ForEach} $R7 0 1 + 1
        MessageBox MB_OK "Цикл3 $R7"
${Next}       
FunctionEnd


Section
SectionEnd


kotkovets 24-10-2013 01:45 2239948

Цитата:

Цитата alexfinik
Может пойму... »

1. Зачем создавать множественный диалог nsDialogs::Create 1018 достаточно один раз создать диалог
2. В созданном диалоге разрушать, скрывать или создавать в цикле дочерние элементы диалога..
3. Функция test1 выполняется при закрытии (выполнении) функции test0

Limonica 24-10-2013 02:05 2239953

kotkovets, огромное человеческое спасибо!

MKN 24-10-2013 12:31 2240128

Разнообразные параметры ОС (версия, Build, SP и пр. )можно определить и с помощью WMI хедера.
Например :

Код:

;http://nsis.sourceforge.net/WMI_header
OutFile "OperatingSystemInfo.exe"
!include MUI2.nsh
!include WMI.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE "English"

Section
; короткое описание версии операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Caption callback_Function
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Version callback_Function
; последний установленный сервис-пак (строка); если никакой сервис-пак не установлен, пустая строка.
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSDVersion callback_Function
; версия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMajorVersion callback_Function
; подверсия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMinorVersion callback_Function
; Processor Type
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem BuildType callback_Function
; имя компьютера
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSName callback_Function
; зарегистрированный пользователь операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem RegisteredUser callback_Function
; идентификатор языка, используемого операционной системой
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Locale callback_Function
; OSLanguage
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem OSLanguage callback_Function
; тип операционной системы:
;  16 - WIN95, 17 - WIN98, 18 - WINNT, 19 - WINCE
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem OSType callback_Function
SectionEnd
 
Function callback_Function
#$R0 = result number, $R1 = total results, $R2 = result name
System::Call "user32::OemToChar(t R2, t. r2)"
detailprint "$2"
FunctionEnd

Но есть такой вопрос - как распределить полученные данные раздельно по разным переменным ?

K.A.V. 24-10-2013 13:12 2240157

Цитата:

Цитата MKN
Но есть такой вопрос - как распределить полученные данные раздельно по разным переменным ? »

Элементарно ;)

Код:


Var WMI_Caption
Var WMI_Version
Var WMI_CSDVersion
Var WMI_ServicePackMajorVersion
Var WMI_ServicePackMinorVersion
Var WMI_BuildType
Var WMI_CSName
Var WMI_RegisteredUser
Var WMI_Locale
Var WMI_OSLanguage
Var WMI_OSType
Var WMI_PushVar


;http://nsis.sourceforge.net/WMI_header
OutFile "OperatingSystemInfo.exe"
!include MUI2.nsh
!include WMI.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE "English"



Section

; короткое описание версии операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Caption callback_Function
StrCpy $WMI_Caption $WMI_PushVar

${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Version callback_Function
 StrCpy $WMI_Version $WMI_PushVar

; последний установленный сервис-пак (строка); если никакой сервис-пак не установлен, пустая строка.
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSDVersion callback_Function
 StrCpy $WMI_CSDVersion $WMI_PushVar

; версия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMajorVersion callback_Function
 StrCpy $WMI_ServicePackMajorVersion $WMI_PushVar

; подверсия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMinorVersion callback_Function
 StrCpy $WMI_ServicePackMinorVersion $WMI_PushVar

; Processor Type
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem BuildType callback_Function
 StrCpy $WMI_BuildType $WMI_PushVar

; имя компьютера
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSName callback_Function
 StrCpy $WMI_CSName $WMI_PushVar

; зарегистрированный пользователь операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem RegisteredUser callback_Function
 StrCpy $WMI_RegisteredUser $WMI_PushVar

; идентификатор языка, используемого операционной системой
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Locale callback_Function
 StrCpy $WMI_Locale $WMI_PushVar

; OSLanguage
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem OSLanguage callback_Function
 StrCpy $WMI_OSLanguage $WMI_PushVar
           
; тип операционной системы:
;  16 - WIN95, 17 - WIN98, 18 - WINNT, 19 - WINCE
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem OSType callback_Function
  StrCpy $WMI_OSType $WMI_PushVar



###################################################
FileOpen $0 "$EXEDIR\WMI.txt" w
FileWrite $0 "=== OperatingSystemInfo.exe ===$\n"
FileWrite $0 "$\n$$WMI_Caption = $WMI_Caption"
FileWrite $0 "$\n$$WMI_Version = $WMI_Version"
FileWrite $0 "$\n$$WMI_CSDVersion = $WMI_CSDVersion"
FileWrite $0 "$\n$$WMI_ServicePackMajorVersion = $WMI_ServicePackMajorVersion"
FileWrite $0 "$\n$$WMI_ServicePackMinorVersion = $WMI_ServicePackMinorVersion"
FileWrite $0 "$\n$$WMI_BuildType = $WMI_BuildType"
FileWrite $0 "$\n$$WMI_CSName = $WMI_CSName"
FileWrite $0 "$\n$$WMI_RegisteredUser = $WMI_RegisteredUser"
FileWrite $0 "$\n$$WMI_Locale = $WMI_Locale"
FileWrite $0 "$\n$$WMI_OSLanguage = $WMI_OSLanguage"
FileWrite $0 "$\n$$WMI_OSType = $WMI_OSType"
FileClose $0
execshell open "$EXEDIR\WMI.txt"
 
 quit
###################################################
SectionEnd
 
Function callback_Function
#$R0 = result number, $R1 = total results, $R2 = result name
System::Call "user32::OemToChar(t R2, t. r2)"
detailprint "$2"
StrCpy $WMI_PushVar $2
FunctionEnd


kotkovets 24-10-2013 13:34 2240181

MKN
Цитата:

Разнообразные параметры ОС
(версия, Build, SP и пр. )можно
определить и с помощью WMI
в моем winver2 так и сделано...
точнее гибридно..

alexfinik 24-10-2013 13:41 2240189

Цитата:

Цитата kotkovets
1. Зачем создавать множественный диалог nsDialogs::Create 1018 достаточно один раз создать диалог »

Это понятно. Т.е. оставляю только первый nsDialogs::Create 1018

Цитата:

Цитата kotkovets
2. В созданном диалоге разрушать, скрывать или создавать в цикле дочерние элементы диалога.. »

Как создавать - понятно. Как скрывать, спасибо за подсказку, теперь тоже нашел.
Вопрос, по какому действию скрывать и показывать другие? По нажатию кнопки Next? Как наиболее коротко это сделать? В голову приходят идеи создания отдельной функции, но может есть команды в одну строку?

MKN 24-10-2013 13:46 2240194

Цитата:

Цитата kotkovets
в моем winver2 так и сделано... »

Хедер твой замечательный ! Это я выложил для разнообразия и привлечения интереса к WMI :)
Но что мне не нравится в WMI - подтормаживает... Пока всё определит... Может это издержки хедера ? И может можно как то ускорить его работу ?

kotkovets 24-10-2013 14:19 2240226

Цитата:

Цитата MKN
мне не нравится в WMI - подтормаживает... »

именно оно подтормаживает.. только один раз..
апи неверно работает в win8 - поэтому вынужден на WMI перейти
---
Цитата:

Цитата alexfinik
По нажатию кнопки Next? Как наиболее коротко это сделать? »

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

Page custom test0 test1
Page custom test2 test3
Page custom test4 test5

что то мне подсказывает - здесь циклы -> тупик..

alexfinik 24-10-2013 14:56 2240255

Цитата:

Цитата kotkovets
что то мне подсказывает - здесь циклы -> тупик.. »

Ну спасибо, значит не пойду по тупиковому пути. Но наверняка кто-то делал уже что-то подобное:
1. На странице "Первая страница" задаю количество страниц с название "Вторые страницы" в поле. Например 4.
2. Далее возникают по очереди мои четыре страницы. На каждой из них задаю количество страниц "Третьи страницы" Допустим задам во всех окнах по 1,2,3,4 "третьих страниц", соответственно.
3. В конце одна 4-я страница
4. Ну соответственно у меня будет такая последовательность возникновения страниц на экране


1,2,3, 2,3,3, 2,3,3,3, 2,3,3,3,3, 4

На всех страницах вводится информация, которая дальше формирует ini и bat файлы.

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

K.A.V. 24-10-2013 15:57 2240320

alexfinik, т.е. вам нужно реализовать что...если я правильно понял:

Конструкцию, при которой пользователь сам решит, сколько страниц показывать (странички будут с одинаковым содержимым уже известным вам или как?) и далее, "дублирующее" действие, на следующих страничках, пользователь опять же сам укажет количество нужных для показа страничек?

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

2. Когда "вторая" страничка будет подходить к концу показа (пользователь сделал там всё, что было необходимо) в конце функции после команды nsDialogs::Show мы плюсуем +1 к значению переменной (создаём ещё одну переменную), в которой мы указывали общее количество страничек, сравниваем значения и, если нам ещё нужно показывать странички (значение меньше 4), то перепрыгиваем меткой в начало функции (перед командой nsDialogs::Create), что поможет нам инициализировать создание второй странички в пределах одной функции, если же значение 4 (все необходимые странички были показаны), то завершаем функцию и идём дальше

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

Это просто набросок реализации, я сам понял, что написал, потому что в своё время много заморачивался со страничками на InstallOptions, а уловили ли вы мою идею, я не знаю :biggrin:
В любом случае, пишите больше подробностей, если что - поможем

icq99999999 24-10-2013 17:45 2240400

определяю значение ,консервирую в переменную $1
ReadINIStr $1 "$EXEDIR\mod.ini" "Setting" "(I)D"
после определения использую $1
nsExec::Exec '"$INSTDIR\PLUGINSDIR\7z.exe" e $INSTDIR\mod.7z -o"$1" -aos'
например если в $1 значение $SMPROGRAMS
то в итоге будет
nsExec::Exec '"$INSTDIR\PLUGINSDIR\7z.exe" e $INSTDIR\mod.7z -o"$SMPROGRAMS" -aos'
а мне нужно чтоб nsis определил $SMPROGRAMS как это он определяет по умолчанию, например C:\ProgramData\Microsoft\Windows\Start Menu\Programs\
то есть в итоге нужно
nsExec::Exec '"$INSTDIR\PLUGINSDIR\7z.exe" e $INSTDIR\mod.7z -o"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\" -aos'
возможно ли это?

alexfinik 24-10-2013 17:49 2240403

K.A.V., кажется что-то понял:). Спасибо. Попробую повозиться с метками.

Не очень понял относительно nsDialogs::Show. Если у нас есть
Код:

Page custom test0 test1
и в test0 у нас зашит этот самый nsDialogs::Show, то после этой команды он разве не переходит сразу к test1?

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

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

K.A.V. 24-10-2013 20:27 2240519

alexfinik, держите
Код:

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

  var showagain
  var button
  var DialogCount
  var labelCount
 
Page custom func1 func2

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "TEST.exe"
OutFile "TEST.exe"
ShowInstDetails show
XPStyle on



 
Function func1
StrCpy $DialogCount -1
showDialog:
StrCpy $showagain "0"
IntOp $DialogCount $DialogCount + 1

 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_CreateLabel} 0 5u 100u 20u "Перезагрузок диалога: $DialogCount"
 pop $labelCount
 
 ${NSD_CreateButton} 25u 27u 150u 15u "Перезагрузка диалога"
 pop $button
 ${NSD_OnClick} $button StartDialog
 
 nsDialogs::Show
 
StrCmp $showagain "1" showDialog 0
FunctionEnd


Function func2
FunctionEnd



Function StartDialog
MessageBox MB_YESNO|MB_ICONQUESTION "Показать диалог ещё раз?"  idyes restart
strcpy $showagain 0 
abort
restart:
strcpy $showagain 1
# Искусственно нажимаем кнопку "Далее", чтобы перезагрузить диалог
        GetDlgItem $0 $HWNDPARENT 1
        SendMessage $0 ${BM_CLICK} 0 0
FunctionEnd 



Section
SetAutoClose true
SectionEnd

Вопрос: для чего вам 2-ая функция в странице?

Цитата:

Цитата alexfinik
Кажется пока сам разбираюсь. Изврат полный, но получается... »

Ну...вы тему прочитайте с самого начала, какой мы тут только изврат уже не устраивали, чего только люди не желали... :biggrin:

K.A.V. 24-10-2013 22:24 2240596

Вложений: 1
Может, кому пригодится...
Плагин делает окно инсталлятора прозрачным. Инструкция и пример в архиве

icq99999999 25-10-2013 00:25 2240659

почему так работает
CreateShortCut "$SMPROGRAMS\mod\mod.lnk" "$INSTDIR\mod.exe"
а так нет?
RMDir /r /REBOOTOK "$SMPROGRAMS\mod"

пишу
CreateShortCut "$SMPROGRAMS\очистка.lnk" "$INSTDIR\mod.exe" "/O"
получаю ярлык с таким именем
Тихая.lnk"
в чём причина?

vahe-91 25-10-2013 09:39 2240753

icq99999999,
перед созданием ярлыка, нужно создать папку ярлыка, иначе ярлык может не создаваться:
CreateDirectory "$SMPROGRAMS\mod"
CreateShortCut "$SMPROGRAMS\mod\mod.lnk" "$INSTDIR\mod.exe"

Цитата:

Цитата icq99999999
а так нет?
RMDir /r /REBOOTOK "$SMPROGRAMS\mod" »

потому что должно быть так:
SetOutPath "$SMPROGRAMS\"
RMDir /r /REBOOTOK "$SMPROGRAMS\mod"

Цитата:

Цитата icq99999999
пишу
CreateShortCut "$SMPROGRAMS\очистка.lnk" "$INSTDIR\mod.exe" "/O"
получаю ярлык с таким именем
Тихая.lnk"
в чём причина? »

если ты создаешь Unicode установщик, то файл скрипта должен быть в формате UTF-16LE, если ANSI, то ANSI

icq99999999 25-10-2013 11:20 2240798

нужно распознать значение из ini
то есть в ini в секции Setting параметр (I)D будет значение например $EXEDIR
вытяну значение
ReadINIStr $1 "$INSTDIR\mod.ini" "Setting" "(I)D"
но в переменную $1 будет скопировано сам текст $EXEDIR
а мне нужно чтоб а но распознавалось и вместо текста $EXEDIR был путь exe
ну то есть

PHP код:

!include "FileFunc.nsh"

SetCompressor /SOLID lzma

OutFile 
"e.exe"
SilentInstall silent

Section 
"MainSection" SEC01
 ReadINIStr 
$"$exeDIR\mod.ini" "Setting" "(I)D"
  
MessageBox MB_OK "вы запустили exe из $1"
SectionEnd 

как итог будет сообщение с текстом "вы запустили exe из $EXEDIR"
а мне нужно чтоб был путь exe то есть например сообщение с текстом: "вы запустили exe из С:\1.exe"

K.A.V. 25-10-2013 11:53 2240820

icq99999999, не знаете команду сравнения строк?
Прочтите сначала Справочник по NSIS

Код:

Section "MainSection" SEC01
 ReadINIStr $1 "$exeDIR\mod.ini" "Setting" "(I)D"
StrCmp $1 "$$EXEDIR" 0 +2
  MessageBox MB_OK "вы запустили exe из $EXEDIR"
SectionEnd


alexfinik 25-10-2013 13:21 2240875

K.A.V., Первую часть читал. Сидел ночью часа полтора и построчно "проходил" код, записывал как изменяются переменные. Забавно. Как ни странно Код заработал с первого раза после проверки. Выложу ради интереса кусок. Правда "завести" массивы так и не вышло. Пока не разобрался почему, но, в любом случае, массивы тут нафиг не нужны оказались/

Код:

Function nsRkeeperIni
        ;!insertmacro var_message
        ${if} $NumCash > 0       
                Goto CreateTest0
        ${endif}
        ${IpPortMid_ar->Init}
        ${MID_ar->Init}
        ${RefServerMid_ar->Init}
        ${IPMidSrv_ar->Init}
        ${Station_ar->Init}
        StrCpy $ini ".ini"
        StrCpy $R6 "1"
        StrCpy $R7 "1"
        ;!insertmacro var_message
        StrCpy $NumMid "4"
StartTest0:       
        StrCpy $NumMidFlag "1" ;флаг входа в цикл NumMid
        nsDialogs::Create 1018
        Pop $Dialog
        ${If} $Dialog == error
                Abort
        ${EndIf}
       
        ${NSD_CreateLabel} 0 0 100% 12u "Создаем Rkeeper.ini - Введите параметры ресторана ниже"
        Pop $Label1
        ${NSD_CreateLabel} 0 13u 100% 12u "Имя кассового сервера:"
        Pop $Label2
        ${NSD_CreateText} 0 25u 100% 13u "TEST_MIDSERVER" ;задаем имя клиента
        Pop $MID
       
        ${NSD_CreateLabel} 0 38u 100% 12u "Кассовый сервер подсоединяестся к серверу:"
        Pop $Label3
        ${NSD_CreateText} 0 50u 100% 13u "TEST_RK7SRV" ;задаем имя сервера к которому подсоединяемся
        Pop $RefServerMid
       
        ${NSD_CreateLabel} 0 63u 100% 12u "IP-адрес и порт"
        Pop $Label4
        ${NSD_CreateText} 0 75u 100% 13u "127.0.0.1:3669" ;
        Pop $IpPortMid
       
        ${NSD_CreateLabel} 0 88u 100% 12u "Количество касс на данном кассовом сервере (1..50)"
        Pop $Label25
        ${NSD_CreateText} 0 100u 100% 13u "1" ;
        Pop $NumCash
        ;IntOp $R5 $NumCash -1
        ;MessageBox MB_OK "NumCash=$NumCash $\n MID=$MID $\n IpPortMid=$IpPortMid"
        ;!insertmacro var_message
        ;Задаем количество касс на кассовом сервере
        ;StrCpy $Num1 $NumCash ;зачем-то надо копировать. С Numcash не работает
        nsDialogs::Show
       
        ${if} $R6 <= $NumMid
        ${andif} $NumCash == 0
                Goto FinishTest0       
        ${endif}
       
       
       
CreateTest0:
        ${if} $NumCash > 0       
                nsDialogs::Create 1018
                Pop $Dialog
                ${If} $Dialog == error
                        Abort
                ${EndIf}
                ${NSD_CreateLabel} 0 0 100% 12u "Создаем wincash.ini - введите параметры кассовой станции"
                Pop $Label8
                ${NSD_CreateLabel} 0 13u 100% 12u "Имя кассовой станции:"
                Pop $Label9
                ${NSD_CreateText} 0 25u 100% 13u "TEST_ST01" ;задаем имя кассовой станции
                Pop $Station
                ${NSD_CreateLabel} 0 38u 100% 12u "IP-адрес кассового сервера:"
                Pop $Label10
                ${NSD_CreateText} 0 50u 100% 13u "127.0.0.1" ;
                Pop $IPMidSrv               
                StrCpy $NumCashFlag "1" ;флаг разрешения входа в цикл NumCash
        ${endif}
        nsDialogs::Show
        IntOp $NumCash $NumCash - 1
        ;MessageBox MB_OK "Уменьшаю NumCash на 1 $\n Теперь NumCash=$NumCash"
FinishTest0:
        ${If} $NumCash == 0
                IntOp $R6 $R6 + 1
                ;MessageBox MB_OK "Увеличиваю R6 на 1 $\n Теперь R6=$R6 $\n NumCash=$NumCash"
                StrCpy $NumCashFlag "0" ;флаг запрета входа в цикл NumCash
        ${endif}
        ${if} $NumCash > 0
                Goto CreateTest0
        ${endif}
        ${If} $R6 <= $NumMid
        ;${andif} $NumCash > 0
                Goto StartTest0
        ${endif}

FunctionEnd
;работа с массивами тут необходима
Function nsRkeeperIniLeave
  ${if} $NumMidFlag == 1       
        ${NSD_GetText} $NumCash $NumCash
        ${NSD_GetText} $MID $MID
        ${NSD_GetText} $RefServerMid $RefServerMid
        ${NSD_GetText} $IpPortMid $IpPortMid
        ;${NSD_GetText} $Num1 $Num1
       
        ${MID_ar->Write} $R6 "$MID"
        ${MID_ar->Read} $R2 $R6
        ${RefServerMid_ar->Write} $R6 "$RefServerMid"
        ${RefServerMid_ar->Read} $R3 $R6
        ${IpPortMid_ar->Write} $R6 "$IpPortMid"
        ${IpPortMid_ar->Read} $R4 $R6
        !insertmacro var_message
        !insertmacro MakeRkeeperIni
        StrCpy $NumMidFlag "0" ;флаг выхода в цикл NumMid
        StrCpy $NumCashFlag "0" ;флаг запрета входа в цикл NumCash - в принципе тут лишний
  ${endif}       
 
 
  ${if} $NumCashFlag == 0
  ${orif} $NumCashFlag == ""
        Goto FinishTest1
  ${endif}
 
        ${if} $NumCash < 1
        ${OrIf} $NumCash > 50
                ;MessageBox MB_OK "Задано слишком маленькое или большое количество станций $\n либо задано некорректное NumCash=$NumCash $\n $\n R6<NumCash ($R6<$NumCash) $\n Перезапустите инсталлятор"
        ${else}
                ;MessageBox MB_OK "На кассовой станции №$R6 $NumCash станций $\n R7=$R7"
                ${NSD_GetText} $Station $Station
                ;${NSD_GetText} $RefServer2 $RefServer2
                ${NSD_GetText} $IPMidSrv $IPMidSrv
               
                ${Station_ar->Write} $R7 "$Station"
                ${Station_ar->Read} $2 $R7
                ${IPMidSrv_ar->Write} $R7 "$IPMidSrv"
                ${IPMidSrv_ar->Read} $3 $R7
                ${NSD_GetText} $2 $2
                ${NSD_GetText} $3 $3
                !insertmacro var_message       
                !insertmacro WinCashIniBat
               
                IntOp $R7 $R7 + 1
        ${endif}
        /*
        ${if} $NumCash
       
       
       
        ${if} $R6 < $NumMid
                Goto FinishTest1
        ${endif}
        */
;;Íå îáÿçàòåëüíî, íî åñëè çàäàòü áóäåò êîííåêòèòüñÿ áûñòðåå, òî æå äëÿ êàññû
;;Èíîãäà íåîáõîäèìî (åñëè íå ïðîõîäÿò broadcast ñîîáùåíèÿ)
;;TEST_RK7SRV=127.0.0.1:3669


        ;MessageBox MB_OK "Внизу Numcash=$Numcash"
        /*
        */
FinishTest1:
FunctionEnd


Форум читал - Ну страниц 50-80, наверное. Интересно:). Не помню, кажется первую часть читал. Некоторые вещи просто сносят крышу и вызывают вопросы "как это работает??", но практически для меня неважны были всё равно.

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

Цитата:

Вопрос: для чего вам 2-ая функция в странице?
В макросах вставленных с длинными именами типа rkeeperini и wincashinibat создаются ини-файлы. А в первой функции они задаются. Нерационально вышло грешу этим, но вышло. Чай, прошли времени 3.5" и 5" дискет, чтобы заморачиваться размером кода Офигенно доволен! Отказался от циклов по совету kotkovets в пользу GoTo (по совету KAV).

K.A.V. 25-10-2013 13:39 2240889

Цитата:

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

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

Цитата:

Цитата alexfinik
У вас способ короче намного, конечно. »

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

Цитата:

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

WinMessage.nsh посмотрите в папке Include, там много интересных команд на управление элементов интерфейса на будущее найдёте для себя ;)

Цитата:

Цитата alexfinik
Офигенно доволен! »

Мы рады, что смогли помочь :up
Если будут вопросы или проблемы с кодом, спрашивайте, не стесняйтесь :)

alexfinik 25-10-2013 13:43 2240894

icq99999999, Вот с таким mod.ini всё работает

Код:

[Setting]
(U)F=Example1
I(D)=Example2
(J)G=Example3

[NETKERN]
;возможные протоколы - nbhdup.dll, SPXSOC.dll
Protocols=.\TCPSOC.dll

[TCPSOC]
LISTEN=0

[TCPDNS]

Цитата:

Цитата K.A.V.
WinMessage.nsh посмотрите в папке Include, там много интересных команд на управление элементов интерфейса на будущее найдёте для себя »

О да, уже оценил какая красота есть внутри *.nsh.

icq99999999 25-10-2013 14:27 2240917

Цитата:

Цитата K.A.V.
Код: »

а если в переменную $1 будет скопировано значение которое придёт в голову пользователя например значение будет "$PROGRAMFILES\не известное значение пришедшее в голову пользователя"
то есть с начало копирую в переменную
ReadINIStr $1 "$exeDIR\mod.ini" "Setting" "(I)D"
потом
MessageBox MB_OK "$1"
как итог будет
сообщение с текстом "$PROGRAMFILES\не известное значение пришедшее в голову пользователя"
нужно
сообщение с текстом: "C:\Program Files\не известное значение пришедшее в голову пользователя"

kotkovets 25-10-2013 14:32 2240919

Цитата:

Цитата icq99999999
сообщение с текстом "$PROGRAMFILES\не известное значение пришедшее в голову пользователя"
нужно
сообщение с текстом: "C:\Program Files\не известное значение пришедшее в голову пользователя" »

мозги, как говорят, подключи:
Код:

MessageBox MB_OK "$PROGRAMFILES\$1"

icq99999999 25-10-2013 15:00 2240936

Цитата:

Цитата kotkovets
Код: »

не знаю пробую объяснит сначала
подхватываю значение
ReadINIStr $0 "$1\mod.ini" "Setting" "(I)Vers"
значение это путь установки который должен показаться в сообщении пользователю
MessageBox MB_OK "$1"
если в ini написано(притом может быть любая переменная nsis($SMPROGRAMS,$APPDATA итд) "$PROGRAMFILES\любой путь"
то нужно определить эту переменную и (любой путь) и отправить в сообщении пользователю
то есть например значение в ini
$PROGRAMFILES\Portable
то определить и отправить сообщение "C:\Program Files\Portable"
если любая друга переменная пример
$APPDATA\имя придуманное пользователем
то определить и отправить сообщение "C:\Users\%username%\AppData\Roaming\имя придуманное пользователем"

K.A.V. 25-10-2013 15:13 2240943

Цитата:

Цитата icq99999999
притом может быть любая переменная nsis($SMPROGRAMS,$APPDATA итд) "$PROGRAMFILES\любой путь" »

Справочник по NSIS => Примеры кодов => Работа со строками => StrRep
Делайте по принципу замены всех возможных переменных в прочитываемой строке, пример:

Код:

${StrRep} $1 "$1" "$$EXEDIR" "$EXEDIR"
${StrRep} $1 "$1" "$$PROGRAMFILES" "$PROGRAMFILES"

И т.д. со всеми переменными

icq99999999 25-10-2013 15:33 2240953

Цитата:

Цитата K.A.V.
Код: »

Спасибо :) !

YoraG 27-10-2013 16:21 2241960

Помогите пожалуйста с Uninstall. Как мне сделать при запуске uninst.exe выдать сообщение с кнопками ОК, Отмена и текстом: "Внимание! Вместе с программой будет удалена ваша база. Продолжить?".

Кажется нужно использовать
MessageBox MB_OKCANCEL "Внимание! Вместе с программой будет удалена ваша база. Продолжить?"
а как не знаю

K.A.V. 27-10-2013 18:53 2242064

Цитата:

Цитата YoraG
Помогите пожалуйста с Uninstall. Как мне сделать при запуске uninst.exe выдать сообщение с кнопками ОК, Отмена и текстом: "Внимание! Вместе с программой будет удалена ваша база. Продолжить?".
Кажется нужно использовать
MessageBox MB_OKCANCEL "Внимание! Вместе с программой будет удалена ваша база. Продолжить?"
а как не знаю »

Уважаемый, будьте так любезны начать изучение NSIS с нашего Справочника по NSIS
А конкретно по вашему вопросу, в справочнике смотреть по пути: Справочник по NSIS => Перевод справки NSIS => MessageBox

Приходите с хорошим настроением и с прочитанными страничками нашего справочника :)

Awral 27-10-2013 22:51 2242170

Как правильно расширить изображение в шапке инсталлятора на всю ширину?

kotkovets 27-10-2013 23:39 2242199

Цитата:

Цитата Awral
Как правильно расширить изображение в шапке инсталлятора на всю ширину? »

Можно так, рядом со скриптом положить p.bmp размером 497х57 :
читать дальше »
Код:

!include "MUI2.nsh"

OutFile "Test.exe"
InstallDir "$EXEDIR"

!define MUI_HEADER_TRANSPARENT_TEXT
  !define MUI_CUSTOMFUNCTION_GUIINIT GUIInit
!define MUI_UI_HEADERIMAGE_RIGHT

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_LANGUAGE English

Function GUIInit
  InitPluginsDir
  File '/ONAME=$PLUGINSDIR\heder.bmp' 'p.bmp'
  System::Call 'user32::CreateWindowEx(i, t"STATIC", t, i${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE},i,i,i,i,i$HWNDPARENT,i1500,i,i)i.R1'
  System::Call 'user32::SetWindowPos(iR1,i,i,i,i,i,i2)'
  ${NSD_SetImage} $R1 "$PLUGINSDIR\heder.bmp" $R0
  GetDlgItem $R0 $HWNDPARENT 1034
  SetCtlColors $R0 "" transparent
  GetDlgItem $R0 $HWNDPARENT 1039
  System::Call 'user32::DestroyWindow(iR0)'
FunctionEnd

Section
SectionEnd


alexfinik 28-10-2013 19:00 2242725

Друзья, а как можно ли определить номер объекта, создаваемого с помощью
Код:

${NSD_CreateText} 0 50u 100% 13u ""
Pop $Text

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

GetDlgItem $2 $HWNDPARENT НомерОбъекта$Text
SendMessage $Text2 ${WM_SETTEXT} 0 "STR:$6"

$6 получается с помощью клика по кнопке, выполняющей функцию, включающую следующую строку:
Код:

${OpenBox} "Search for a ZIP file" "Zip-file (*.zip)|*.zip||" 1 "$EXEDIR" 3 ${VAR_6}

kotkovets 28-10-2013 19:23 2242742

Цитата:

Цитата alexfinik
Друзья, а как можно ли определить номер объекта, создаваемого с помощью
Код:
${NSD_CreateText} 0 50u 100% 13u ""
Pop $Text
Хотелось бы сделать примерно так:
Код:
GetDlgItem $2 $HWNDPARENT НомерОбъекта$Text
SendMessage $Text2 ${WM_SETTEXT} 0 "STR:$6" »

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

${NSD_SetText} $Text "test"
или прочитать с диалога.. м?
Код:

${NSD_GetText} $Text $6
в переменной $6 - текст диалога

alexfinik 28-10-2013 19:25 2242745

Цитата:

Цитата kotkovets
что за глупости вам то, что нужно текст поместить в диалог..? так:
Код:
${NSD_SetText} $Text "test" »

О! Целый день искал! Мерси огромное!!!

alexfinik 29-10-2013 00:56 2242932

1) Dозможно ли сгенерировать exe-файл на борту. Т.е. есть ли возможность включения встроенного компилятора NSIS в скрипт?
2) Правильно ли я понимаю, что жесткие ссылки можно создавать только из UnTGZ_plug-in?

K.A.V. 29-10-2013 11:03 2243072

Цитата:

Цитата alexfinik
1) Dозможно ли сгенерировать exe-файл на борту. Т.е. есть ли возможность включения встроенного компилятора NSIS в скрипт? »

Таскайте за собой дистрибутив NSIS, "натравливаете" nsi-файл скрипт на makensis.exe и исходник будет компилироваться

Суть вопроса насчет 2-го пункта не понял

alexfinik 29-10-2013 12:27 2243144

K.A.V.
1) Спасибо. Ну думаю, овчинка выделки не стоит тогда. Неудобно будет.
2) тут вопрос знаете ли вы что такое жесткие ссылки. Если нет, то это файлы, которые расположены в разных местах диска, но физически занимают одну и ту же область диска. И меняя один - у меня, конечно, меняется и другой.
Хотя вопрос отменяю. Только что сообразил, что fat-флешка поддерживать не будет эту систему всё равно. Т.е. на занимаемом месте сэкономить не получится.

icq99999999 29-10-2013 15:06 2243256

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

alexfinik 29-10-2013 16:46 2243328

Цитата:

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

Код:

inetc::get "http://file.file" "$INSTDIR\file.file"
Это про скачать.

IfFileExist - это для если файла нет

alexfinik 29-10-2013 18:59 2243404

Кстати, присоединяюсь к вопросу насчёт скачать. У меня inetc выдает ошибку в win7 и Win embedded, а inetload в unicode NSIS не работает. Читал на другом форуме про wget еще.
Что можно использовать для скачивания ftp с авторизацией, в принципе. Я где-то задавал тут вопрос, но почему-то не смог найти это сообщение...

kotkovets 29-10-2013 19:34 2243416

Цитата:

Цитата icq99999999
перед скачиванием спросить у пользователя качать или нет
если файла на сервере не существует или нет подключения к сети: выключить программу »

http://forum.oszone.net/thread-67386-219.html

Цитата:

Цитата alexfinik
Кстати, присоединяюсь к вопросу насчёт скачать. »

к разрабам плагинов..
Цитата:

Цитата alexfinik
Читал на другом форуме про wget еще »

ну так поищите примеры использования ( командную строку) wget и запускайте через nsis (Exec, ExecWait) или nsExec

alexfinik 29-10-2013 19:59 2243426

Цитата:

Цитата kotkovets
к разрабам плагинов.. »

Уже. Согласен, не сюда.
Цитата:

Цитата kotkovets
ну так поищите примеры использования ( командную строку) wget и запускайте через nsis (Exec, ExecWait) или nsExec »

Проблема в том, что инсталлятор предназначен для запуска "в поле", т.е. где, вероятно, вообще нет никакого софта. Т.е. такой вариант не годится. Видимо других вариантов не придумано. Ладно, мерси.

MKN 29-10-2013 20:37 2243440

Цитата:

Цитата alexfinik
Видимо других вариантов не придумано. »

Вполне нормальный плагин inetc ... ( http://nsis.sourceforge.net/Inetc_plug-in )
Вот, только что скачал DrWeb согласно кода :
Код:

OutFile "inetc-test.exe"

Section "Downloading"
  DetailPrint "Downloading drweb-800-win.exe !"
  inetc::get /caption "Downloading drweb-800-win.exe ..." /nocancel "http://ftp.drweb.com/pub/drweb/windows/8.0/drweb-800-win.exe" "$TEMP\drweb-800-win.exe" /end
  Pop $0
  StrCmp $0 "OK" dlok
  DetailPrint "$0"
  MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to abort installation" /SD IDOK
  Abort
dlok:
SectionEnd

Section
MessageBox MB_OK "Загрузка завершена успешно !"
SectionEnd

А если надо поизвращаться с паролями, то это типа такого :
Код:

inetc::get "ftp://myuser:mypass@mywebserver.com/public_html/pft/_public_/update/upd_App.exe" "$EXEDIR\setup.exe" /end

kotkovets 29-10-2013 21:56 2243477

Цитата:

Цитата alexfinik
для запуска "в поле", т.е. где, вероятно, вообще нет никакого софта. Т.е. такой вариант не годится »

таскайте с собой wget "внутри" установщика..

alexfinik 30-10-2013 12:08 2243742

Цитата:

Цитата MKN
inetc::get "ftp://myuser:mypass@mywebserver.com/public_html/pft/_public_/update/upd_App.exe" "$EXEDIR\setup.exe" /end »

Да уже сделал так - ошибка в user32.dll, но это не сюда, как я уже сказал.

K.A.V. 30-10-2013 12:20 2243745

InetLoad plug-in не пробовали?
Не знаю, как он работает по подключениям с паролями, но насчет скачки с ним проблем никогда не было (по крайней мере у меня), в своём SFX Creator я именно этим плагином произвожу обновление изменённых файлов

MKN 30-10-2013 13:25 2243790

Цитата:

Цитата alexfinik
ошибка в user32.dll, но это не сюда, как я уже сказал »

Ну, не знаю... У винамповского именитого модера так работает. Там же сказано , что в плагине нет никакой ошибке, но в имени пользователя нельзя использовать @
http://forums.winamp.com/showthread.php?t=346710

Aster 30-10-2013 13:49 2243811

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

alexfinik 30-10-2013 13:51 2243815

Цитата:

Цитата K.A.V.
InetLoad plug-in не пробовали?
Не знаю, как он работает по подключениям с паролями, но насчет скачки с ним проблем никогда не было (по крайней мере у меня), в своём SFX Creator я именно этим плагином произвожу обновление изменённых файлов »

В unicode-версии не работает... Может имеет смысл работать с кодировкой в обычной версии и забить на Unicode уже...

Цитата:

Цитата Aster
Всем привет. Ребят, может кто знает почему на некоторых операционках инсталлер НСИС выглядит вот так как ниже на скрине? А именно увеличивается площадь инсталлятора, из-за чего обрезается картинка и выглядит обрезанной по правому краю и снизу. »

Сейчас тем же занимаюсь прям все вопросы задают как у меня Пока обнаружил, что если меняю картинку nsis.bmp хоть как-то - сразу становится там пустое место... Интересно, это почему так? Специально задумано? Опять же про крайний Unicode NSIS говорю. На форуме искал только (во второй части) - не нашел. Может плохо искал...
Разбирал примеры всякие - если там меняю nsis.bmp - та же фигня.

P.S. Где можно найти просто море *.nsi, кроме как в дистрибутиве?

Aster 30-10-2013 14:26 2243830

alexfinik, а я наоборот думал что у меня вопросы специфические и никого кроме меня не интересуют :).

Что-то я не совсем понял, а если не менять nsis.bmp, то всё ОК?)
Я так понимаю Вы сами эту проблему видите, подскажите, пожалуйста, а как себя ведёт картинка приветствия/финиша установки? Там тоже подобная обрезятина происходит? Мне просто скрин прислали пользователи и сам я не могу проверить. А также хотелось бы узнать на какой конкретно версии Винды происходит эта проблема?

vahe-91 30-10-2013 14:45 2243844

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

K.A.V. 30-10-2013 16:16 2243903

Цитата:

Цитата Aster
Всем привет. Ребят, может кто знает почему на некоторых операционках инсталлер НСИС выглядит вот так как ниже на скрине? А именно увеличивается площадь инсталлятора, из-за чего обрезается картинка и выглядит обрезанной по правому краю и снизу. »

Может, настройка DPI у пользователя отличается от стандартной?

alexfinik 30-10-2013 16:44 2243946

Вложений: 1
Цитата:

Цитата K.A.V.
Может, настройка DPI у пользователя отличается от стандартной? »

А что, очень важно, чтобы dpi был такой же?
Я открывал картинку в Gimp, просто мазал кистью и пересохранял - получалось белое пятно вместо картинки в установщике.
Пробовал с другим файлом изменить ppi на 72px, как в оригинале - не помогло

71,9836 × 71,9836 ppi у оригинала...

Цитата:

Цитата Aster
Что-то я не совсем понял, а если не менять nsis.bmp, то всё ОК?) »

Ну по итогам моих опытов - да. Попробуйте на любой рабочей программе возьмите стандартный nsis.bmp и nsis.ico и измененный.

Цитата:

Цитата vahe-91
Aster, левые или правые концы заводских картинок NSIS заканчиваются белым, поэтому такого с заводскими картинками не наблюдается... »

Вы уверены? Вот у меня по этому адресу есть влоэженный файл. Накалякал я только в центре.
C:\Program Files (x86)\NSIS\Unicode\Contrib\Graphics\Header\nsis.bmp
Файл 106021

Желающие попробовать, скопируйте оригинал nsis.bmp и положите в соотв. папку мой файл... Может кто скажет в чем ошибка?..

alexfinik 30-10-2013 16:57 2243962

тут 72 × 72 ppi. Изменил на 71,984 × 71,984 ppi - не помогло. Сменил на индексированный 256 цветов - не помогло. У оригинала, однако 71,9836 × 71,9836 ppi, но в Gimp такая мелочь не выставляется:))

Aster, Такая фигня на протяжении всего установщика. У меня win7 x64, но сомневаюсь, что это от винды зависит...

K.A.V. 30-10-2013 17:02 2243969

Вложений: 1
Цитата:

Цитата alexfinik
А что, очень важно, чтобы dpi был такой же? »

Я говорил про изменение размеров интерфейса у некоторых установщиков/программ, из-за пользовательской настройки "точек на дюйм" в системе

MKN 30-10-2013 17:26 2243999

Интересует такой вопрос : каким образом поместить-вписать в созданное произвольное окно на кастомной странице - окно, принадлежащее другому процессу ( любому запущенному стороннему приложению ) ? Чтобы выглядело , как уже реализовано для NSIS, при помещении в окно кастомной страницы - окна WEB браузера или флеш анимации.
Предполагается запуск приложения из самого скрипта.

alexfinik 30-10-2013 18:54 2244058

Limonica, Это для кнопки Next 1. Для Back, вроде 2. 3 - надпись между кнопками (ее только изменить можно и не этими операторами)


Код:

GetDlgItem $0 $HWNDPARENT 1
SendMessage $0 ${BM_CLICK} 0 0

Цитата:

Цитата K.A.V.
Я говорил про изменение размеров интерфейса у некоторых установщиков/программ, из-за пользовательской настройки "точек на дюйм" в системе »

Хм. Ну я в одной и той же системе проверял 2 этих файла.
Что примечательно, с другими *.bmp из стандартной папки, всё работает.

Aster 31-10-2013 04:56 2244339

Цитата:

Цитата alexfinik
Хм. Ну я в одной и той же системе проверял 2 этих файла.
Что примечательно, с другими *.bmp из стандартной папки, всё работает. »

Не могли бы сделать скрин, где всё работает? Хотелось бы посмотреть как в рабочем виде выглядит.


Цитата:

Цитата K.A.V.
Может, настройка DPI у пользователя отличается от стандартной? »

Спасибо. Да, скорее всего Вы правы, видимо из-за этих настроек площадь инсталлера расширяется. Что-нибудь можно с этим сделать? Как-нибудь заставить инсталлер игнорировать пользовательские настройки DPI, чтобы инсталл запускался в стандартном размере. Или это из области фантастики?

K.A.V. 31-10-2013 08:08 2244366

Цитата:

Цитата Aster
Как-нибудь заставить инсталлер игнорировать пользовательские настройки DPI, чтобы инсталл запускался в стандартном размере. Или это из области фантастики? »

Вроде как в 3.0 Alpha 0 ввели команду ManifestDPIAware, которая должна помочь, можете проверить, сам не тестировал

alexfinik 31-10-2013 14:46 2244590

Вложений: 1
Aster, красным обозначено то, что работает. Черным - измененный рисунок

Ниже - простейший код, где показывается или НЕ показывается изображение слева.
Значок слева наверху у вас отсутствует из-за измененного или отсутствующего значка (это оценочное суждение, только предполагаю) в папка ../icons (относительно Header). По-видимому отсутствует или изменен файл modern-install.ico
http://forum.oszone.net/attachment.p...1&d=1383215681

Код:

!include MUI2.nsh


Name "nsDialogs Example"
OutFile "nsDialogs Example.exe"

XPStyle on

!define MUI_HEADERIMAGE
 !define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
 !insertmacro MUI_LANGUAGE "Russian"
 !insertmacro MUI_PAGE_INIT

Section
SectionEnd


alexfinik 31-10-2013 14:47 2244594

Цитата:

Цитата K.A.V.
Цитата Aster:
Как-нибудь заставить инсталлер игнорировать пользовательские настройки DPI, чтобы инсталл запускался в стандартном размере. Или это из области фантастики? »
Вроде как в 3.0 Alpha 0 ввели команду ManifestDPIAware, которая должна помочь, можете проверить, сам не тестировал »

Да вроде ж не в этом дело-то? Ведь с одним рисунком всё есть, а с измененным - нет ничего...

MKN 31-10-2013 17:23 2244741

Определяем букву CD/DVD привода и есть ли в нём диск.

Букву дисков можно конечно определить с помощью штатной команды GetDrives, но и этот код может пригодиться :
Код:

OutFile "GetCDVolume.exe"

Section
Push $0
Push $1
Push $2
Push $3
; Выделяем блок памяти для определения максимальной  длины строковой переменной
System::Alloc ${NSIS_MAX_STRLEN}
Pop $3

; GetLogicalDriveStringsA - Определяет все диски ( заполняет буфер строками, которые определяют действительные устройства в системе )
System::Call 'kernel32::GetLogicalDriveStringsA(i, i) i(${NSIS_MAX_STRLEN}, r3)'
Loop:
; Функция lstrlenA возвращает длину строки в символах по указателю.
; Именно lstrlenA используется для строк в формате ANSI. Используем эту функцию для получения длины строки.
System::Call 'kernel32::lstrlenA(t) i(i r3) .r2'
IntCmp $2 0 End

/*GetDriveTypeA - получение информации о типе диска
DRIVE_UNKNOWN - 0    Тип устройства не может быть определен.
DRIVE_NO_ROOT_DIR - 1  Корневой путь недопустим; например нет никаких томов, смонтированных по указанному пути.
DRIVE_REMOVABLE - 2    Удаляемые медиаустройства, например, флоппи-диск или съёмный жесткий диск.
DRIVE_FIXED - 3  Устройства , которые не могут быть удалены, например, фиксированный жесткий диск.
DRIVE_REMOTE - 4  удаленное (сетевое) устройство
DRIVE_CDROM - 5  устройство CD/DVD - ROM
DRIVE_RAMDISK - 6  RAM диск*/

System::Call 'kernel32::GetDriveTypeA(t) i(i r3) .r1'
StrCmp $1 5 0 Next ; проверка наличия диска

; получаем информацию о доступном месте на диске
System::Call 'kernel32::GetDiskFreeSpaceExA(t, *l, *l, *l) i(i r3, 0, .r1, 0)'
StrCmp $1 0 +3
StrCpy $1 "Диск в приводе"
Goto +2
StrCpy $1 "В приводе НЕТ диска"
System::Call '*$3(&t${NSIS_MAX_STRLEN} .r0)' ; буква(путь) диска

MessageBox MB_OK|MB_TOPMOST "Буква диска : $0    Состояние привода : $1 "
Next:
IntOp $3 $3 + $2
IntOp $3 $3 + 1
Goto Loop
End:
System::Free $3
Pop $3
Pop $2
Pop $1
Pop $0
SectionEnd


Aster 31-10-2013 18:20 2244806

Цитата:

Цитата K.A.V.
Вроде как в 3.0 Alpha 0 ввели команду ManifestDPIAware, которая должна помочь, можете проверить, сам не тестировал »

А есть ли примеры для это команды? В каком виде в скрипте её прописывать?
Я думаю эта информация потом и для справочника NSIS будет полезна.

Цитата:

Цитата alexfinik
Да вроде ж не в этом дело-то? Ведь с одним рисунком всё есть, а с измененным - нет ничего... »

У меня простая логика. Если размер интерфейса инсталлера не будет расширяться и запустится в стандартном размере, то и с картинками всё будет нормально. Я показал скрин, где масштаб окон установщика увеличился. Вот и я хочу чтобы у всех и независимо ни от чего мой инсталлер запускался в родном размере. А кроме как эти самые настройки DPI, не вижу других причин почему размер установщика расширяется.

kotkovets 31-10-2013 19:20 2244872

4.8.1.29 ManifestDPIAware
notset|true|false
---
начиная от версии 3.0 Alpha 0
пишется вне секции и функции
---
это команда масштабирует только текст (элементы диалога), что бы текст не размывался, при изменении DPI
т.е к растровое изображение не масштабирует..
так гласит справка..

alexfinik 01-11-2013 13:38 2245359

Цитата:

Цитата Aster
У меня простая логика. Если размер интерфейса инсталлера не будет расширяться и запустится в стандартном размере, то и с картинками всё будет нормально. Я показал скрин, где масштаб окон установщика увеличился. Вот и я хочу чтобы у всех и независимо ни от чего мой инсталлер запускался в родном размере. А кроме как эти самые настройки DPI, не вижу других причин почему размер установщика расширяется. »

Логика логикой, а установили бы себе NSIS и попробовали. Это пять минут.
1. Ставите
2. Запускаете хотя бы и мой пример, указанный выше (сохраняя файл в *.nsi).
3. Можно изменить картинку по указанному пути, можно взять указанную мной и положить ее по указанному пути.

Salmo 02-11-2013 13:48 2246026

Уважаемые! Определяю наличие главного окна программы через FindWindow. Есть ли возможность найти дочерние окна по типу\названию и определить HWND и, очень важно, - видимое оно, в данный момент, или нет?

MKN 02-11-2013 14:42 2246052

Цитата:

Цитата Salmo
видимое оно, в данный момент, или нет? »

Код:

StrCpy $0 "hwnd"
System::Call "user32::IsWindowVisible(i r0)i.r0"
# $0 here is non-zero if the window is visible.

Цитата:

Цитата Salmo
найти дочерние окна по типу\названию и определить HWND »

попробуй через EnumChildWindow (в доке есть код )
или EnhancedFindWindow

Вот код, перечислит все видимые окна :
Код:

!include LogicLib.nsh
showinstdetails show
outfile wind.exe
Section
System::Get "(i.r1) iss"
Pop $R0
System::Call "user32::EnumWindows(k R0,i) i.s"
loop:
    Pop $0
    StrCmp $0 "callback1" 0 done
    System::Call "user32::IsWindowVisible(ir1)i.r2"
    ${If} $2 <> 0
        System::Call "user32::GetWindowText(ir1,t.r2,i${NSIS_MAX_STRLEN})"
        System::Call "user32::GetClassName(ir1,t.r3,i${NSIS_MAX_STRLEN})"
        IntFmt $1 "0x%X" $1
        DetailPrint "$1 - [$3] $2"
    ${EndIf}
    Push 1 # callback's return value
    System::Call "$R0"
    Goto loop
done:
System::Free $R0
Sectionend


Salmo 02-11-2013 22:42 2246322

MKN, Спасибо! Обошелся поиском всех видимых окон и последующей фильтрацией... Как всегда, что-нибудь упустишь! Нужно еще определить размер окна и его расположение на мониторе...

MKN 03-11-2013 09:53 2246454

Цитата:

Цитата Salmo
Нужно еще определить размер окна и его расположение на мониторе... »

И это уже было в доках...
Код:

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

; Create RECT struct
        System::Call "*${stRECT} .r1"
; Find Window info for the window we're displaying
        System::Call "User32::GetWindowRect(i, i) i ($HWNDPARENT, r1) .r2"

Если ещё конкретней, то как то так :

Код:

OutFile Rect_test.exe

Section
Push $R0
System::Call /NOUNLOAD "*(i, i, i, i) i.s"
Pop $R0
System::Call /NOUNLOAD 'User32::GetWindowRect(i, i) i ($HWNDPARENT, R0)'
System::Call /NOUNLOAD "*$R0(i .s, i .s, i .s, i .s)"
Pop $0 ;left
Pop $1 ;top
Pop $2 ;right
Pop $3 ;bottom
Messagebox mb_ok "$$0:$0 $$1:$1 $$2:$2 $$3:$3"
SectionEnd

А ещё есть функция GetWindowInfo с хорошими примерами : http://nsis.sourceforge.net/GetWindowInfo

Salmo 03-11-2013 14:11 2246555

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

А можно заставить окно инсталлятора открываться не в центре экрана, а по координатам, которые я укажу в той же системе, что и в вашем примере выше?

MKN 03-11-2013 15:14 2246588

Цитата:

Цитата Salmo
А можно заставить окно инсталлятора открываться не в центре экрана, а по координатам, которые я укажу »

И про это уже было...
Код:

!include "MUI2.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT Welcome
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

OutFile RepositionWindow_test.exe

!define stRECT "(i, i, i, i) i"
!define SPI_GETWORKAREA            0x0030

Function Welcome

; Создать 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

Section
SectionEnd

Цитата:

Цитата Salmo
Я не лентяй »

Хмм... Шутка ? :)

Salmo 03-11-2013 18:25 2246674

Цитата:

Цитата MKN
Хмм... Шутка ? »

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

diakov 04-11-2013 22:09 2247445

kotkovets, подскажите пожалуйста как такой батник выполнить командами nsis:
Код:

@Echo Off
color 1e
Title “Обновление Microsoft Office 2013
::“Обновление Microsoft Office 2013
set "path=%SystemRoot%;%SystemRoot%\system32;%SystemRoot%\system32\wbem"
reg export HKLM\Software\Policies\Microsoft\Windows\Installer "%temp%\installer.reg"
reg add HKLM\Software\Policies\Microsoft\Windows\Installer /v MaxPatchCacheSize /t REG_DWORD /d 0 /f
net stop msiserver
cls
for /f %%i in ('dir /b /O-s Updates\*.msp') do (Call :SetupUpd %%i)
:SetupUpd
echo “Обновление        %1
Updates\%1 /qn /norestart
GoTo :EOF


kotkovets 05-11-2013 00:59 2247548

Цитата:

Цитата diakov
подскажите пожалуйста как такой батник выполнить командами nsis: »

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

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

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

ShowInstDetails show
outfile nets.exe

Section
    SetDetailsPrint textonly
    DetailPrint "Обновление Microsoft Office 2013"
    SetDetailsPrint none
    IfFileExists "$TEMP\installer.reg" 0 +2
    Delete "$TEMP\installer.reg"
    SetDetailsPrint listonly
    nsExec::Exec 'reg export HKLM\Software\Policies\Microsoft\Windows\Installer "$TEMP\installer.reg"'
    Pop $0
    nsExec::Exec 'reg add HKLM\Software\Policies\Microsoft\Windows\Installer /v MaxPatchCacheSize /t REG_DWORD /d 0 /f'
    Pop $0
    nsExec::Exec 'net stop msiserver'
    Pop $0
    StrCmp $0 2 0 +3
    MessageBox MB_OK "$0 Служба не запущена или хз" IDOK
    Abort
    SetDetailsPrint none
    ${Locate} "Путь к папке\Updates" "/L=F /M=*.msp /G=0" Updates
   
    SetDetailsPrint both
SectionEnd

Function Updates
  SetDetailsPrint textonly
  DetailPrint "Обновление Microsoft Office 2013"
  SetDetailsPrint listonly
  DetailPrint "Обновление $R7"
 
    ExecWait 'msiexec /i "$R9" /norestart /qn' $R1
   
    ;dumpstate::debug
  Push $0
FunctionEnd


Насчет команды запуска *.msp файлов на примере msi
Код:

ExecWait 'msiexec /i "$R9" /norestart /qn' $R1
В $R9 - путь к файлу\*.msp
В общем допиливайте опытным путем до рабочего состояния - примерно так...
---
p.s
и в конце предложите перезагрузиться..

Limonica 05-11-2013 01:33 2247556

kotkovets, пересматриваю ваш код по установке устройств, но есть странная особенность установка\обновление идет только в том случае если устройство уже установленно, если же оно не установленно ничего не происходит. Тестировался нижеследущий код XP Professional - все ок, XP Home - установка не проходит, в чем может быть проблема, непонятно, буду благодарен если посмотрите...

Код:

!define ERROR_NO_SUCH_DEVINST      -536870389
!define SPOST_NONE                  0
!define SPOST_PATH                  1
!define SPOST_URL                  2
!define SP_COPY_DELETESOURCE        0x1
!define SP_COPY_REPLACEONLY        0x2
!define SP_COPY_NOOVERWRITE        0x8
!define SP_COPY_OEMINF_CATALOG_ONLY 0x40000
!define CM_LOCATE_DEVNODE_NORMAL    0x00000000
!define CM_REENUMERATE_NORMAL      0
!define InstallDriver              "!insertmacro InstallDriverCall"
 
!include "logiclib.nsh"
 
 
!macro InstallDriverCall HID INFPATH INFDIR
 
    System::Store S
      Push "${INFDIR}"
      Push "${INFPATH}"
      Push "${HID}"
 
      DetailPrint "Rescan drivers..."
 
      System::Call "cfgmgr32::CM_Locate_DevNode(*i.r0, n, i${CM_LOCATE_DEVNODE_NORMAL}) i.r1"
 
      ${If} $1 <> 0
 
        StrCpy $1 1
 
      ${Else}
 
          System::Call "cfgmgr32::CM_Reenumerate_DevNode (ir0, i${CM_REENUMERATE_NORMAL}) i.r1"
 
        ${IfThen} $1 <> 0 ${|}StrCpy $1 2${|}
 
      ${EndIf}
 
      ${If} $1 = 0
 
          DetailPrint "Installing the driver..."
 
          System::Call "newdev::UpdateDriverForPlugAndPlayDevices(i0, ts, tss, i0, *i0)?ei.s"
 
        Pop $0
 
        IntCmp $0 ${ERROR_NO_SUCH_DEVINST} 0 +2 +2
 
        DetailPrint "The device is not plugged in, cannot update the driver."
 
        ${If} $0 = 0
 
              System::Call "setupapi::SetupCopyOEMInf(ts, ts, i${SPOST_PATH}, i0, i0, i0, *i0, tn)i.r0"
 
              IntCmp $0 1 0 +2 +2
 
              DetailPrint "Istall driver success!"
 
              IntCmp $0 0 0 +2 +2
 
              DetailPrint "Istall driver error!"
 
        ${EndIf}
 
    ${ElseIf} $1 = 1
 
          DetailPrint "An error occurred while trying to get the device instance for the machine"
 
    ${ElseIf} $1 = 2
 
          DetailPrint "An error occurred while trying to refresh the device list"
 
    ${EndIf}
 
    System::Store L
 
!macroend
 
 
 
OutFile InstDrv.exe
 
ShowInstDetails show
 
 
 
Section
 
  # ${InstallDriver} "HWID" "путь к inf файлу" "папка с дровами"
 
  ${InstallDriver} "ROOT\RDPDR" "$WINDIR\inf\machine.inf" "$WINDIR\inf"
 
SectionEnd


diakov 05-11-2013 09:38 2247673

kotkovets, спаибо большое, и еще один вопрос, в справке сказано о команде nsExec::Exec для скрытного запуска консольных утилит, cmd и bat файлов, так вот можно запустить cmd файл, но только в видимом режиме и с невозможностью закрытия окна консоли, то есть что бы окно закрывалось уже когда батник завершит все свои дела. Можно воспользоваться ExecShell "open", но тогда как решить проблему невозможности закрытия окна cmd до завершения процесса?

K.A.V. 05-11-2013 10:15 2247687

Цитата:

Цитата diakov
Можно воспользоваться ExecShell "open" »

Можно, а нужно ли? Если у пользователя будут сбиты ассоциации, то команда не сработает...Чем вам не угодил nsExec?

Цитата:

Цитата diakov
но тогда как решить проблему невозможности закрытия окна cmd до завершения процесса? »

Скрыть окно? FindWindow + ShowWindow

Код:

ShowWindow $HWND 0
; $HWND - дескриптор cmd окна, узнаётся через FindWindow
; 0 - скрыть, 1 - показать окно

Описание команды FindWindow есть в справочнике

Salmo 05-11-2013 12:06 2247756

Добрый день. Как отключить функцию перетаскивания для окна инсталлятора?

kotkovets 05-11-2013 14:49 2247887

Цитата:

Цитата diakov
но тогда как решить проблему невозможности закрытия окна cmd до завершения процесса? »

Я себе делаю так, запуск скрытно все, что можно, с ожиданием:
Код:

Outfile ostart_.exe

!define hideexec "!insertmacro func_hideexec"
!macro func_hideexec exehide
      System::Store S
      System::Alloc 72
      Pop $2
      System::Call "*$2(i72,i,i,i,i,i,i,i,i,i,i,i3)"
      System::Call "*(i,i,i,i)i.r3"
      System::Call 'kernel32::CreateProcess(i0,t"${exehide}",i0,i0,i0,i0,i0,i0,ir2,ir3)i.r4'
        System::Call "*$3(i.r1)"
        System::Call "kernel32::WaitForSingleObject(ir1, i-1)"
      System::Call "kernel32::CloseHandle(ir4)"
      System::Free $2
      System::Free $3
      System::Store L
!macroend

Section
  ${hideexec} "C:\123.bat"
SectionEnd

В батнике можно прописать в конце exit или прибивать в конце cmd

Limonica 05-11-2013 16:43 2247954

kotkovets, http://forum.oszone.net/post-2247556-700.html

MKN 05-11-2013 17:36 2247985

Цитата:

Цитата Salmo
Как отключить функцию перетаскивания для окна инсталлятора? »

Здесь есть решение :
http://forum.codenet.ru/q72348/Как+з...#answer_379693
Но не для NSIS...

kotkovets 05-11-2013 19:17 2248049

Цитата:

Тестировался нижеследущий код XP Professional - все ок, XP Home - установка не проходит, в чем может быть проблема, непонятно, буду благодарен если посмотрите...
Limonica че там тестировать в кастрированом Home, есть утилика DPInst
для установки драйверов.. изучайте ключи запуска - в сети туча примеров - DPInst /?
Цитата:

Цитата Salmo
Как отключить функцию перетаскивания для окна инсталлятора »

скорее штатными средствами врятли легко реализуемо..

Salmo 05-11-2013 22:43 2248171

Цитата:

Цитата MKN
Здесь есть решение :
Но не для NSIS... »

Спасибо, но...

Цитата:

Цитата kotkovets
скорее штатными средствами врятли легко реализуемо.. »

Первый вопрос задал, на который не получил ответа: "писалось раньше" :) , а жаль...

Limonica 06-11-2013 01:30 2248248

kotkovets, задача установить драйвер без посторонних ехе, в исходниках devcon указанно:
cmdUpdate

This command shows how to use UpdateDriverForPlugAndPlayDevices to update the driver for all devices to a specific driver. Normally INSTALLFLAG_FORCE would not be specified allowing UpdateDriverForPlugAndPlayDevices to determine if there is a better match already known. It's specified in DevCon to allow DevCon to be used more effectively as a debugging/testing tool. This cannot be done on a remote machine or in the context of Wow64.

cmdInstall

A variation of cmdUpdate to install a driver when there is no associated hardware. It creates a new root-enumerated device instance and associates it with a made up hardware ID specified on the command line (which should correspond to a hardware ID in the INF). This cannot be done on a remote machine or in the context of Wow64.

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


http://code.msdn.microsoft.com/windo...ample-4e95d71c

MKN 06-11-2013 08:55 2248335

Цитата:

Цитата Salmo
Первый вопрос задал, на который не получил ответа: "писалось раньше" »

Ответ то есть. Осталась самая "малость" - интерпретировать его в NSIS... :) Это мутная работа для программистов, причём цель весьма сомнительной полезности...
И в сети ранее уже "писалось" :) по поводу перетаскивания - должно перестать действовать, если удалить заголовок окна. Но есть "но" - этот способ работает не на всех окнах и по сути не оч корректный... Пробуй...

Limonica,
Для установки драйверов для одной не новой программы, есть хедер... Кстати код похож, на тот, что и у kotkovets
Если ещё есть интерес , выложу. Хотя DPInst - лучший вариант.

YoraG 06-11-2013 10:58 2248376

Как переименовать файл ffg.exe в ffg_old.exe перед установкой
Пишу
Цитата:

Section # "Файлы программы"
...
IfFileExists "$INSTDIR\ffg.exe" 0 +2
Rename $INSTDIR\ffg.exe $INSTDIR\ffg_old.exe
...
но выходит сначала устанавливает а потом переименовывает

Подскажите куда нужно поместить этот код

alexfinik 06-11-2013 13:55 2248466

YoraG, А смысл? Сформулируйте цель. Что мешает сделать файл сразу ffg_old.exe?
Могу предложить создать некоторый файл, в который будет класться информация с некоторым индексом i, который будет каждый раз меняться при запуске файла.
Ну т.е. есть файл index.ini. При первом запуске его нет и он создается, после чего туда записывается цифра 1. Содержимое строки падает в переменную $R0. Файл в конце переименовывается в
Код:

Rename $INSTDIR\ffg.exe $INSTDIR\ffg_old($R0).exe

Limonica 06-11-2013 14:40 2248490

MKN, выложи пожалуйста, интересно будет посмотреть...

Salmo 06-11-2013 14:52 2248496

Цитата:

Цитата MKN
по поводу перетаскивания - должно перестать действовать, если удалить заголовок окна. Но есть "но" - этот способ работает не на всех окнах и по сути не оч корректный... Пробуй... »

Добрый день. Эта мысль мне пришла в голову до вашего комментария, видимо в ней (в голове) еще есть место :) и уже реализована в коде ( спасибо K.A.V.) Мне нужна эта возможность не для всех окон, а только для инсталлятора, так что о корректности можно не думать... Осталось опробовать. Спасибо за отклик!

MKN 06-11-2013 15:15 2248505

Цитата:

Цитата Salmo
и уже реализована в коде ( спасибо K.A.V.) »

Выложи пожалуйста это решение для всеобщего обозрения.

Хедер установки драйверов :

K.A.V. 06-11-2013 15:29 2248511

Цитата:

Цитата MKN
Выложи пожалуйста это решение для всеобщего обозрения. »

Там нет ничего сверхъестественного...
Открываешь EXE с ресурсами диалогов (modern.exe), переходишь в диалог "105", удаляешь стили окна: WS_CAPTION и WS_SYSMENU
По вкусу, можно добавить другие стили окна, для придания некой формы, например добавить WS_THICKFRAME для толстой рамки или WS_BORDER с тонкой...Инфы в гугле много по стилям окон WS_*

MKN 06-11-2013 15:38 2248521

K.A.V.,
Нее... Это как то в лоб и не по NSIS_совски... :) А ежели кодом, то это как ?

K.A.V. 06-11-2013 15:44 2248527

Цитата:

Цитата MKN
не по NSIS_совски... »

Некоторые коды, которые мы уже здесь разбирали тоже "не по NSIS_совски", но всё же ими пользуются

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

MKN 06-11-2013 15:51 2248532

Цитата:

Цитата K.A.V.
Скажи мне, в чем разница, что ты вырежишь стили окон из EXE, что ты вызовишь API функцию, которая это сделает при инициализации граф. интерфейса? »

Управление кодом и редактиование ресурсов - совершенно разные методы, пусть и приводящие иногда к одному результату.
Редактирование ресурсов посредством кода - это другое дело. Метод прямого редактирования ресурсов - явно не программистский, а какой то любительский что ли... :) Конечно, большинство нас здесь, по сути, любители, но всё же... :)

K.A.V. 06-11-2013 16:00 2248538

Цитата:

Цитата MKN
Метод прямого редактирования ресурсов - явно не программистский, а какой то любительский что ли... »

Ну, на это я могу сказать только то, что лично в этой теме, как ты здесь заметил - великих программистов нет (разве что Вячеслав :) ), которые бы по каждому запросу кодеров NSIS рвались бы и писали для них мегакоды, да и зачем это? Если есть более быстрый способ, тем более приводящий к одному результату.
А если вам предлагают решение и вы уже выбираете, нравится вам или нет - дело ваше
Я, например, не программист и не знаю ничего, кроме NSIS. Да, могу писать плагины для NSIS мелкой функциональности с простенькими командами, поэтому лично для меня проще дать решение, которым бы я сам воспользовался. Да, способ любительский, но я и никогда здесь не говорил, что я программист и буду давать мегакоды с плагином system (которым не пользуюсь, мне проще dll написать). Я самоучка... :)

А если ты хочешь "кодом", то гугли по функциям API, которые устанавливают стиль окна, например SetWindowLongPtr, этой функцией в своём плагине я удалял кнопки "скрыть, развернуть" и оставлял лишь кнопку "Закрыть" в шапке окна.

Limonica 06-11-2013 16:06 2248540

MKN, тоже на Home Edition не работает, но спасибо.

MKN 06-11-2013 16:08 2248543

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

Цитата K.A.V.
мне проще dll написать »

А говоришь, не программист :)

kotkovets 06-11-2013 18:32 2248632

Цитата:

Цитата MKN
Но уж очень интересно было бы воспроизвести и опробировать именно код »

Код:

!include MUI2.nsh

!define MUI_CUSTOMFUNCTION_GUIINIT GUIInit

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "Example.exe"

!define WS_CAPTION 0x00C00000
!define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call"
!macro _NSD_RemoveStyle_Call CONTROL EXSTYLE
  Push `${CONTROL}`
  Push `${EXSTYLE}`
  System::Store SR1R0
  IntOp $R1 $R1 ~
  System::Call `user32::GetWindowLong(iR0,i${GWL_STYLE})i.R2`
  IntOp $R2 $R1 & $R2
  System::Call `user32::SetWindowLong(iR0,i${GWL_STYLE},iR2)`
  System::Store L
!macroend

Function GUIInit
 ${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
FunctionEnd

Section
SectionEnd


MKN 06-11-2013 18:43 2248640

kotkovets,
Можно чуть подробнее о манипуляциях перед GetWindowLong и перед SetWindowLong ?

kotkovets 06-11-2013 18:56 2248654

Цитата:

Цитата MKN
подробнее о манипуляциях перед GetWindowLong и перед SetWindowLong ? »

фиг его знает, я не программист.. :biggrin:
---
Необходимые логические манипуляции с числами: битовая логика (Битовые операции) И :)
что бы из окошка убрать указанную циферку - из полученой общей циферки (стиля окна)
http://ru.wikipedia.org/wiki/Битовые_операции

YoraG 06-11-2013 19:04 2248665

Цитата:

Цитата alexfinik
YoraG, А смысл? Сформулируйте цель. Что мешает сделать файл сразу ffg_old.exe?
Могу предложить создать некоторый файл, в который будет класться информация с некоторым индексом i, который будет каждый раз меняться при запуске файла.
Ну т.е. есть файл index.ini. При первом запуске его нет и он создается, после чего туда записывается цифра 1. Содержимое строки падает в переменную $R0. Файл в конце переименовывается в »

Смысл в том, что у пользователя всегда будет копия прежней версии программы, при установке новой. Если в последней версии программы обнаружатся ошибки, пользователь может временно работать в "ffg_old.exe" до исправления...

diakov 06-11-2013 20:36 2248723

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

nsExec::Exec '"${NSISDIR}\какой то.cmd"'
Но что бы отображалось окно cmd?
По совету K.A.V., не получается http://forum.oszone.net/post-2247687-702.html
Так окно при каждом новом запуске окно получает новый дескриптор..и если писать так

Код:

nsExec::Exec '"${NSISDIR}\какой то.cmd"'
FindWindow $0 "" "Администратор:"
ShowWindow $0 1

То вторая и третья команда выполнятся уже после прекращения работы cmd и соотв. толку нет.
Мож есть какой то еше способ?

YoraG 06-11-2013 21:02 2248738

Цитата:

Цитата YoraG
Как переименовать файл ffg.exe в ffg_old.exe перед установкой
Пишу
Цитата:
Section # "Файлы программы"
...
IfFileExists "$INSTDIR\ffg.exe" 0 +2
Rename $INSTDIR\ffg.exe $INSTDIR\ffg_old.exe
...
но выходит сначала устанавливает а потом переименовывает
Подскажите куда нужно поместить этот код »

На свой вопрос сам же и нашел простой ответ...
Кому нужно пользуйтесь:
Цитата:

!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOW

Function SHOW
IfFileExists "$INSTDIR\ffg.exe" 0 +2
Rename $INSTDIR\ffg.exe $INSTDIR\ffg_old.exe
FunctionEnd
;действие будет выполнятся после выбора папки установки и нажатия кнопки "Установить"

kotkovets 06-11-2013 22:06 2248787

Цитата:

Цитата YoraG
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOW »

Это действие выполняется во время, когда страничка открыта..
Цитата:

Цитата YoraG
;действие будет выполнятся после выбора папки установки и нажатия кнопки "Установить" »

Код:

!define MUI_PAGE_CUSTOMFUNCTION_LEAVE SHOW
когда страничка закрывается

Limonica 07-11-2013 00:13 2248871

Не ну серьезно, неужели нельзя установить новое устройство средствами NSIS?

kotkovets 07-11-2013 00:43 2248887

Цитата:

Цитата Limonica
Не ну серьезно, неужели нельзя установить новое устройство средствами NSIS? »

нет, только утилитой выше в silent режиме - дает гарантированный более-менее результат.

MKN 07-11-2013 10:20 2249056

Возвращаясь к вопросу о скачивании файлов без плагинов.
Это можно сделать с помощью функции URLDownloadToFile
Код:

OutFile "URLDownloadToFile_test.exe"
 ; http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
 
 Section
StrCpy $1 "http://rarlab.com/rar/wrar500.exe"
StrCpy $2 "$temp\wrar500.exe"
 
System::Call 'urlmon::URLDownloadToFile(i0,tr1,tr2,i0,i0)i.r0'

 DetailPrint HRESULT=$0 ; 0 - success
 ; если HRESULT=-2146697208  INET_E_AUTHENTICATION_REQUIRED (0x800C0009L or -2146697207)
 ; Authentication is needed to access the object.  (Требуется авторизация для доступа к объекту)
 SectionEnd

Я проверял работоспособность только на WinXP

MKN 07-11-2013 10:45 2249065

Цитата:

Цитата YoraG
Как переименовать файл ffg.exe в ffg_old.exe перед установкой
но выходит сначала устанавливает а потом переименовывает »

А в чём загвоздка ? Всё работает как надо, потому что нечему не работать... (если я правильно понял задачу) :
Код:

include "MUI2.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
OutFile "test-old_rename.exe"
InstallDir "$TEMP"

Section
IfFileExists "$INSTDIR\ffg.exe" 0 +2
Rename $INSTDIR\ffg.exe $INSTDIR\ffg_old.exe
SetOutPath "$INSTDIR"
File "ffg.exe"
SectionEnd


MKN 07-11-2013 13:34 2249196

Цитата:

Цитата diakov
что бы отображалось окно cmd? »

Так окно консоли вроде как всегда маячит :
Код:

outfile cmd-test.exe
Section
; для наглядности содержимое cmd начни с Pause
ExecWait "$EXEDIR\file.cmd"
SectionEnd


MKN 08-11-2013 08:56 2249822

Каким образом с помощью NSIS, реализовать Drag-and-drop для файлов-папок и самое интересное - для разных объектов-форм (кнопок и пр ) ?

K.A.V. 08-11-2013 13:33 2249973

Цитата:

Цитата MKN
Каким образом с помощью NSIS, реализовать Drag-and-drop для файлов-папок и самое интересное - для разных объектов-форм (кнопок и пр ) ? »

HandleFileDragDrop plug-in
Только там вроде drag работает только на еденичный файл/папку, группой не получится перетащить

MKN 09-11-2013 10:22 2250523

Сравнение времени создания файлов c помощью функции CompareFileTime

Код:

Section
StrCpy $R0 "File1"
StrCpy $R1 "File2"
System::Call 'kernel32::CompareFileTime(t R0,t R1) i.R2'
MessageBox MB_OK 'Сравнили файлы : $R0 и $R1  Результат сравнения : $R2'
SectionEnd

Если время создания $R0 и $R1 одинаково(равно) - в переменную $R2 возвращается 0,
Eсли $R0 создан раньше $R1 - возвращается -1,
Если $R1 создан раньше $R0 - возвращается 1

vahe-91 09-11-2013 14:57 2250624

как сделать, чтобы инсталер не ждал окончания выполнения батника, командой nsExec::Exec ? Или есть другая команда для выполнения батника в скрытом режиме, с помощью которого инсталер не будет ждать его завершения ?

kotkovets 09-11-2013 17:03 2250688

Цитата:

Цитата vahe-91
Или есть другая команда для выполнения батника в скрытом режиме, с помощью которого инсталер не будет ждать его завершения ? »

Убери в коде две "сдвинутые" :) команды #704

vahe-91 09-11-2013 18:23 2250739

Цитата:

Цитата kotkovets
Убери в коде две "сдвинутые" команды #704 »

Моя интуиция подсказывает, что эти две, правильно ?
Код:

System::Call "kernel32::WaitForSingleObject(ir1, i-1)"
System::Call "kernel32::CloseHandle(ir4)"

И еще один вопрос, как-то можно сгенерировать случайное число ?

Salmo 09-11-2013 19:15 2250768

Цитата:

Цитата vahe-91
И еще один вопрос, как-то можно сгенерировать случайное число ? »

Цитата из справки:
Автор: K.A.V.

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

!define Rnd "!insertmacro _Rnd"
!macro _Rnd _RetVal_ _Min_ _Max_
  Push "${_Max_}"
  Push "${_Min_}"
  Call Rnd
  Pop ${_RetVal_}
!macroend

Добавляем функцию генерации случайного числа:
Function Rnd
  Exch $0  ;; Min / return value
  Exch
  Exch $1  ;; Max / random value
  Push "$3"  ;; Max - Min range
  Push "$4"  ;; random value buffer

  IntOp $3 $1 - $0 ;; calculate range
  IntOp $3 $3 + 1
  System::Call '*(l) i .r4'
  System::Call 'advapi32::SystemFunction036(i r4, i 4)'  ;; RtlGenRandom
  System::Call '*$4(l .r1)'
  System::Free $4
  ;; fit value within range
  System::Int64Op $1 * $3
  Pop $3
  System::Int64Op $3 / 0xFFFFFFFF
  Pop $3
  IntOp $0 $3 + $0  ;; index with minimum value

  Pop $4
  Pop $3
  Pop $1
  Exch $0
FunctionEnd


И в любом месте кода вызываем функцию генерации числа:

${Rnd} $0 1 10


kotkovets 09-11-2013 19:53 2250793

Цитата:

Цитата vahe-91
Моя интуиция подсказывает, что эти две, правильно ? »

альтернативы не существует :biggrin:

MKN 10-11-2013 10:44 2251118

Цитата:

Цитата vahe-91
как-то можно сгенерировать случайное число ? »

http://nsis.sourceforge.net/NsRandom_plug-in
http://nsis.sourceforge.net/Rnd
http://nsis.sourceforge.net/Random

А также:
Код:

System::Call kernel32::GetTickCount()i.r1
IntOp $1 $1 % 10


Mafia_forever 10-11-2013 13:40 2251191

Всем привет , у меня есть вопрос ! Можно ли разбить на тома инсталлятор как в Inno Setup ?

Kopejkin 10-11-2013 13:42 2251194

Делаю патчер с проверкой MD5 файла. При каких-либо отличиях выводятся свои сообщения. При наличии измененного этим патчем файла (сооб.1) и при несоответствии оригинального файла (сооб.2). Возврат к поиску другой папки после Сооб.2 оправдан. А вот после Сооб.1 приходится выполнять лишнее действие. Даже два, так как приходится щелкать еще и в окне запроса подтверждения отмены установки.
Можно ли закрыть программу инсталляции сразу после вывода сообщения 1, а не возвращаться для отдельной отмены установки?
Код:

   
    !include "MUI2.nsh"       
    !include "VPatchLib.nsh" 
    !include "Logiclib.nsh" 
    !include "ProcessFunc.nsh"
SetCompressor /SOLID lzma

    !define PRODUCT_NAME "Screenshot Captor" 
    !define PRODUCT_VERSION "4.7.2"         
    !define pkgdir "d:\pr_ScreenshotCaptor.472"
    !define BRANDING "©KOPEJKIN, 10/2013"   
    !define MUI_ABORTWARNING                 
    !define MUI_ABORTWARNING_TEXT "Отменить установку русификатора ${PRODUCT_NAME} ${PRODUCT_VERSION}?"
    !define MUI_WELCOMEFINISHPAGE_BITMAP "${pkgdir}\res\logo.bmp"
    !define MUI_HEADERIMAGE
    !define MUI_HEADERIMAGE_BITMAP "${pkgdir}\res\top_rus_inst_r.bmp"
    !define MUI_HEADERIMAGE_RIGHT
    !insertmacro MUI_PAGE_LICENSE "lic_rus.rtf"
    !define MUI_PAGE_HEADER_TEXT "Информация"
    !define MUI_LICENSEPAGE_TEXT_BOTTOM " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "
    !define MUI_LICENSEPAGE_BUTTON "Далее" 
    !insertmacro MUI_PAGE_LICENSE "ug_rus.rtf"
    !define MUI_PAGE_CUSTOMFUNCTION_LEAVE Check
    !insertmacro MUI_PAGE_DIRECTORY
    !insertmacro MUI_PAGE_INSTFILES
    !insertmacro MUI_PAGE_FINISH
    !insertmacro MUI_LANGUAGE "Russian"


  Caption "Русификация ${PRODUCT_NAME} ${PRODUCT_VERSION}"         
  Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"   
  BrandingText "${BRANDING}"                 
  InstallDir ""
  OutFile "sc472rus.kopejkin.exe"   
  RequestExecutionLevel admin
  ShowInstDetails show     
  ShowUninstDetails show   

Section "-Русификатор"
  SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
      CopyFiles /SILENT $INSTDIR\ScreenshotCaptor.exe $INSTDIR\Backup\ScreenshotCaptor.exe.bak
  DetailPrint "Подготовка к изменению файла ScreenshotCaptor.exe..."
  !insertmacro VPatchFile "sc472rus.pat" "$INSTDIR\ScreenshotCaptor.exe" "$INSTDIR\temporaryfile.exe"
SectionEnd

Function .OnInit
      ${KillProcess} "ScreenshotCaptor.exe" $0
FunctionEnd

Function .onVerifyInstDir
      IfFileExists "$INSTDIR\ScreenshotCaptor.exe" PathGood
      Abort
      PathGood:
FunctionEnd

Function Check
      StrCpy $0 "$INSTDIR\ScreenshotCaptor.exe"
      md5dll::GetMD5File "$0"
      Pop $1
      StrCpy $R1 $1                         

    ${If} $R1 == 2422E63F23D86C754C5CB9606196D036                   
    ${ElseIf} $R1 == 5755a1c31f67191f0fbcaa9548c48e8e               
      MessageBox MB_OK|MB_DEFBUTTON2|MB_ICONINFORMATION  "\
                                                РУССКАЯ версия УЖЕ установлена на этом компьютере.$\n$\n\
                                                Нажмите кнопку 'OK' для закрытия этого сообщения$\n\
                                                и ОТМЕНИТЕ установку данного русификатора." IDOK
     
    Quit     
; Здесь применяем команду Quit, а не Abort. Тогда после нажатия кнопки ОК программа установки будет закрыта .
    ${Else}
      MessageBox MB_OK|MB_ICONSTOP| "Здесь - ($INSTDIR),$\n\
                                                находится файл программы, для изменения которого$\n\
                                                данный русификатор НЕ ПРЕДНАЗНАЧЕН!$\n$\n\
                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$\n\
                                                Возможные причины: $\n\
                                                - выбрана неверная папка ${PRODUCT_NAME} ${PRODUCT_VERSION};$\n\
                                                - программа ${PRODUCT_NAME} ${PRODUCT_VERSION} не установлена;$\n\
                                                - попытка локализовать ${PRODUCT_NAME} другой версии;$\n\
                                                - попытка локализовать измененный оригинальный файл.$\n$\n\
                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$\n$\n\
                                                Нажмите 'OK' для выбора другой папки или ОТМЕНЫ установки." IDOK
      Abort 
    ${EndIf}
FunctionEnd

Спасибо, kotkovets! Исправил в коде, может еще кому пригодится.

kotkovets 10-11-2013 15:36 2251265

Цитата:

Цитата Kopejkin
Можно ли закрыть программу инсталляции сразу после вывода сообщения 1, а не возвращаться для отдельной отмены установки? »

прописать команду закрытия приложения: quit вместо прерывания аbort

MKN 11-11-2013 12:44 2251909

Возможно ли в NSIS реализовать мониторинг создания ключей реестра, какой либо программой ?
Т.е. перехват обращений к реестру. Вроде как для этого есть функция CmRegisterCallback...
Вскользь про это было здесь : http://www.xakep.ru/magazine/xa/102/114/1.asp

kotkovets 11-11-2013 14:24 2251983

Цитата:

Цитата MKN
Возможно ли в NSIS реализовать мониторинг создания ключей реестра, какой либо программой ? »

если кто-то напишет драйвер для NSIS..
А нужно ли это установщику?

MKN 11-11-2013 14:40 2251996

Цитата:

Цитата kotkovets
А нужно ли это установщику? »

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

Цитата kotkovets
если кто-то напишет драйвер для NSIS.»

Понятно, т.е. - этого не будет никогда...

MKN 12-11-2013 13:37 2252768

Когда то рассматривался вопрос об использовании в качестве картинок - файлов формата Jpg
Есть код, позволяющий использовать Jpg и Gif файлы, а также изменять их размер :
Код:

!include MUI2.nsh
Page Custom mypage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "Jpg-Resize-test.exe"

; Ссылка на идентификатор интерфейса, описывающий тип указателя интерфейса для возврата в ppvRet.
!ifndef IID_IPicture
    !define IID_IPicture {7BF80980-BF32-101A-8BBB-00AA00300CAB}
!endif
!define SRCCOPY 0xCC0020
!define IMAGEPATH "$EXEDIR\Pict.jpg" ;
!define NEWSIZEW 300
!define NEWSIZEH 200

Function mypage
nsDialogs::Create 1044
Pop $0
System::Call 'oleaut32::OleLoadPicturePath(w "${IMAGEPATH}",i0r2,i0,i0,g"${IID_IPicture}",*i.r9)i.r1'
${If} $1 = 0
    System::Call 'user32::GetDC(i0)i.s'
    System::Call 'gdi32::CreateCompatibleDC(iss)i.r1'
    System::Call 'gdi32::CreateCompatibleBitmap(iss,i${NEWSIZEW},i${NEWSIZEH})i.r2'
    System::Call 'user32::ReleaseDC(i0,is)'
    System::Call $9->3(*i.r3)i.r4 ; IPicture->get_Handle
    ${If} $4 = 0
        System::Call 'gdi32::SetStretchBltMode(ir1,i4)'
        System::Call '*(&i40,&i1024)i.r4' ; BITMAP / BITMAPINFO
        System::Call 'gdi32::GetObject(ir3,i24,ir4)'
        System::Call 'gdi32::SelectObject(ir1,ir2)i.s'
        System::Call '*$4(i40,i.r6,i.r7,i0,i,i.s)' ; Grab size and bits-ptr AND init as BITMAPINFOHEADER
        System::Call 'gdi32::GetDIBits(ir1,ir3,i0,i0,i0,ir4,i0)' ; init BITMAPINFOHEADER
        System::Call 'gdi32::GetDIBits(ir1,ir3,i0,i0,i0,ir4,i0)' ; init BITMAPINFO
        System::Call 'gdi32::StretchDIBits(ir1,i0,i0,i${NEWSIZEW},i${NEWSIZEH},i0,i0,ir6,ir7,is,ir4,i0,i${SRCCOPY})'
        System::Call 'gdi32::SelectObject(ir1,is)'
        System::Free $4
    ${EndIf}
    System::Call 'gdi32::DeleteDC(ir1)'
    System::Call $9->2() ; IPicture->release()
${EndIf}
${NSD_CreateBitmap} 1u 1u ${NEWSIZEW} ${NEWSIZEH} ""
Pop $9
;Not required when the control size matches: ${NSD_AddStyle} $9 ${SS_CENTERIMAGE}
SendMessage $9 ${STM_SETIMAGE} ${IMAGE_BITMAP} $2
nsDialogs::Show
System::Call 'gdi32::DeleteObject(ir2)'
FunctionEnd

Section
SectionEnd


MKN 13-11-2013 11:38 2253528

При создании на стандартной финишной странице отмеченного чекбокса ( MUI_FINISHPAGE_RUN ), для запуска после установки (т.е. после закрытия PAGE_FINISH) чего либо ,
чтобы этого запуска не было, сначала надо снять отметку с чекбокса, а потом кликнуть Finish.
Иногда это не преемлемо и мешает управлению событиями...
Но на FINISHPAGE можно активировать кнопку "Cancel", нажатие которой, закроет страницу без запуска чего либо, даже если чекбокс отмечен.

Код:

OutFile "FinishCancelEnabled_test.exe"
!include MUI2.nsh
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
#Do NOT use MUI_FINISHPAGE_CANCEL_ENABLED  !
!define MUI_FINISHPAGE_RUN "$windir\explorer.exe"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW CancelEnabled
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

!ifndef SC_CLOSE
!define SC_CLOSE 0xF060
!endif

Function CancelEnabled
EnableWindow $mui.Button.Cancel 1
System::Call 'USER32::GetSystemMenu(i $hwndparent,i0)i.s'
System::Call 'USER32::EnableMenuItem(is,i${SC_CLOSE},i0)'
FunctionEnd

Section
SectionEnd


vahe-91 13-11-2013 12:17 2253552

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

MKN 13-11-2013 12:39 2253571

Цитата:

Цитата vahe-91
Можно как-то упростить создание деинсталера, чтобы вручную не указать что, где нужно удалять ? »

Есть uninstlog.nsh
http://nsis.sourceforge.net/Talk:Uni...nstalled_files
и
http://nsis.sourceforge.net/Advanced...og_NSIS_Header
Но по моему, это не серьёзно... Годится только для частных случаев... Кто лучше самого создателя инсталлятора, может лучше знать что, как и когда удалять, условия и нюансы удаления ?

vahe-91 13-11-2013 13:03 2253582

Цитата:

Цитата MKN
Но по моему, это не серьёзно... Годится только для частных случаев... Кто лучше самого создателя инсталлятора, может лучше знать что, как и когда удалять, условия и нюансы удаления ? »

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

MKN 14-11-2013 12:06 2254334

Автоматическая смена заголовка окна сообщений

Занятное решение...
Код:

OutFile "MB_Title.exe"

!include "WinMessages.nsh"
!define InstCaption "Обычный заголовок"
!define MBCaption1 "А сейчас - необычный !"
!define MBCaption2 "Во как !"
Caption "${InstCaption}"

Function .onInit
# If you don't want the blinking caption on the taskbar as well, use .onGUIInit
InitPluginsDir
WriteUninstaller $PLUGINSDIR\MBCaption.exe
MessageBox MB_OK|MB_ICONINFORMATION|MB_TOPMOST "Обычный заголовок"
Exec "$PLUGINSDIR\MBCaption.exe"
MessageBox MB_OK|MB_USERICON|MB_TOPMOST "А сейчас - необычный !"
MessageBox MB_OK|MB_ICONINFORMATION|MB_TOPMOST "Снова обычный заголовок"
Abort
FunctionEnd

Section "Blank"
SectionEnd

Function un.onInit
FindWindow $0 "" "${InstCaption}" "" ""
IsWindow $0 0 -1

CaptionLoop:
SendMessage $0 ${WM_SETTEXT} "0" "STR:${MBCaption1}"
Sleep 800
SendMessage $0 ${WM_SETTEXT} "0" "STR:"
Sleep 400
SendMessage $0 ${WM_SETTEXT} "0" "STR:${MBCaption2}"
Sleep 800
SendMessage $0 ${WM_SETTEXT} "0" "STR:"
Sleep 400
FindWindow $1 "" "${InstCaption}" "" ""
IsWindow $1 0 CaptionLoop

Abort
FunctionEnd

Section "un.Blank"
SectionEnd

При использовании на Win7 надо позаботиться , чтобы не мешал UAC

Begin2Fly 15-11-2013 07:15 2254947

kotkovets, здравствуйте. Можно что-нибудь придумать с WinVer2.nsh для юникодовой версии NSIS? Желательно для последней альфы.
Используя ${WinVersion} не хочет последнюю цифру рассказывать, получается просто "6."

MKN 15-11-2013 11:52 2255095

Цитата:

Цитата Begin2Fly
не хочет последнюю цифру рассказывать, получается просто "6." »

Сколько уже разговоров вокруг определения Win 8.1 ... А надо то всего получить две несчастные циферки 6 и 3
Для 99% практических надобностей, этого достаточно и не надо никаких WinVer.nsh

А получить эти циферки можно или как всегда :
Код:

outfile GetOsVersion.exe
Section
  ClearErrors
  ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentVersion"
  MessageBox MB_OK "Номер версии OС :  $R0 "
SectionEnd

или
Код:

outfile GetOsVersion.exe
 Section
  System::Call "kernel32.dll::GetVersion() i .r0"
  IntOp $4 $0 & 0xFF    ;main ver
  IntOp $5 $0 & 0xFF00    ;sub ver
  IntOp $5 $5 >> 8
  Push $5
  Push $4
  MessageBox MB_OK "Номер версии OС :  $4.$5      "
SectionEnd


Begin2Fly 15-11-2013 13:27 2255176

MKN, первый вариант не катит, потому что в реестре кто угодно может поменять эту информацию, а хочется, чтобы всё было как надо.
Второй вариант заинтересовал, благодарю, попробую. И дело вовсе не в 8.1 (чтоб её), на Windows 7 та же беда.
Надеюсь ещё услышать мнение kotkovets.

MKN 15-11-2013 13:45 2255185

Цитата:

Цитата Begin2Fly
потому что в реестре кто угодно может поменять эту информацию, »

Интересно, с какой такой целью кому то нужно менять номер версии ОС в реестре ? :) Никогда про такое не слышал... Даже вирусам это не нужно...
В конце концов можно установить сответсвующие права на эту ветку...

Begin2Fly 15-11-2013 14:14 2255200

Цитата:

Цитата MKN
Интересно, с какой такой целью кому то нужно менять номер версии ОС в реестре ? Никогда про такое не слышал... Даже вирусам это не нужно...
В конце концов можно установить сответсвующие права на эту ветку... »

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

kotkovets 15-11-2013 19:16 2255356

Цитата:

Цитата Begin2Fly
kotkovets, здравствуйте. Можно что-нибудь придумать с WinVer2.nsh для юникодовой версии NSIS? »

для какой версии NSIS ?
--
С последней 3 версией NSIS никаких проблем, скрипт сохранял в любом юникоде
http://forum.oszone.net/showpost.php?p=2239933

Begin2Fly 15-11-2013 19:53 2255383

kotkovets, используется версия 3.0a1, юникод включен, на выходе что-то непонятное... Причём, на ANSI всё работает нормально.
читать дальше »
Код:

!include "WinVer2.nsh"

Unicode true
Name "WinVer2 check"
OutFile "Check.exe"

Section main
        HideWindow
        SetAutoClose true
        ${WinVersion} $5
        MessageBox MB_OK|MB_TOPMOST "Версия Windows: $5"
SectionEnd


kotkovets 15-11-2013 20:25 2255409

Begin2Fly, косяк есть исправил:
http://forum.oszone.net/showpost.php?p=2239933

Begin2Fly 15-11-2013 20:29 2255415

kotkovets, спасибо большое, теперь всё отработало корректно. Только подправьте расширение файла, а то скачивается с .nsi, а не с .nsh

vahe-91 16-11-2013 00:39 2255607

Цитата:

Цитата kotkovets
косяк есть исправил: »

я же говорил про это, а меня никто не слушал :dont-know

Begin2Fly 16-11-2013 05:00 2255668

*Тихо ненавижу 8.1*
Кто-нибудь знает, как можно зарегистрировать .dll, находящуюся в Program Files (x86) на 64-битной Windows 8.1? Пробовал всякое, но процесс просто висит в фоне.

diakov 16-11-2013 14:12 2255801

Подскажите что не так делаю, при использовании плага Nsis7z, после выполнения команды

Код:

Nsis7z::ExtractWithDetails "Test.7z" "Распаковка: %s"
файлы распаковываются но все они по 0 байт.

Begin2Fly 16-11-2013 15:09 2255843

diakov, пакуй в LZMA, а не LZMA2.

kotkovets 16-11-2013 17:24 2255926

Цитата:

Цитата Begin2Fly
Кто-нибудь знает, как можно зарегистрировать .dll, находящуюся в Program Files (x86) на 64-битной Windows 8.1?..»

под админом через regsvr32.exe
Если нужно делаем перенаправление: подробности в файле ..\NSIS\Include\x64.nsh

Begin2Fly 16-11-2013 20:14 2256043

Цитата:

Цитата kotkovets
под админом через regsvr32.exe
Если нужно делаем перенаправление: подробности в файле ..\NSIS\Include\x64.nsh »

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

MKN 16-11-2013 20:56 2256066

Цитата:

Цитата Begin2Fly
проблема заключалась в том, что рядом с регистрируемой .dll находился определённый .exe-файл. Стоило его убрать и вуаля, всё работает »

Интересная связь... Это всё равно, что - DLL не регистрировалась, потому что на кухне горел свет. Свет потушили - DLL зарегистрировалась. :)

Vincent7 17-11-2013 16:59 2256538

подскажите как запустить через execcmd или execdos приложение с параметрами. я не понял как это сделать

Salmo 17-11-2013 18:20 2256586

Vincent7,
Код:

ExecCmd::exec '"$SysDir\cmd" /c NET START PFNet' "" ""
Запускаем CMD с параметром /c NET START PFNET - пример запуска службы

Salmo 19-11-2013 17:49 2257939

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

Код:

!include LogicLib.nsh
showinstdetails show
outfile wind.exe
Section
System::Get "(i.r1) iss"
Pop $R0
System::Call "user32::EnumWindows(k R0,i) i.s"
loop:
    Pop $0
    StrCmp $0 "callback1" 0 done
    System::Call "user32::IsWindowVisible(ir1)i.r2"
    ${If} $2 <> 0
        System::Call "user32::GetWindowText(ir1,t.r2,i${NSIS_MAX_STRLEN})"
        System::Call "user32::GetClassName(ir1,t.r3,i${NSIS_MAX_STRLEN})"
        IntFmt $1 "0x%X" $1
        DetailPrint "$1 - [$3] $2" ;дескриптор-класс-имя
        ${EndIf}
    Push 1 # callback's return value
    System::Call "$R0"
    Goto loop
done:
System::Free $R0
Sectionend

Но столкнулся с тем, что этот код не обнаруживает явно открытое окно программы. Это же окно не видит Анвир. Для утилиты Spy++ или WndOwner проблем нет. А хотел увидеть и его дочерние окна... Есть еще варианты на NSIS?

MKN 19-11-2013 18:21 2257962

Цитата:

Цитата Salmo
код не обнаруживает явно открытое окно программы. »

Расшифруй - что значит явное ? Открытые окна и их дочерние - нормально определяет. Что за хитрое такое окно у тебя ?

K.A.V. 19-11-2013 19:56 2258025

Цитата:

Цитата MKN
Расшифруй - что значит явное ? »

Как я догадываюсь, это означает то, что окно точно есть и пользователь об этом знает, но при перечислении окон оно не обнаруживается
И такому поведению есть место, например, у меня тоже NSIS скрипт не находит через FindWindow окно "Kaspersky Internet Security" когда запущен антивирь, в то время как программа "InqSoft Window Scanner" явно даёт понять, что данное окно всё-таки существует и в своём списке его отображает...

Salmo 19-11-2013 22:35 2258133

Цитата:

Цитата K.A.V.
Как я догадываюсь, это означает то, что окно точно есть и пользователь об этом знает, но при перечислении окон оно не обнаруживается »

Спасибо за поддержку :) .... и более того, не просто знает, а видит перед собственным носом! Видимо это не случайность, а закономерность для подобных программ... А программа - 360 Internet Security.

MKN 20-11-2013 09:07 2258309

Цитата:

Цитата K.A.V.
Как я догадываюсь, это означает то, что окно точно есть и пользователь об этом знает, »

Разве можно задавать так вопрос, что надо догадываться о чём речь... :) Можно было бы сразу сказать - окно программы "360 Internet Security".
Может прграмма построена, так , что игнорируются API вызовы, "направленные" на её оконные формы и пр ? Всё же это антивирус... А вышеприведённый код, ведь API_шный...
Можно попробовать подойти к такой задаче по другому - или искать окно, принадлежащее процессу или использовать WMI

Salmo 20-11-2013 10:10 2258324

Цитата:

Цитата MKN
Разве можно задавать так вопрос, что надо догадываться о чём речь. »

Толковый словарь: явный - 1. Не скрываемый, не тайный, открытый; 2. Совершенно очевидный, ясный для всех.
Я не думал, что это слово вызовет затруднение...
:)

или искать окно, принадлежащее процессу - поподробнее можно, пожалуйста.

MKN 20-11-2013 10:16 2258326

Цитата:

Цитата Salmo
Я не думал, что это слово вызовет затруднение... »

У меня, при явно открытых нескольких окнах и правильной работе кода по определению этих явных окон - твоё неопределяемое "явное" окно, явно вызывает вопросы. :) Потому необходима конкретика в вопросе.

MKN 20-11-2013 10:48 2258339

Цитата:

Цитата Salmo
или искать окно, принадлежащее процессу - поподробнее можно, пожалуйста. »

Если для одного известного процесса, то определить его PID, (на всяк случай найти доп потоки с помощью Thread32First / Thread32Next) затем использовать функции EnumThreadWindows() и EnumThreadWndProc
Если перебрать все окна ,созданные всеми имеющимися в данный момент, процессами, то сделать снимок процессов, разобраться с ним и для каждого
использовать функции EnumThreadWindows() и EnumThreadWndProc.
Как то так. Это много кода и гемора. Подробности знают наши гуру. :)

ps Найти "Window Title", зная имя процесса, можно с помощью малюсенькой утилитки CProcess. Она уже упоминалась здесь.

MKN 21-11-2013 10:34 2259059

Ещё раз о запрете перетаскивания окон-страниц.
Китайские "NSISадмины" для этого, обезглавливают окно одной строкой в CUSTOMFUNCTION_GUIINIT (или PAGE_CUSTOMFUNCTION_SHOW) :
Код:

OutFile "NoWindowTitle.exe"

!include "MUI2.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT GUIInit
;!define MUI_PAGE_CUSTOMFUNCTION_SHOW Custom
!insertmacro MUI_PAGE_WELCOME
;!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

;Function Custom
Function GUIInit
System::Call `user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},0x9480084C)i.R0`
FunctionEnd

Section
SectionEnd

Не уверен, что так корректно, но работает... И ещё нигде не нашёл инфы о константе(?) 0x9480084C
Что бы это значило ?

ps offtop По заявлению IT-corp AOL - скоро будет закрыт проект winamp и сайт winamp.com, тогда что, и форум закроют ? Т.е. мировой центр NSIS разработки и общения NSIS_овцев... Тогда на белом свете останется только forum.oszone NSIS... Сюда потянутся пользователи со всего света, мировая NSIS дискуссия, Нью-Nsis Васюки.... :)

K.A.V. 21-11-2013 11:27 2259085

Цитата:

Цитата MKN
Не уверен, что так корректно, но работает... И ещё нигде не нашёл инфы о константе(?) 0x9480084C
Что бы это значило ? »

Да какая разница, какой метод...Что ты удаляешь стили окна напрямую в modern.exe, что ты при запуске делаешь этой командой...смысл один и тот же.
Последний параметр в функции устанавливает стиль окна, там суммируются разные стили по кодам стилей, вот и всё (SetWindowLong)
Корректней было бы сначала получить стиль своего окна с помощью GetWindowLong, из этого стиля удалить необходимые стили и использовать "обрезанный" стиль как 3-ий параметр в SetWindowLong, как показал вам ЗДЕСЬ уважаемый Вячеслав :)

Цитата:

Цитата MKN
Сюда потянутся пользователи со всего света, мировая NSIS дискуссия, Нью-Nsis Васюки.... »

Будет кому отвечать в этой теме кроме авторов справочника на все хотелочки :) а мы на покой :biggrin:

Limonica 21-11-2013 11:57 2259108

Можно пример скрипта определения раскладки клавиатуры или языка ОС, и если он англ. - завершение работы скрипта. Спасибо!

MKN 21-11-2013 13:15 2259158

Цитата:

Цитата Limonica
определения раскладки клавиатуры или языка ОС »

Определения раскладки клавиатуры и языковых параметров ОС

Код:

OutFile "LocaleINFO.exe"
Name "Detect User Locale INFO"
Caption "Detect User Locale INFO"
 
!define LOCALE_ILANGUAGE '0x1' ;System Language Resource ID   
!define LOCALE_SLANGUAGE '0x2' ;System Language & Country [Cool]
!define LOCALE_SABBREVLANGNAME '0x3' ;System abbreviated language
!define LOCALE_SNATIVELANGNAME '0x4' ;System native language name [Cool]
!define LOCALE_ICOUNTRY '0x5' ;System country code   
!define LOCALE_SCOUNTRY '0x6' ;System Country
!define LOCALE_SABBREVCTRYNAME '0x7' ;System abbreviated country name
!define LOCALE_SNATIVECTRYNAME '0x8' ;System native country name [Cool]
!define LOCALE_IDEFAULTLANGUAGE '0x9' ;System default language ID
!define LOCALE_IDEFAULTCOUNTRY  '0xA' ;System default country code
!define LOCALE_IDEFAULTCODEPAGE '0xB' ;System default oem code page
 
Function ".onInit"
System::Call 'kernel32::GetSystemDefaultLangID() i .r0'
System::Call 'kernel32::GetLocaleInfoA(i 1024, i ${LOCALE_SNATIVELANGNAME}, t .r1, i ${NSIS_MAX_STRLEN}) i r0'
System::Call 'kernel32::GetLocaleInfoA(i 1024, i ${LOCALE_SNATIVECTRYNAME}, t .r2, i ${NSIS_MAX_STRLEN}) i r0'
System::Call 'kernel32::GetLocaleInfoA(i 1024, i ${LOCALE_SLANGUAGE}, t .r3, i ${NSIS_MAX_STRLEN}) i r0'
MessageBox MB_OK|MB_ICONINFORMATION "Your System LANG Code is: $0. $\r$\nYour system language is: $1. $\r$\nYour system language is: $2. $\r$\nSystem Locale INFO: $3."

System::Call 'user32::GetKeyboardLayout(i 0)i.r0'
IntFmt $0 "%08x" $0
StrCpy $1 $0 "" -4
MessageBox MB_OK " Установленный по умолчанию DefaultLangID  :  $1 "
; 0409 - английский
; 0419 - русский
FunctionEnd
 
Section
SectionEnd

Раскладка клавиатуры по умолчанию - это раскладка, установленная в языковой панели, т.е. , которая будет после загрузки ОС
Не путать с текущей раскладкой, которая вышеприведённым кодом НЕ определяется !

С логикой "если бы, да кабы" - разберёшься сам. Примеров тьма.

wolkow70 23-11-2013 20:21 2260548

Возник такой вопрос.
известно, что в Windows 8 для внесения ассоциации недостаточно добавить значение ProgId:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pdf\UserChoice]
"ProgId"="AcroExch.Document"

а требуется еще внести параметр Hash, вот так:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pdf\UserChoice]
"Hash"="xh8KhPWlZL0="
"ProgId"="AcroExch.Document"

Возник вопрос, можно ли в автоматическом режиме вычислить Hash значение параметра ProgID для записи в параметр Hash ?

Vincent7 24-11-2013 00:48 2260657

Подскажите пожалуйста как можно отправить сообщение в командную строку? И можно ли в ней же эмулировать нажатие клавиши enter?

K.A.V. 24-11-2013 07:42 2260712

Цитата:

Цитата Vincent7
Подскажите пожалуйста как можно отправить сообщение в командную строку? И можно ли в ней же эмулировать нажатие клавиши enter? »

Как эмулировать нажатие клавиши
читать дальше »

Код:

!include "WinMessages.nsh"

Caption "PressKey.exe"                       
OutFile "PressKey.exe"



Function .onInit
 FindWindow $0 "ConsoleWindowClass" "Администратор: $SYSDIR\cmd.exe"
 IsWindow $0 0 +2
  MessageBox MB_OK "ОКНО НАЙДЕНО" idok +3
  MessageBox MB_OK "ОКНО НЕ НАЙДЕНО"
quit
  SendMessage $0 ${WM_CHAR} "0x0D" "0"
quit
FunctionEnd





Section
SetAutoClose true
SectionEnd

ConsoleWindowClass - класс окна, в котором собираемся сделать нажатие кнопки, не помню, такой же класс в WinXP у консоли или нет, лень проверять, как-нибудь сами
Администратор: $SYSDIR\cmd.exe - имя окна, если собираетесь жать в консоли, то лучше бы заранее в cmd-файле прописать "title" окна, т.к. например, в XP слово "Администратор" не добавляется к заголовку cmd окон как в Win7
0x0D - клавиша, которая отправляется окну. Коды читайте здесь: Virtual-Key Codes


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

Vincent7 25-11-2013 16:22 2261400

не работает эмулирование... а если использовать execdos плагин с параметром /DETAILED- так информация из командной сроки будет выводится в окне установки, можно ли будет в это окно послать сообщение? будет ли оно воспринято консолью?

MKN 25-11-2013 18:11 2261455

Цитата:

Цитата Vincent7
можно ли будет в это окно послать сообщение? будет ли оно воспринято консолью? »

Не совсем яcно чего ты хочешь и зачем такие извращения ?..
А в консольное окно, отправить нечто можно так :
Код:

outfile consol.exe
Section
System::Call 'kernel32::AllocConsole(i -1)'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $0 "hello, Vincent7 !"
SectionEnd

Проверял только на XP. На других ОС наверное надо вызывать AttachConsole... Не пробовал.

K.A.V. 26-11-2013 20:47 2262047

Вложений: 1
Цитата:

Цитата Vincent7
не работает эмулирование... »

:o а вы тестировали?

Хотите сказать, мой предоставленный код не рабочий? Может, вы делаете что-то не так?
Смотрите прикреплённый файл. Специально для вас, запустил виртуалку и проверил на XP (не, ну мало ли, чтобы уж наверняка)
C другим софтом да, возможно и не будет работать, но в командную строку лично у меня нажатие клавишь отправляет корректно

Кто-нибудь, протестите мой пример кода и скажите, работает ли у вас посылка нажатия "enter" в командную строку

Цитата:

Цитата Vincent7
можно ли будет в это окно послать сообщение? будет ли оно воспринято консолью? »

Мы вам тут сейчас кучу кода предоставим, а вы на всё будете отвечать "не работает"

Цитата:

Цитата MKN
Проверял только на XP. На других ОС наверное надо вызывать AttachConsole... Не пробовал. »

В Win7 x32 работает, правда открывает новое cmd окно, но если так и задуманно...о командах не читал, с консолью не работаю и не разбирался :)

Vincent7 27-11-2013 15:28 2262475

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

section "f"
ExecCmd::exec /TEST '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\Games' "D:\h"
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
IsWindow 0 +2
MessageBox MB_OK "Founded" idok +3
MessageBox MB_OK "not Founded"
quit
SendMessage $0 ${WM_CHAR} "0x0D" "0"
quit
sectionend


K.A.V. 27-11-2013 16:37 2262531

Цитата:

Цитата Vincent7
однако в моем коде нужно чтобы нажатие эмулировалось во время выполнения консольной программы, а не после »

Ну так...А в чем проблема прочитать описание плагина, которым пользуетесь?

И как вы копировали мой код, если удалили из команды нужную переменную?
Цитата:

Цитата Vincent7
IsWindow 0 +2

Цитата:

Цитата K.A.V.
IsWindow $0 0 +2

Цитата:

Цитата http://nsis.sourceforge.net/ExecCmd_plug-in
ASYNC
Does not wait for process exit. Use 'wait' call if you want to get exit code. (/NOUNLOAD is mandatory!)

Код:

ExecCmd::exec /NOUNLOAD /ASYNC /TEST '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\Games' "D:\h"
Ваш процесс будет запущен параллельно установщику, а там уже определяйте по поиску окна с циклом, завершился он или нет как вариант...

Код:

ExecCmd::exec /NOUNLOAD /ASYNC /TEST '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\Games' "D:\h"
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
IsWindow $0 0 -1
stSend:
sleep 1000
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
IsWindow $0 0 noWindow
SendMessage $0 ${WM_CHAR} "0x0D" "0"
goto stSend
noWindow:

Указанный выше код будет постоянно посылать окну нажатие кнопки с интервалом в 1 секунду, пока окно существует
И, если вы хотите, чтобы ваш код с командной строкой работал на всех системах, я вам уже говорил в отличии заголовков окон в WinXP и Win7 (в Win8 не помню как), так что вам сначала нужно определить ОС и в зависимости + типа учетной записи менять искомый заголовок командной строки...

Лень сейчас писать вам код, подумайте хоть чуток сами...
читать дальше »

Код:

Определяем ОС
Определяем тип учетки
Если значение билда ОС выше 5 (WinXP 5.1) И тип учетки админ - в переменную заголовка кидаем текст с приставкой "Администратор"

Я с командной строкой не работал, ещё раз повторюсь, возможно, это и не нужно...Поправьте меня, если кто тесно работал с командной строкой

Vincent7 27-11-2013 17:52 2262599

спасибо большое!

Vincent7 28-11-2013 00:43 2262854

С этим разобрался. Теперь нужно считать информацию из командной сроки... Как? :)

K.A.V. 29-11-2013 07:55 2263541

Цитата:

Цитата Vincent7
Теперь нужно считать информацию из командной сроки... Как? »

Как я понял, в этой теме с командной строкой так тесно никто не работал, да и заявленные вами функции весьма сомнительны, так что вряд ли здесь кто-то будет гуглить команды за вас и пытаться их использовать в скрипте NSIS.
Умеете пользоваться поиском? Ищите команды для работы с консолью типа тех, что вам дал MKN, а то тут получается, что ваших кодов ещё никто не видел, а готовые решения получаете

Я, например, чтобы считать все данные из консольного приложения (оно выполняется и отображает прогресс действий строками) пользуюсь плагином ExecDos plug-in, который позволяет в качестве выходных данных указать функцию, которая будет получать каждую строчку из консольного приложения в момент его выполнения либо HANDLE, в который будут посылаться данные.
Пример по выходным данным в фунцкию смотрите на страничке описания плагина внизу странички (ключ /TOFUNC)
Дальше пробуйте и разбирайтесь сами, если что не получится - пишите и показывайте, как вы пробовали реализовать нужный вам функционал.
И не забудьте прочитать Справочник по NSIS

MKN 29-11-2013 12:47 2263713

Цитата:

Цитата Vincent7
нужно считать информацию из командной сроки... Как? »

Почему ты так мутно ставишь вопросы... Задача должна быть поставлена чётко и с ясной целью.
Из какой такой строки ? Если из команды из скрипта, то например, с помощью плагина http://nsis.sourceforge.net/ExecCmd_plug-in
Можно с открытой, можно со скрытой консолью. Только зачем вообще нужно окно консоли ? Там что то надо дополнительно делать ?
Если из введённой тобой внешней команды ( опять же, смотря откуда вводить - из консоли, из строки ввода в окне твоего инсталлятора, или вообще из какого либо иного приложения и т.д. ) - тут иной расклад, но тоже решаемый...

Vincent7 29-11-2013 15:27 2263822

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

K.A.V. 29-11-2013 16:08 2263844

Цитата:

Цитата Vincent7
окно консоли нужно чтобы эмулировать нажатие кнопки и посылать туда данные. »

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

Зачем эмулировать нажатие клавиши в консоли?
Зачем посылать данные в командную строку?

Если вы бы с самого начала описали, что имеете в наличии (программы/средства и т.д.) и что конкртено со всем этим нужно сделать - мы бы уже сидели и думали, как это реализовать, так проще, поверьте, чем по кускам пытаться набросать код сомнительного функционала...

Цитата:

Цитата Vincent7
Разве со скрытой командной строкой такое возможно? »

Если вы не видите окна - это не означает, что его не существует
Звучит, конечно, глупо, но для программирования - это норма :biggrin:

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


!include "WinMessages.nsh"

Caption "PressKey.exe"                       
OutFile "PressKey.exe"


Function .onInit
# Украденный код у MKN start
System::Call 'kernel32::AllocConsole(i -1)'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
# Украденный код у MKN end

FindWindow $1 "ConsoleWindowClass" "$EXEPATH"
 IsWindow $1 0 -1


FileWrite $0 "TEST started...hide window after 3 seconds"
 Sleep 3000
 ShowWindow $1 0


 FileWrite $0 "$\n$\n$\n$\n================= Hello, Vincent7 !!! ================="
 FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
 FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
 FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="


FileWrite $0 "$\n$\nwindow is shown after 3 seconds"
FileWrite $0 "$\nthis test will close after 10 seconds..."
 Sleep 3000
 ShowWindow $1 1

StrCpy $2 11
st:
intop $2 $2 - 1
StrCmp $2 -1 endtest 0
FileWrite $0 "$\n$\t$\t$\t$2..."
 Sleep 1000
 goto st
endtest:

MessageBox MB_OK|MB_ICONINFORMATION "Тест завершен"
quit
FunctionEnd
   
   

Section
SetAutoClose true
SectionEnd


vahe-91 29-11-2013 16:43 2263870

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

vosya 30-11-2013 18:30 2264461

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

пример взят из хелпа:

Цитата:

FileOpen $0 "$EXEDIR\kav_temp.txt" w
# Создаём файл в необходимом месте
# Записываем нужную информацию
FileWrite $0 "OSZone.net $\r$\n" ; Первая строка в файле
FileWrite $0 "Это пример от K.A.V. $\r$\n" ; Вторая строка в файле
FileWrite $0 "$\r$\n" ; Третяя строка в файле (пустая)
FileWrite $0 "Данный пример взят из 'Справочника по NSIS'$\r$\n" ; Четвёртая строка в файле
FileClose $0
# Закрываем файл
и ещё, что означает "w" в строке
Цитата:

FileOpen $0 "$EXEDIR\kav_temp.txt" w
и какие другие параметры существуют?

diakov 30-11-2013 19:20 2264480

Цитата:

Цитата vosya
уважаемые, подскажите как присвоить файлу атрибут "скрытый" после его создания? »

Код:

SetFileAttributes "$INSTDIR\имя_файл.exe" ARCHIVE|HIDDEN|SYSTEM|READONLY
NORMAL или FILE_ATTRIBUTE_NORMAL (или просто 0)
  ARCHIVE или FILE_ATTRIBUTE_ARCHIVE
  HIDDEN или FILE_ATTRIBUTE_HIDDEN
  OFFLINE или FILE_ATTRIBUTE_OFFLINE
  READONLY или FILE_ATTRIBUTE_READONLY
  SYSTEM или FILE_ATTRIBUTE_SYSTEM
  TEMPORARY или FILE_ATTRIBUTE_TEMPORARY

Цитата:

Цитата vosya
и ещё, что означает "w" в строке »

Открыть для записи.

Vincent7 30-11-2013 21:36 2264549

Код:

section "f"
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h'
FindWindow $1 "ConsoleWindowClass" "$EXEPATH"
IsWindow $1 0 -1

System::Call 'kernel32::AllocConsole(i -1)'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $0 "TEST"
Sleep 3000
sectionend

Не работает... что не правильно?

K.A.V. 30-11-2013 21:55 2264561

Цитата:

Цитата Vincent7
Не работает... что не правильно? »

Начинать нужно с того, что здесь (в программировании) не получится всё делать по принципу "скопировал => вставил", вы должны понимать, что вы пишите и какой результат вам это даст...

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

А по коду.
Опять же, читайте справочник :)
Смотрите, вы указываете запуск cmd
Код:

ExecDos::exec /NOUNLOAD /ASYNC /DETAILED '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h
но потом прописываете команду FindWindow на поиск окна, которого существовать не будет (не будет именно потому, что при исполнении команды выше через ExecDos в окне заголовка будет путь к cmd.exe, а не к вашему исполняемому файлу, как вы указали переменной $EXEPATH)
Код:

FindWindow $1 "ConsoleWindowClass" "$EXEPATH"
а всё потому, что окна с заголовком $EXEPATH (полный путь к вашему инсталлятору) даже теоретически не может существовать по одной простой причине - выше в коде данного окна явно нигде не заявленно, вы просто скопировали команду из моего примера, не разбираясь в синтаксисе.

Поэтому, при переходе к команде проверки существования окна:
Код:

IsWindow $1 0 -1
у вас получится бесконечный цикл, остановить который можно только либо убитием процесса, либо если появится долгожданное окно с заголовком, в котором прописан полный путь к уже запущенному вашему файлу :lamer:

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


---
Цитата:

Цитата vosya
и ещё, что означает "w" в строке »

Означает открыть файл для записи, удалив полностью его содержимое
Есть ещё флаги "r" - открытие файла для чтения и "a" - вроде как добавление данных в файл
Но лично я работал только с флагом "w", так что о том, как работать с другими флагами я не описывал в файле справки
Вот выдержка команды FileOpen из справки NSIS
Цитата:

Цитата FileOpen
Opens a file named "filename", and sets the handle output variable with the handle. The openmode should be one of "r" (read) "w" (write, all contents of file are destroyed) or "a" (append, meaning opened for both read and write, contents preserved). In all open modes, the file pointer is placed at the beginning of the file. If the file cannot be opened, the handle output is set to empty, and the error flag is set.


Vincent7 30-11-2013 22:34 2264584

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

Kopejkin 30-11-2013 22:44 2264590

Можно ли управлять (установить постоянным) размером и положением окна выбора папки установки?

В общем, у меня отображается так:



а хочется, чтобы так:



Если знаете где обсуждалось, пожалуйста, ткните в ссылку.

K.A.V. 30-11-2013 22:58 2264596

Цитата:

Цитата Vincent7
В справочнике примеров нет »

Будем спорить?
Читайте описания всех команд в разделе "Перевод справки NSIS", сколько я вам уже дал примеров команды FindWindow ???

Цитата:

Цитата Kopejkin
Можно ли управлять (установить постоянным) размером и положением окна выбора папки установки? »

Постоянным установить нельзя, т.к. это контролит сама ОС, данные хранит в реестре, вот здесь:

Код:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer
DWORD параметры Browse For Folder Height и Browse For Folder Width

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

Vincent7 30-11-2013 23:17 2264606

Зачем мне читать описания всех команд если мне нужны только конкретные? А в описании команды findwindow нет примера поиска скрытого окна.

K.A.V. 30-11-2013 23:38 2264614

Цитата:

Цитата Vincent7
Зачем мне читать описания всех команд если мне нужны только конкретные? »

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

Цитата:

Цитата Vincent7
А в описании команды findwindow нет примера поиска скрытого окна. »

Команда FindWindow и есть команда поиска окон, я же вам не зря писал ранее:
Цитата:

Цитата K.A.V.
Если вы не видите окна - это не означает, что его не существует »

Для этого и указывается класс окна и его заголовок, а то, что окно не показывается на экране это не признак того, что оно не существует, сколько вам ещё раз нужно это повторить, чтобы вы поняли?

Я вам для чего давал пример в этом сообщении? Для забавы ради? :read:
Мне кажется, там пример довольно яркий, когда вам показывается окно, туда помещается текст, затем окно скрывается на пару секунд и затем снова появляется, но уже с почти полностью заполненным текстом в окне

vosya 01-12-2013 09:21 2264746

подскажите, как назначить иконку (со ссылкой на файл shell32.dll за № 16) для созданной директории?

Цитата:

CreateDirectory "$INSTDIR\Моя папка"

K.A.V. 01-12-2013 12:33 2264813

Цитата:

Цитата vosya
подскажите, как назначить иконку (со ссылкой на файл shell32.dll за № 16) для созданной директории? »

1. Директории обязательно нужно назначить аттрибут Системный
2. Создаёте в директории файл Desktop.ini (скрытый, системный)
3. Прописываете содержимое (читайте описание команды WriteINIStr в разделе "Перевод справки NSIS => Работа с INI файлами" в справочнике):

Код:

[.ShellClassInfo]
IconFile=%SystemRoot%\system32\shell32.dll
IconIndex=16

Код:

WriteINIStr "$INSTDIR\Моя папка\Desktop.ini" ".ShellClassInfo" "IconFile" "%SystemRoot%\system32\shell32.dll"
WriteINIStr "$INSTDIR\Моя папка\Desktop.ini" ".ShellClassInfo" "IconIndex" "16"


vosya 01-12-2013 15:11 2264885

K.A.V., директория создаётся, но значок стандартный

Цитата:

CreateDirectory "$STARTMENU\Документы"
FileOpen $0 "$STARTMENU\Документы\Desktop.ini" w
FileWrite $0 "[.ShellClassInfo]$\r$\n"
FileWrite $0 "IconFile=%SystemRoot%\system32\shell32.dll$\r$\n"
FileWrite $0 "IconIndex=126$\r$\n"
FileClose $0
WriteINIStr "$STARTMENU\Документы\Desktop.ini" ".ShellClassInfo" "IconFile" "%SystemRoot%\system32\shell32.dll"
WriteINIStr "$STARTMENU\Документы\Desktop.ini" ".ShellClassInfo" "IconIndex" "126"
SetFileAttributes "$STARTMENU\Документы\Desktop.ini" HIDDEN|SYSTEM
не пойму где ошибка?

MKN 01-12-2013 16:01 2264914

Возможно ли c помощью NSIS, организовать замену в файле, одних байт на другие ? ( Т.е. - заменить в файле по такому то адресу, имеющееся значение - на другое)
Если нет, то вопрос не совсем в тему - есть ли для этого, какой то утиль командной строки ?

K.A.V. 01-12-2013 16:06 2264919

Цитата:

Цитата vosya
не пойму где ошибка? »

В вашей невнимательности

Цитата:

Цитата K.A.V.
1. Директории обязательно нужно назначить аттрибут Системный »

Добавить:
Код:

SetFileAttributes "$STARTMENU\Документы" SYSTEM
И зачем вам это??
Код:

FileOpen $0 "$STARTMENU\Документы\Desktop.ini" w
 FileWrite $0 "[.ShellClassInfo]$\r$\n"
 FileWrite $0 "IconFile=%SystemRoot%\system32\shell32.dll$\r$\n"
 FileWrite $0 "IconIndex=126$\r$\n"
 FileClose $0

Вы же прописали ниже
Код:

WriteINIStr "$STARTMENU\Документы\Desktop.ini" ".ShellClassInfo" "IconFile" "%SystemRoot%\system32\shell32.dll"
WriteINIStr "$STARTMENU\Документы\Desktop.ini" ".ShellClassInfo" "IconIndex" "126"

Читайте тоже справку, и главное тесты, очень много тестов


---
Цитата:

Цитата MKN
Возможно ли c помощью NSIS, организовать замену в файле, одних байт на другие ? ( Т.е. - заменить в файле по такому то адресу, имеющееся значение - на другое)
Если нет, то вопрос не совсем в тему - есть ли для этого, какой то утиль командной строки ? »

Насчет этого ничего не знаю, таким вопросом не задавался, твоя надежда на kotkovets :)

MKN 01-12-2013 16:21 2264930

Цитата:

Цитата K.A.V.
таким вопросом не задавался, твоя надежда на kotkovets »

А вопрос то интересный... К примеру, можно простой заменой одного на другое, в ярлыке установить свойство - "запускать от имени администратора". Сейчас для этого предлагается или громоздский код, или плагин. А был бы способ байтозамены, может было бы проще...

Vincent7 01-12-2013 17:05 2264950

Уважаемый K.A.V, не получается у меня..
Код:

System::Call 'kernel32::GetStdHandle(i -11)i.r0'
System::Call 'kernel32::AllocConsole(i -1)'
FileWrite $0 "TEST"

этот код создает второе окно а в мое не записывает

K.A.V. 01-12-2013 19:32 2265022

Цитата:

Цитата MKN
К примеру, можно простой заменой одного на другое, в ярлыке установить свойство - "запускать от имени администратора" »

Я в такие тонкости не вникал и не знаю о таких возможностях, мне NSIS нужен только для написания SFX Creator'а, я на NSIS ни одного инсталляционного пакета не собрал :biggrin: , не считая все те тесты, которые были сделаны мной в момент изучения возможностей NSIS

Команы FileReadByte и FileWriteByte не то в оригинальной справке к NSIS? Я просто инглиша не знаю, а гугл не особо помогает в техническом переводе правильно понять смысл...
Я, честно сказать, вообще не в теме, т.к. такими вопросами не занимался...HEX, байты и т.д. мне не интересны :)
не то?, там наш коллега amel27 советует DD


---
Цитата:

Цитата Vincent7
этот код создает второе окно а в мое не записывает

И не должен...Какой смысл вам давать готовые коды, если вы всё равно не желаете понимать ни смысла функций ни то, что и как писать? Зачем тогда вы пришли программировать без желания обучаться и узнавать что-то новое?
Если вам банально лень - то мне тоже лень сидеть и писать для вас готовые коды, в которых вы даже не желаете разбираться, ctrl+c => ctrl+v всем нравится
Чтобы вам писать в уже существующий процесс, вам нужно вызывать дополнительно AttachConsole и посылать этой функции PID процесса

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

Код:

Caption "PressKey.exe"                       
OutFile "PressKey.exe"


Function .onInit
FindWindow $0 "ConsoleWindowClass" "Администратор: $SYSDIR\cmd.exe"
 ; Ищем консольное окно, в котороее будем отправлять информацию

 IsWindow $0 +2 0
; Если окно найдено - продолжаем, если нет - сообщение с ошибкой и закрытие приложения
MessageBox MB_OK|MB_ICONSTOP "Окно не найдено" idok exit

System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
; По найденному handle окна определяем PID процесса, к которому принадлежит окно

System::Call 'kernel32::AttachConsole(ir0)i.r0'
; В команду AttachConsole послыаем PID процесса, чтобы писать именно в нашу командную строку

System::Call 'kernel32::GetStdHandle(i -11)i.r0'
; Получаем дескриптор ввода данных консоли

FileWrite $0 "TEST started...hide window after 3 seconds"
 FileWrite $0 "$\n$\n$\n$\n================= Hello, Vincent7 !!! ================="
 FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
 FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
 FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
; Записываем информацию в консоль

MessageBox MB_OK|MB_ICONINFORMATION "Готово"
exit:
quit
FunctionEnd



я лучше пойду покушаю бетку SFX Creator'а своего писать

kotkovets 01-12-2013 21:15 2265086

Цитата:

Цитата MKN
Возможно ли c помощью NSIS, организовать замену в файле, одних байт на другие ? »

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

Vincent7 01-12-2013 21:51 2265104

Код:

section "f"
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h'
FindWindow $1 "$SYSDIR\cmd.exe"
IsWindow $1 +2 0
MessageBox MB_OK|MB_ICONSTOP "not found" idok
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
System::Call 'kernel32::AttachConsole(ir0)i.r0'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $1 "TEST"
sectionend

'not found'. не находит...

kotkovets 01-12-2013 22:18 2265124

Vincent7, а с чего работать будет, с какого перепуга?
ExecDos отработает и усё - нет никакого окна после плага, видимого и невидимого :read:
нужно, запускать не в режиме ожидания выполнения процесса..
Код:

Section
  Exec 'cmd.exe /c "путь к файлу exe"'
  sleep 500 ;пауза, чтобы окно "споймать"
  FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
  IsWindow $0 0 exit
  System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
  System::Call 'kernel32::AttachConsole(ir0)i.r0'
  System::Call 'kernel32::GetStdHandle(i -11)i.r0'
  FileWrite $0 "TEST"
  exit:
SectionEnd

---
Вообще для чего это нужно, озвучьте?

K.A.V. 01-12-2013 22:35 2265139

Цитата:

Цитата kotkovets
Вообще для чего это нужно, озвучьте? »

Думаю, не стоит спрашивать, ибо тут сразу было видно - человек ни в какую не хочет разбираться в этом всём, человек не понимает для чего и что он пишет, взять хотябы:

Цитата:

Цитата Vincent7
FindWindow $1 "$SYSDIR\cmd.exe" »

Он упёрто отказывается читать в файле справки, в котором ясно написано - второй параметр в команде FindWindow - это класс окна, а он там указывает имя окна

Цитата:

Цитата Vincent7
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
System::Call 'kernel32::AttachConsole(ir0)i.r0'
System::Call 'kernel32::GetStdHandle(i -11)i.r0' »

Не будет работать по одной простой причине (не понимаете, что для чего, нужно было в FindWindow изменить переменную на $0), вы опять невнимательно пользуетесь функцией "Копировать => Вставить", я бы вырезал данную возможность из ОС у таких "программистов", я даже боюсь за пользователей, которые получат ваш горе инсталлятор, в котором случайно можно перепутать переменные и под админом натворить чудес

Цитата:

Цитата Vincent7
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $1 "TEST" »

Опять же, несоответствие

Разве в моём примере было так? :(


---
Цитата:

Цитата kotkovets
ExecDos отработает и усё - нет никакого окна после плага, видимого и невидимого
нужно, запускать не в режиме ожидания выполнения процесса.. »

Не, там фишка с ключем /NOUNLOAD /ASYNC, если их указать, то плаг запустить процесс параллельно установщику ;)

kotkovets 01-12-2013 22:45 2265147

Цитата:

Цитата K.A.V.
Не, там фишка с ключем /NOUNLOAD /ASYNC, если их указать, то плаг запустить процесс параллельно установщику »

Цитата:

Цитата K.A.V.
упёрто отказывается читать в файле справки, в котором ясно написано - второй параметр в команде FindWindow - это класс окна, а он там указывает имя окна »

ну если это фишка...
значит не судьба Vincent7 :not-me:

Vincent7 02-12-2013 01:13 2265253

Код:

section "f"
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h'
sleep 3000
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
IsWindow $0 +2 0
MessageBox MB_OK|MB_ICONSTOP "not found" idok
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
System::Call 'kernel32::AttachConsole(ir0)i.r0'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $0 "Test"
sectionend

теперь все правильно, вроде как находит окно, но по идее слово test должно появится в nsisном окне установки файлов, а оно не появляется. и установщик переходит в статус 'выполнено'

K.A.V. 02-12-2013 01:31 2265260

Цитата:

Цитата Vincent7
но по идее слово test должно появится в nsisном окне установки файлов »

:o это с какого такого такого такого...оно должно там появиться, если вы отправляете текст в консоль, а не напрямую в NSIS элемент?

Вы хотите что сделать, чтобы запустить консоль, отправить туда текст, а потом чтобы ваше консольное приложение его прочитало и отобразило в NSIS окне? :o

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

Цитата:

Цитата Vincent7
и установщик переходит в статус 'выполнено' »

Конечно переходит, вы же сами просили запустить консольное приложение параллельно установщику

:shot:

Vincent7 02-12-2013 01:41 2265264

плагин execDos с параметром /DETAILED отправляет содержимое командной сроки окну установщика

kotkovets 02-12-2013 02:18 2265270

Vincent7, скажу просто: не тупите!
а то цирк уехал, а клоуны остались..

MKN 06-12-2013 16:12 2268093

Вызов диалогового окна выбора файлов

Пример для '*.nsi;*.nsh'

Код:

Caption "Диалоговоое окно выбора файлов"
OutFile "OpenFile_Test.exe"
SilentInstall silent

!define OFN_READONLY                0x00000001
!define OFN_OVERWRITEPROMPT          0x00000002
!define OFN_HIDEREADONLY            0x00000004
!define OFN_NOCHANGEDIR              0x00000008
!define OFN_SHOWHELP                0x00000010
!define OFN_ENABLEHOOK              0x00000020
!define OFN_ENABLETEMPLATE          0x00000040
!define OFN_ENABLETEMPLATEHANDLE    0x00000080
!define OFN_NOVALIDATE              0x00000100
!define OFN_ALLOWMULTISELECT        0x00000200
!define OFN_EXTENSIONDIFFERENT      0x00000400
!define OFN_PATHMUSTEXIST            0x00000800
!define OFN_FILEMUSTEXIST            0x00001000
!define OFN_CREATEPROMPT            0x00002000
!define OFN_SHAREAWARE              0x00004000
!define OFN_NOREADONLYRETURN        0x00008000
!define OFN_NOTESTFILECREATE        0x00010000
!define OFN_NONETWORKBUTTON          0x00020000
!define OFN_NOLONGNAMES              0x00040000
#if(WINVER >= 0x0400)
!define OFN_EXPLORER                0x00080000    ; new look commdlg
!define OFN_NODEREFERENCELINKS      0x00100000
!define OFN_LONGNAMES                0x00200000
!define OFN_ENABLEINCLUDENOTIFY      0x00400000
!define OFN_ENABLESIZING            0x00800000
#endif /* WINVER >= 0x0400 */
#if (_WIN32_WINNT >= 0x0500)
!define OFN_DONTADDTORECENT          0x02000000
!define OFN_FORCESHOWHIDDEN          0x10000000
#endif // (_WIN32_WINNT >= 0x0500)

!define OPENFILENAME "(i,i,i,i,i,i,i,i,i,i,i,t,t,i,i,i,t,i,i,t,*v,i,i) i"

Section
Push `${OFN_ALLOWMULTISELECT}|${OFN_EXPLORER}`    ;Flags
Push `Откройте файл`    ;lpstrTitle
System::Call "*(&t1024) i .r1"      ;lpstrFile
System::Call "*(&t25 'NSIS файл (*.nsi, *.nsh)', &t12 '*.nsi;*.nsh', &t9 'Все файлы', &t5 '*.*') i .r2"  ;lpstrFilter
System::Call "Kernel32::GetModuleHandle(i) i.s"    ;hInstance
Push $HWNDPARENT  ;hwndOwner
System::Call "*${OPENFILENAME}(76,s,s,r2,,,0,r1,1024,,,,s,s,_) i.r0"
System::Call "Comdlg32::GetOpenFileName(i r0) i.r3"
StrCmp $3 0 0 +3
MessageBox MB_ICONINFORMATION|MB_OK "    Вы не выбрали файл !"
Goto done
System::Call "*$1(&t1024 .r3)"
System::Call "*$0${OPENFILENAME}(,,,,,,,,,,,,,,.r4,_)"
IntOp $4 $4 - 1
StrLen $5 $3
StrCmp $4 $5 +3
MessageBox MB_ICONINFORMATION|MB_OK "Вы выбрали файл: $3"
Goto done
MessageBox MB_ICONINFORMATION|MB_OK "Вы выбрали в каталоге $3 , следующие файлы :"
StrCpy $5 $1
loop:
StrLen $4 $3
IntOp $5 $5 + $4
IntOp $5 $5 + 1
System::Call "*$5(&t1024 .r3)"
StrCmp $3 "" done
MessageBox MB_ICONINFORMATION|MB_OK "$3"    ;Цикл для имен выбранных файлов
Goto loop
done:
System::Free $0
System::Free $1
System::Free $2
SectionEnd


K.A.V. 06-12-2013 16:36 2268104

Цитата:

Цитата MKN
Вызов диалогового окна выбора файлов
Пример для '*.nsi;*.nsh' »

Не знаю, как остальные, но лично я противник таких "жирных кодов", какой в них смысл?
Есть замечательные плагины типа Dialogs plug-in, которые позволяют сократить количество строк в коде до пары (1 строка вызов команды + ваш остальной код)
Неужели вас страшит лишние пары десятков Кб из-за добавления DLL плагина в пакет? :)

Я, конечно, понимаю, что WinAPI это хорошо, но мне кажется только тогда - когда это необходимо и нечем заменить нужный функционал
А использовать тонны кода для простеньких задач это как-то не айс, тем более кто лично в этой теме реально понимает, что ты написал? ;)

Ты, я, Вячеслав и ещё возможно пара человек, которые реально хотят кодить на NSIS и которые полностью прочитали наш справочник, включая описание System.dll и сидящие на MSDN для изучения WinAPI функций, есть вообще такие здесь?

Я, честно признаюсь, раньше не использовал System.dll по одной простой причине - сложно было понять англ.доки по нему и читал описание данного плага из нашего же справочника :biggrin:, благодаря переводу Вячеслава я совсем недавно уже начал иногда применять system.dll в своём же "креаторе", мне раньше было проще написать dll, сейчас уже практически всё наоборот

Ты бы лучше взял и оформил все свои примеры, которые здесь выкладываешь, в стиле нашего справочника, редактить html не так уж и сложно через визуальные редакторы, я , к примеру использую лёгкий NVU - вполне сходит для создания и оформления лёгких страничек для справочников :)

MKN 06-12-2013 16:58 2268116

Цитата:

Цитата K.A.V.
но лично я противник таких "жирных кодов", какой в них смысл? »

Смысл - в познании нового, в привлечении и развитии интереса пользователей к творческому процессу. Вдруг кто то захочет плагинчик сделать ? :) Более совершенный чем тот же Dialogs plug, который конечно хорош, но лишён гибкости, в отличии от вышеприведённого кода.
Я тоже не люблю жирных кодов и без нужды не использую. Но любой такой жиряга - это и есть внутренности плагинов и хедеров, которыми все с удовольствием пользуются, потому что этот жиропродукт в итоге позволяет обойтись парой строк кода... :)
Цитата:

Цитата K.A.V.
Ты бы лучше взял и оформил все свои примеры, которые здесь выкладываешь »

Имеются ввиду API_шные ? Какой из меня учитель... Я сам только учусь. Если уж кто и сможет грамотно научить , то это Вячеслав...

areafix 07-12-2013 11:10 2268418

Скажите, можно ли через NSIS сделать выбор типа/режим установки, ПЕРЕД выбором компонентов



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

можно ли это сделать стандартными средствами (пока не удалось найти как)?, если да/нет то в какую хоть сторону копать?

kotkovets 07-12-2013 12:04 2268447

Цитата:

Цитата areafix
можно ли это сделать стандартными средствами (пока не удалось найти как)?, если да/нет то в какую хоть сторону копать? »

1. » nsDialogs: Создаем собственные страницы инсталлятора
2. » Логические конструкции в скриптах NSIS в справочнике
3. » Создание своего инсталлятора на NSIS. Секции и выбор компонентов
4. » Читаем про свойства флагов секций: скрытие, переименование, отметки
изменяем флаги (свойства секций) в зависимости от отметки радиобутонов
естественно все это делаем до показа странички компонентов.
Код:

Section
  ${If} $radio1 == 1

        ;куча команд
        ;если отмечен первый флажок

  ${ElseIf} $radio2 == 1

        ;куча команд
        ;если отмечен второй флажок

  ${EndIf}
SectionEnd


wolkow70 07-12-2013 19:15 2268589

Можно ли в стандартном окне мессадж-бокса
MessageBox MB_YESNO|MB_USERICON|MB_TOPMOST
заменить надписи "да" и "нет" на кнопках на свои?
Мне например нужно, чтобы отображалось "32" и "64".
Не могу найти ничего по этому вопросу.

MKN 07-12-2013 19:51 2268619

Цитата:

Цитата wolkow70
Можно ли в стандартном окне мессадж-бокса
MessageBox MB_YESNO|MB_USERICON|MB_TOPMOST
заменить надписи "да" и "нет" на кнопках на свои? »

В стандартных вряд ли... Но был занятный плагин - MessageBox Plug-In, где это можно делать.

MKN 11-12-2013 12:23 2270557

Ещё раз об индикации PrоgressBar_ом - реального процесса установки. Т.е. - сколько чего установилость - столько и отобразилось.
Метод вставки в код, команд приращения прогресса - громоздкий и не точный.
А если сделать так :
Зная объём устанавливаемых данных и вычислив объём свободного пространства на целевом диске - контролировать в процессе установки изменение объёмв целевого диска. И исходя из этого изменения - изменять длину полосы индикатора PB.
Как это лучше реализовать на практике ?

Vincent7 11-12-2013 15:26 2270671

В справочнике имеется код создания лога установки... можно ли его переделать чтобы он считывал данные из командной строки и выводил их в окне установки файлов? exec dos плагин не может одновременно работать с параметрами /tofunc и /detailed... помогите.

K.A.V. 11-12-2013 17:33 2270778

Цитата:

Цитата MKN
Зная объём устанавливаемых данных и вычислив объём свободного пространства на целевом диске - контролировать в процессе установки изменение объёмв целевого диска. И исходя из этого изменения - изменять длину полосы индикатора PB.
Как это лучше реализовать на практике ? »

А багнутый прогресс не получится? Если, к примеру, будет другая активность на разделе? Твой прогресс просто умрёт, разве нет?
Разве что ты постоянно будешь знать количество уже скопированных данных либо сколько осталось скопировать, но думаю это тоже будет проблемно контролить

Цитата:

Цитата MKN
Как это лучше реализовать на практике ? »

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

Цитата:

Цитата Vincent7
В справочнике имеется код создания лога установки... можно ли его переделать чтобы он считывал данные из командной строки и выводил их в окне установки файлов? exec dos плагин не может одновременно работать с параметрами /tofunc и /detailed... помогите. »

При использовании "/tofunc" у вас появляется возможность использовать всё, что только захотите, но вы же не хотите изучать что-то новое, поэтому ссылки вам кидать бесполезно
В функции при "/tofunc" вы можете вручную "кидать" данные в лог установки, который отображается на страничке прогресса установки, через использование сообщений Windows, а именно через LB_ADDSTRING

Небольшой пример, как добавить данные в ListBox прогресса установки (этот код у меня в моём проекте, поэтоме переменные менять не буду, а описание сообщений Windows читайте в MSDN)
Код:

SendMessage $R8 ${LB_ADDSTRING} 0 `STR:$2`
SendMessage $R8 ${LB_GETCOUNT} 0 0 $3
IntOp $3 $3 - 1
SendMessage $R8 ${LB_SETTOPINDEX} $3 0

$R8 - HWND элемента ListBox
$2 - текст строки, которая добавляется
$3 - количество уже существующих строк

kotkovets 11-12-2013 19:29 2270868

Цитата:

Цитата MKN
Зная объём устанавливаемых данных и вычислив объём свободного пространства на целевом диске - контролировать в процессе установки изменение объёмв целевого диска. И исходя из этого изменения - изменять длину полосы индикатора PB.
Как это лучше реализовать на практике ? »

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

MKN 12-12-2013 11:00 2271201

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

Код:

outfile KeyboardLayout.exe

!macro LoadLangLayout LangID
!define Index "Line${__LINE__}"
  StrCpy $8 "${LangID}" "" 2
  StrCpy $8 "0000$8"
  System::Alloc ${NSIS_MAX_STRLEN}
  Pop $R0
  System::Call 'user32::GetKeyboardLayoutList(i ${NSIS_MAX_STRLEN}, i R0)i.r0'
  StrCpy $9 1

  loop-${Index}:
    System::Call '*$R0(i .r1)'
      IntFmt $2 "%08x" $1
      StrCpy $3 $2 "" -4
      StrCpy $4 "0x$3"
      IntOp $R0 $R0 + 4
    StrCmp $4 ${LangID} macro_end_${Index}
    StrCmp $9 $0 loop_end-${Index}
    IntOp $9 $9 + 1
    Goto loop-${Index}

  loop_end-${Index}:
    System::Call 'user32::LoadKeyboardLayoutA(t r8, i 1)i.r0'
  macro_end_${Index}:
    System::Call 'user32::ActivateKeyboardLayout(i ${LangID}, i 8)i.r0'
!undef Index
!macroend

Section
; установка EN
!insertmacro LoadLangLayout 0x0409
SectionEnd

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

wolkow70 12-12-2013 16:02 2271353

Товарищи правильно ли я понял, что макросы редиректора WOW64
${EnableX64FSRedirection}
${DisableX64FSRedirection}
на системе windows 8.1 не работают?

kotkovets 12-12-2013 19:11 2271454

Цитата:

Цитата wolkow70
на системе windows 8.1 не работают? »

все работает

Vincent7 12-12-2013 20:45 2271496

K.A.V., боюсь что мне все таки нужен код логирования без использования /tofunc ... как я вам писал, после нажатия enter ничего не отправляется в окно установки...
Код:

Function LogFunction
IntOp $1 $1 + 1
Pop $2
FunctionEnd


section "f"
StrCpy $1 0
GetFunctionAddress $0 LogFunction
ExecDos::exec /NOUNLOAD /ASYNC /TOFUNC '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h' "D:\h" $0
sleep 3000
Pop $0
Pop $2
${If} $2 = "INFO : Please insert path of folder with depot 222481 version 300092705199761674 manifest (222481_300092705199761674.manifest)"
MessageBox MB_OK|MB_ICONSTOP "$2" idok
${Else}
enter:
FindWindow $3 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
SendMessage $3 ${WM_CHAR} "0x0D" "0"
sleep 60
${If} $2 = "INFO : Please insert path of folder with depot 222481 key file (222481.depotkey)"
MessageBox MB_OK|MB_ICONSTOP "$2" idok
goto end
${Else}
goto enter
${EndIf}
${EndIf}
end:
sectionend

не работает :(

K.A.V. 12-12-2013 23:05 2271559

Цитата:

Цитата Vincent7
K.A.V., боюсь что мне все таки нужен код логирования без использования /tofunc »

Цитата:

Цитата K.A.V.
В функции при "/tofunc" вы можете вручную "кидать" данные в лог установки, который отображается на страничке прогресса установки, через использование сообщений Windows, а именно через LB_ADDSTRING »

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

Я вам в миллионный раз повторяю, читайте наш Справочник, читайте MSDN для знакомства с сообщениями Windows (в предыдущем посте я вас натолкнул на решение вашей задачи)
Но, видимо, вам всё ещё лень сидеть, читать и разбираться

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

А "помогать" лично вам, лично у меня уже нет желания, потому что:
1. Вы упорно отказываетесь читать и изучать то, что вам советуют
2. На протяжении всего времени по поводу вашей задачи вы так и не объяснили суть того, что нужно сделать: какой софт имеете, какие задачи стоят и какой функционал реализовать в какой последовательности

А насчет лички у меня одинаковое отношение ко всем - читайте подпись
Цитата:

Не оказываю техподдержку в PM, через Skype и по электронной почте - для этого есть форум
Помогать кому-то индивидуально я могу только в очень редких случаях и не таким ленивцам, как вы

Vincent7 13-12-2013 01:26 2271612

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

kotkovets 13-12-2013 01:54 2271616

Vincent7, ну не судьба, зачем насиловать себе мозг и K.A.V. ?

wolkow70 13-12-2013 13:13 2271769

Цитата:

Цитата kotkovets
на системе windows 8.1 не работают? »
все работает »

Пробую запускать на windows 8.1x64 после ${EnableX64FSRedirection} и ${DisableX64FSRedirection}проводник, редактор реестра и значение переменной $SYSDIR и все показывает только на 64 разрядную часть системы.
например:

${DisableX64FSRedirection}
Exec "explorer.exe"
${EnableX64FSRedirection}
Exec "explorer.exe"
Запускается проводник из C:\Windows\explorer.exe в обоих случаях.
Тоже с редактором реестра.

или:
${EnableX64FSRedirection}
MessageBox MB_OK $SYSDIR
${DisableX64FSRedirection}
MessageBox MB_OK $SYSDIR

В обоих случаях $SYSDIR = C:\Windows\System32

MKN 13-12-2013 15:36 2271847

Цитата:

Цитата Vincent7
после нажатия enter ничего не отправляется в окно установки... »

Попробуй установить задержку перед "нажатием" . Иногда консольное окно появляется с задержкой . Можно попробовать "поймать" его и сделать передним планом.
Сообщения WM_SETTEXT почему то не передаются в консольное окно (у меня так, может чего не учёл...)
Говорят, можно использовать WM_COPYDATA или SendMessageTimeout, не пробовал, да и возиться неохота...

Но можно "набрать" команду в консоли с помощью WM_CHAR. Лажа вообщем то, но работает... Например, пошлём в консоль и выполним команду DIR :
Код:

OutFile ConsoleWindow.exe
!include "WinMessages.nsh"

Section
Exec "$SYSDIR\cmd.exe"
loop:
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
IsWindow $0 0 loop
System::Call 'user32::SetForegroundWindow(i r0)'
; так просто, нажмём Enter...
Sleep 300
SendMessage $0 ${WM_CHAR} "0x0D" "0"
; таперича наберём DIR
Sleep 100
SendMessage $0 ${WM_CHAR} 0x44  "0"
Sleep 100
SendMessage $0 ${WM_CHAR} 0x49  "0"
Sleep 100
SendMessage $0 ${WM_CHAR} 0x52  "0"
Sleep 300
SendMessage $0 ${WM_CHAR} "0x0D" "0"
SectionEnd

Только до сих пор не ясно - зачем тебе всё это надо именно в таком извращённо-консольном варианте ? Неужели нельзя организовать выполнение команд из скрипта без консольных посредников ?

Vincent7 14-12-2013 00:37 2272142

MKN, я делаю так
Код:

!include "WinMessages.nsh"

OutFile "Test.exe"
ShowInstDetails show



section "f"
ExecDos::exec /NOUNLOAD /ASYNC /Detailed '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h'
sleep 2000
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
System::Call 'kernel32::AttachConsole(ir0)i.r0'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
FileWrite $0 "D:\h"
sleep 2000
enter:
SendMessage $0 ${WM_CHAR} "0x0D" "0"
sleep 60
goto enter
sectionend

но не работает. этот код постоянно посылает в консоль нажатие' enter', и должно по идее постоянно логироватся соответствующее сообщение консольной программы, но это не происходит. С плагином execCmd- работает но там нет параметра записи данных в nsis окно, вот мне и нужен код который бы это делал...

K.A.V. 14-12-2013 02:41 2272197

Цитата:

Цитата Vincent7
MKN, я делаю так »

Вы перепутали местами строки в своём коде, до сих пор не понимаете, что пишите, а желания вам размусоливать нет - толку 0, вы всё равно это пропустите мимо ушей
Цитата:

Цитата Vincent7
но не работает »

Код:

FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
System::Call 'kernel32::AttachConsole(ir0)i.r0'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $0 "D:\h"

Я вам столько пытаюсь объяснить, помочь, а вы так упорно сопротивляетесь...прям жалко становится, что силы мои здесь напрасно уходят без пользы вам, эх... :cry:

Цитата:

Цитата Vincent7
С плагином execCmd- работает но там нет параметра записи данных в nsis окно »

Параметров вам и не дадут, а вот написать свой механизм можно, поэтому я вам и писал ранее использовать "/tofunc", но вы даже не старались

Цитата:

Цитата MKN
Только до сих пор не ясно - зачем тебе всё это надо именно в таком извращённо-консольном варианте ? »

Спортивный интерес видать, может, заслан с другого форума чтобы проверить силы кодеров осзоновцев на NSIS и посмотреть, сможем ли мы написать? :biggrin:

Vincent7 14-12-2013 13:31 2272320

Код:

Caption "PressKey.exe"
OutFile "PressKey.exe"
Function .onInit
FindWindow $0 "ConsoleWindowClass" "Администратор: $SYSDIR\cmd.exe"
 ; Ищем консольное окно, в котороее будем отправлять информацию
 IsWindow $0 +2 0
; Если окно найдено - продолжаем, если нет - сообщение с ошибкой и закрытие прил
MessageBox MB_OK|MB_ICONSTOP "Окно не найдено" idok exit
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
; По найденному handle окна определяем PID процесса, к которому принадлежит окно
System::Call 'kernel32::AttachConsole(ir0)i.r0'
; В команду AttachConsole послыаем PID процесса, чтобы писать именно в нашу кома
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
; Получаем дескриптор ввода данных консоли
FileWrite $0 "TEST started...hide window after 3 seconds"
 FileWrite $0 "$\n$\n$\n$\n================= Hello, Vincent7 !!! ===============
 FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
 FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
 FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
; Записываем информацию в консоль

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

K.A.V. 14-12-2013 15:32 2272376

Цитата:

Цитата Vincent7
вы же мне код давали... »

Мой работает, ваш нет - вывод какой?

Цитата:

Цитата Vincent7
что я перепутал? »

Вы вообще видите, что я вам написал в предыдущем сообщении? Я там сам для себя строки жирным шрифтом выделил?

Очки наденьте :read:

тяжелый случай, у меня не хватит терпения, я пожалуй пас...

Цитата:

Цитата K.A.V.
до сих пор не понимаете, что пишите, а желания вам размусоливать нет - толку 0, вы всё равно это пропустите мимо ушей »


Kopejkin 14-12-2013 15:51 2272386

Vincent7, после первой строки === Hello, Vincent7 !!!== поставьте кавычки ( " ). Дальше - не знаю, т.к. приведенный огрызок даже не скомпилируется.

K.A.V. 14-12-2013 16:16 2272400

Цитата:

Цитата Kopejkin
Дальше - не знаю, т.к. приведенный огрызок даже не скомпилируется. »

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

Вот мой код и очень даже рабочий... 817

Kopejkin 14-12-2013 17:01 2272419

Цитата K.A.V.:
Цитата:

...мой код »
Я знаю.
Цитата K.A.V.:
Цитата:

...Он бы уже давно справился... »
Цитата K.A.V.:
Цитата:

...Если вы (Vincent7) бы с самого начала описали, что имеете в наличии (программы/средства и т.д.) и что конкретно со всем этим нужно сделать - мы бы уже сидели и думали, как это реализовать... »
Vincent7, неужели так трудно было уделить немного времени, из того, что уже прошло впустую, и, хотя бы для себя самого, составить внятный перечень требуемого функционала и получаемых от него в результате возможностей? Опять же копипастить удобнее.

vosya 15-12-2013 14:29 2272632

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

итак, при запуске надо обратиться к файлу settings.ini, находящемуся по адресу
$WINDIR\MYPROGRAM\ и если его нет, то завершить работу.

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

при этом settings.ini может редактироваться...

вот примерное содержимое ini-файла:
Цитата:

[SMPROGRAMS] ; куда поместить ярлык
TARGET="TOTAL\TotalCmd.exe" ; путь к исполняемому файлу относительно settings.ini
SHORTCUT="Total Commander" ; название ярлыка
DESCRIPTION="Популярный файловый менеджер" ; описание ярлыка

[DESKTOP]
TARGET="WINRAR\WinRAR.exe"
SHORTCUT="WinRAR"
DESCRIPTION="Надежный архиватор"

[SMPROGRAMS]
TARGET="ПАПКА_1\ПОДПАПКА_2\Программа.exe"
SHORTCUT="Моя программа"
DESCRIPTION="Нужная програмка для дома"

[DESKTOP]
TARGET="ПАПКА_1\ПОДПАПКА_2\Программа.exe"
SHORTCUT="Моя программа"
DESCRIPTION="Нужная програмка для дома"
... и так далее

Vincent7 15-12-2013 15:30 2272668

Объясняю. Имею консольную программу распаковщик. Туда нужно вводить команды, нажать' enter' он и начнет распаковывать. С помощью nsis я хочу все это автоматизировать и упростить, сделать GUI к этой программе.
P.S. извиняюсь за криво скопированный код K.A.V.'а, копировал с мобильного телефона т.к. был на работе, а копировать с оперы мини неудобно.
P.P.S. Я поменял строки в своем коде на правильный порядок, но все равно не работает.

MKN 15-12-2013 17:07 2272718

Цитата:

Цитата vosya
Прошу помочь в написании скрипта для чтения ini-файла, и исходя из его содержимого »

Уже помогли - Это : Справочник по NSIS - Работа с INI файлами
Там же есть примеры создания ярлыков.

Цитата:

Цитата Vincent7
Имею консольную программу распаковщик. Туда нужно вводить команды, нажать' enter' он и начнет распаковывать. С помощью nsis я хочу все это автоматизировать и упростить, сделать GUI к этой программе. »

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

Vincent7 15-12-2013 17:15 2272722

Это я и пытаюсь сделать...

MKN 15-12-2013 17:29 2272735

Vincent7,
Попробуй сам реализовать хотя бы такой примитивный сценарий :
На кастомной странице создай пару обзорных кнопок - одну выбрать файл для распаковки, вторую - указать целевой путь для распакованного. Можешь добавить текстовые поля для ручного ввода путей.
Путевые данные из переменных включи в команду распаковки. А саму распаковку запускай (можешь с помощью уже известных тебе плагинов) ещё одной кнопкой.
Для начала всё.
Потом уже добавляй нюансы распаковки, наверняка задаваемые разными ключами. И назови в конце концов, что это за такой у тебя рапаковщик и чего он должен делать...

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

Vincent7 15-12-2013 17:43 2272745

Я хочу для начала разобраться с отправкой в консоль команд, а потом уже все остальное прокручивать. Но пока не выходит :(

MKN 15-12-2013 17:47 2272747

Цитата:

Цитата Vincent7
Я хочу для начала разобраться с отправкой в консоль команд, »

Стесняюсь спросить - а на хрена тебе консоль ? Если для поставленной тобой задачи , консоль совершенно не нужна...

Vincent7 15-12-2013 17:51 2272751

А как же тогда делать? Ведь программа консольная... вот, посмотрите http://cs.rin.ru/forum/download/file.php?id=13154

K.A.V. 15-12-2013 18:35 2272782

Цитата:

Цитата Vincent7
Объясняю. Имею консольную программу распаковщик. Туда нужно вводить команды, нажать' enter' он и начнет распаковывать. »

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

Цитата:

Цитата Vincent7
А как же тогда делать? Ведь программа консольная... »

Вы могли это выложить в самом первом своём сообщении, о чем вас здесь постоянно просили, сказать, что имеете и что нужно реализовать?
Ваша задача решается за 1 минуту без "необходимых" вам извращений в коде

Создайте bat-файл следующего содержания:
Код:

sisInstall
pause

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

Что такое bat-файл читайте также в интернете, готовый вам давать не буду

Vincent7 16-12-2013 09:53 2273060

K.A.V., а на что мне этот bat файл если мне нужно gui создать..

K.A.V. 16-12-2013 10:53 2273084

Цитата:

Цитата Vincent7
K.A.V., а на что мне этот bat файл если мне нужно gui создать.. »

:shot:

Цитата:

Цитата K.A.V.
Прочитайте в интернете о том, что такое консольная программа »

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

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

1. Научитесь искать информацию в интернете
2. Научитесь слушать и прислушиваться к тем, у кого сами просите помощи, по крайней мере в этой теме - всё, что вам здесь будут советовать просто так не пишется, во всём будет смысл. Если я вам сказал, что вам нужно сделать bat-файл и запустить его в папке с вашей программой - значит это не просто так

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

Begin2Fly 16-12-2013 16:08 2273259

kotkovets, прошу прощения за беспокойство, снова проблема с WinVer2.
Windows XP x86 со старой версией библиотеки определялась нормально - как "WinXP", теперь же это "Win32s". Баг?
NSIS 3.0a1, Unicode.

Vincent7 16-12-2013 17:40 2273313

K.A.V., от этого батника мне пользы никакой нет. Я же писал- хочу автоматизировать и упростить процесс распаковки. Понимаете, в процессе программа будет просить нужные файлы, просить второй диск, а я хочу заранее в nsis задать все нужные данные в переменные, и исходя из сообщений распаковщика автоматически посылать их программе, чтобы вводить ничего не нужно было в процессе распаковки.

K.A.V. 16-12-2013 18:54 2273351

Цитата:

Цитата Vincent7
K.A.V., от этого батника мне пользы никакой нет »

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

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

kotkovets 16-12-2013 20:00 2273392

Цитата:

Цитата Begin2Fly
прошу прощения за беспокойство, снова проблема с WinVer2 »

проверил, именно с юникодной версией,
Код:

unicode true
никаких проблем не заметил.

Krinkels 16-12-2013 20:44 2273416

Цитата:

Цитата K.A.V.
Здесь, я думаю, кроме меня есть и другие люди, которые читая ваши сообщения недоумевают с вашей твердолобости и упрямости »

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

Begin2Fly 16-12-2013 21:39 2273451

Цитата:

Цитата kotkovets
проверил, именно с юникодной версией,
никаких проблем не заметил. »

Виноват, попробовал на лёгком скрипте - всё правильно. Видимо, с чем-то конфликтует.
Если разберусь, отредактирую свой пост. Спасибо.

kotkovets 16-12-2013 22:31 2273498

Цитата:

Цитата Begin2Fly
Если разберусь, отредактирую свой пост »

Обязательно, укажите суть разборки - значение win32s берется из стека WinVer2 больше неоткуда..

MKN 17-12-2013 11:52 2273718

Воспроизведение MP3 файлов

MP3 можно проигрывать с помощью известного кода : http://nsis.sourceforge.net/Play_Sound
или с помощью bass.dll, что гораздо удобнее и более гибко (если знать вызов всех команд...)

Код:

!define BASS_DLL "bass.dll"
!define BASS_LOC "$PLUGINSDIR\${BASS_DLL}"
!define MP3 "demo.mp3"
!define MP3_LOC "$PLUGINSDIR\demo.mp3"
; для зацикливания воспроизведения
;!define BASS_SAMPLE_LOOP 4

OutFile "Bass_Test.exe"
Page instfiles

Function .onInit
  InitPluginsDir
  File "/oname=${MP3_LOC}" "${MP3}"
  File "/oname=${BASS_LOC}" "${BASS_DLL}"
FunctionEnd

Section
  FindWindow $0 "#32770" "" $HWNDPARENT
  System::Call /NOUNLOAD '${BASS_LOC}::BASS_Init(i -1,i 44100,i 0,i r0,i n) b.r0'
  System::Call /NOUNLOAD '${BASS_LOC}::BASS_Start() b.r0'
  System::Call /NOUNLOAD '${BASS_LOC}::BASS_StreamCreateFile(b 0,t "$PLUGINSDIR\demo.mp3",i 0,i 0,i 0) i.r1'
  ; для зацикливания воспроизведения
  ;System::Call /NOUNLOAD "${BASS_LOC}::BASS_ChannelFlags(i r1, i ${BASS_SAMPLE_LOOP}, i ${BASS_SAMPLE_LOOP}) i.R0"
  System::Call /NOUNLOAD '${BASS_LOC}::BASS_ChannelPlay(i r1, b 0) i.R1'
SectionEnd

Function .onGUIEnd
  System::Call /NOUNLOAD "${BASS_LOC}::BASS_StreamFree(i) v (r1)"
  System::Call /NOUNLOAD "${BASS_LOC}::BASS_Stop() b () .r0"
FunctionEnd


MKN 17-12-2013 12:52 2273756

Цитата:

Цитата Vincent7
Ведь программа консольная... вот, посмотрите http://cs.rin.ru/forum/download/file.php?id=13154 »

Вскользь посмотрел...
sisinstall - это хрень для распаковки некоторых игр. Во-первых, у кого windows 7 надо переименовать sisinstall.exe в sis.exe.
Какие команды с sisinstal можно использовать - уже сказано.

Первая команда - sis.exe update. Прога законнектится с каким то ресурсом и скачает какой то файл contentDescriptionRecord.bin

Потом можно распаковывать игру . Например, игру King Arthur - The Role-playing Wargame
распаковать можно командой : sis.exe extractAll "C:\sisinstall\King Arthur - The Role-playing Wargame_disk1.sis" "C:\Arthur"
В ряде случаев в папки надо обязательно добавлять доп файлы ( какие то манифесты, SID и пр. Мне это не известно и не интересно... )

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

Как эти команды привязать к GUI я уже пытался посоветовать... Как запускать команды из скрипта тыщу раз сказано и тыщи примеров здесь и в сети, приведены.
Более добавить нечего... Надо Vincent7 - просто самому поработать...

kotkovets 17-12-2013 21:12 2273987

Цитата:

Цитата MKN
Надо Vincent7 - просто самому поработать... »

Vincent7 понятие не имеет, что такое поработать..

Vincent7 18-12-2013 00:42 2274104

kotkovets, за себя отвечайте

K.A.V. 18-12-2013 02:05 2274131

Цитата:

Цитата Vincent7
kotkovets, за себя отвечайте »

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

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

А вообще, наверное, нужно игнорить подобных "уникумов", которые не прочитав справочник от страницы до страницы, приходят сюда и задают вопросы, которые уже там описаны, мы здесь всем пытаемся помочь по возможности, но я уже в этой теме много раз говорил - поможем, если у вас у самих есть желание что-то изучать и делать, в противном случае, если:
1. Я не знаю что это и что мне это даст, но это мне не нужно
2. Дайте полностью рабочий код
3. Не хочу ничего читать
4. Просто нужен такой функционал

то данная тема не для вас.

Vincent7 18-12-2013 06:21 2274171

Цитата:

Цитата K.A.V.
вас уже просят, сделайте так, сделайте это, чтобы вы могли решить нужную вам проблему, а вы идёте в отказ, говоря, что "мне это не нужно", но заранее даже не посмотрев на результат, как это ещё можно расценить?

Вы bat файл имеете ввиду? Я знал каким будет результат, честное слово... поэтому и не создал. Он моей задачи не решает.

K.A.V. 18-12-2013 06:59 2274179

Цитата:

Цитата Vincent7
Вы bat файл имеете ввиду? Я знал каким будет результат, честное слово... »

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

MKN 18-12-2013 13:15 2274298

Функция NetWkstaGetInfo возвращает информацию о конфигурации рабочей станции (имени домена, локального компьютера, информацию о OC)
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Код:

Outfile "NetWkstaGetInfo_test.exe"

Section
System::Call  "netapi32::NetWkstaGetInfo(i0, i100, *i r0 r0) i.r6"
System::Call  "*$0(i.r1, w.r2, w.r3, i.r4, i.r5)"
MessageBox MB_OK "$2 $3 domain (platform_id $1 - ver $4.$5) "
System::Call  "netapi32::NetApiBufferFree(*i r0) i.r6"
; 500 - The Windows NT platform *  http://msdn.microsoft.com/en-us/library/windows/desktop/aa371402(v=vs.85).aspx
SectionEnd


Vincent7 19-12-2013 15:45 2274963

K.A.V., но ведь для выполнения команды нужно напечатать например' C:\папка_с_манифестом'

K.A.V. 19-12-2013 21:01 2275189

Цитата:

Цитата Vincent7
K.A.V., но ведь для выполнения команды нужно напечатать например' C:\папка_с_манифестом' »

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

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

Раз
Два
Три

kotkovets 19-12-2013 21:31 2275205

K.A.V., да не отвечай на вопросы, ибо на его писательство не стоит попросту обращать внимания
убрать оффтоп - дело техники модератора

Kopejkin 20-12-2013 15:41 2275652

Попробовал применить скины к инсталлятору с помощью ISSkinEx (MKN)
На некоторых скинах BrandingText выгладит неопрятно.



Например: скин tiger

Можно ли что-нибудь сделать?

В Справочнике NSIS есть пример изменения цвета BrandingText.
В стандартном примере скрипта (WelcomeFinish.nsi) - прекрасно работает.
В различных примерах со скинами (см. ссылку MKN выше) - нет.
И что самое обидное ( :lamer: ) в моем, вполне рабочем скрипте без скинов, самодельных окон - в общем, довольно простеньком - тоже не работает. Хотя особой надобности что-либо делать с BrandingText нет - отображается вполне прилично.

Есть ли ограничения применения этого примера? Или что необходимо учитывать?

MKN 20-12-2013 17:39 2275745

Цитата:

Цитата Kopejkin
Попробовал применить скины к инсталлятору с помощью ISSkinEx
На некоторых скинах BrandingText выгладит неопрятно. »

Возможно дело в самом ISSkinEx. Также можно поэксперементировать с назначением шрифта для BrandingText и с темами.
Самый удачный "кожезаменитель" для NSIS, по моему - это SkinH.dll.


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

!include nsDialogs.nsh
!include WinMessages.nsh
Caption " "
Page Custom mypagecreate
Page InstFiles

OutFile "CreateRoundRectRgn.exe"
Var dlg
var button

Function .onGUIInit
    System::Call "user32::SystemParametersInfo(i0x0025,i0,*i.R0,i0)"
    System::Call "user32::SystemParametersInfo(i0x0025,i1,i0,i0)"
 FunctionEnd

 Function .onGUIEnd
    System::Call "user32::SystemParametersInfo(i0x0025,iR0,i0,i0)"
 FunctionEnd
 
 Function mypagecreate
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)"
IntOp $1 $1 + 5
IntOp $2 $2 + 30
System::Call "Gdi32::CreateRoundRectRgn(i0,i0,i200,i200,i200,i200)i.r0"
; Функция SetWindowRgn устанавливает регион окна. Регион окна устанавливает область внутри окна, где система разрешает рисовать.
;Система не выводит на экран любую часть окна, которая находится за пределами региона окна.
; Координаты окна региона окна находятся относительно левого верхнего угла не рабочей области окна.
;После успешного вызова функции SetWindowRgn системе принадлежит регион, определенный дескриптором hRgn региона.
;Система не делает копию региона. Таким образом, Вы не должны делать дополнительные вызовы функции с этим дескриптором региона.
;В частности не удаляйте этот дескриптор региона. Система удаляет дескриптор региона  тогда, когда он больше не нужен.
System::Call "User32::SetWindowRgn(i$HWNDPARENT, ir0, i1)"

${NSD_CreateButton} 50u 35u 17u 16u "X"
Pop $button
${NSD_OnClick} $button done
nsDialogs::Show
FunctionEnd

Function done
SendMessage $hwndparent ${WM_CLOSE} 0 0
FunctionEnd

Section
SectionEnd

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

Но у меня не получилось - полностью закрасить круг. ( с прямоугольным окном получается).
Как это можно сделать, у кого какие соображения ?

K.A.V. 20-12-2013 20:00 2275815

Цитата:

Цитата MKN
Но у меня не получилось - полностью закрасить круг. ( с прямоугольным окном получается).
Как это можно сделать, у кого какие соображения ? »

Код:

Function mypagecreate
nsDialogs::Create 1018
Pop $dlg
SetCtlColors $HWNDPARENT "" 0x80FF00
SetCtlColors $dlg "" 0x80FF00


kotkovets 21-12-2013 00:20 2275964

Цитата:

Цитата MKN
Но у меня не получилось - полностью закрасить круг »

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

MKN 21-12-2013 12:35 2276102

Цитата:

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

Да, мешает загловок... Убрать его , как уже выясняли, не проблема. Теперь надо организовать возможность перемещения окна НЕ за заголовок.
Самое простое - запускать вместе со скриптом утилитку для этого (типа MoveInactiveWin). Но так не интересно...
В то же время пишут, что можно сделать так : http://computista.ru/030600.shtml
или использовать сообщение WM_NCHITTEST, которое есть даже в WinMessages.nsh.
Только как это сделать на практике ?

kotkovets 21-12-2013 19:12 2276330

Цитата:

Цитата MKN
Только как это сделать на практике ? »

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

MKN 21-12-2013 21:06 2276397

Цитата:

Цитата kotkovets
только плагином »

Которого не существует... Inno в этом плане как то более прогрессивен и продвинут. Чего для него только нет... Для NSIS - чего надо, того никогда нет... :)

wolkow70 23-12-2013 16:53 2277319

Никто не знает как в скрипте NSIS вызвать LaunchAdvancedAssociationUI для заданной программы?
(How to call LaunchAdvancedAssociationUI).

MKN 23-12-2013 17:43 2277351

Цитата:

Цитата wolkow70
как в скрипте NSIS вызвать LaunchAdvancedAssociationUI для заданной программы? »

Дело это мутное до безобразия...
Был такой код по теме :
Код:

!include LogicLib.nsh
!define CLSCTX_INPROC_SERVER 0x1
!define CLSID_ApplicationAssociationRegistrationUI {1968106d-f3b5-44cf-890e-116fcb9ecef1}
!define IID_IApplicationAssociationRegistrationUI {1f76a169-f994-40ac-8fc8-0959e8874710} ;[Vista+]

section
System::Call 'OLE32::CoCreateInstance(g "${CLSID_ApplicationAssociationRegistrationUI}",i 0,i ${CLSCTX_INPROC_SERVER},g "${IID_IApplicationAssociationRegistrationUI}",*i.r1)i.r0' ;ptr is now in $1 and hr in $0
${If} $1 <> 0
    System::Call '$1->3(w "MyApp")i.r0' ;IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI
    System::Call '$1->2()' ;IUnknown::Release
${EndIf}
sectionend

Только к нему много вопросов... К примеру, используемая функция IApplicationAssociationRegistrationUI, если верить примечанию, не поддерживается на Windows 8
( http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx )
А ты, как мне кажется, хочешь замутить канитель, именно применимо к ассоциированию в Win8 ? (а для других ОС и мутить нечего - всё ясно и традиционно...)

wolkow70 23-12-2013 17:46 2277354

Цитата:

Цитата wolkow70
Никто не знает как в скрипте NSIS вызвать LaunchAdvancedAssociationUI для заданной программы? »

Вот сам уже нашел способ: http://ask.make-money-article.com/que/11179945

!include LogicLib.nsh
!define CLSCTX_INPROC_SERVER 0x1
!define CLSID_ApplicationAssociationRegistrationUI {1968106d-f3b5-44cf-890e-116fcb9ecef1}
!define IID_IApplicationAssociationRegistrationUI {1f76a169-f994-40ac-8fc8-0959e8874710} ;[Vista+]

section
;NSIS has called CoInitialize
System::Call 'OLE32::CoCreateInstance(g "${CLSID_ApplicationAssociationRegistrationUI}",i 0,i ${CLSCTX_INPROC_SERVER},g "${IID_IApplicationAssociationRegistrationUI}",*i.r1)i.r0' ;ptr is now in $1 and hr in $0
${If} $1 <> 0
System::Call '$1->3(w "Internet Explorer")i.r0' ;IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI
System::Call '$1->2()' ;IUnknown::Release
${EndIf}
sectionend

Вместо "Internet Explorer" можно подставлять наименование программы, зарегистрированной в реестре в ключе
HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications

Цитата:

Цитата MKN
А ты, как мне кажется, хочешь замутить канитель, именно применимо к ассоциированию в Win8 ? (а для других ОС и мутить нечего - всё ясно и традиционно...) »

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

MKN 23-12-2013 17:54 2277361

Цитата:

Цитата wolkow70
что бы при определении Win8 в конце установки открывался интерфейс ассоциаций для конкретной программы. »

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

wolkow70 23-12-2013 18:48 2277384

Цитата:

Цитата MKN
Даже если и получится, то только радости с того мало »

Получилось, работает! Тестировал на Windows 8 x64.
Применил данной способ в своей сборке Light Alloy.
http://forum.oszone.net/post-2277381-247.html
Интерфейс открывается только на Win 8, и только если при выборе компонентов была выбрана хоть одна ассоциация (и не в тихом режиме).
Можешь познакомиться для интереса.

MKN 23-12-2013 19:24 2277403

Цитата:

Цитата wolkow70
Получилось »

Получилось - это когда перед установкой выбрал нужные ассоциации, установил прогу и всё ОК.
А ковыряться с выбором ассоциаций после установки - это лажа.

Krinkels 25-12-2013 22:00 2278534

Друзья, вчера вышла новая версия NSIS( NSIS 3.0a2 ), обновляемся

K.A.V. 26-12-2013 05:31 2278674

Цитата:

Цитата Krinkels
Друзья, вчера вышла новая версия NSIS( NSIS 3.0a2 ), обновляемся »

Цитата:

Цитата F.1.2.2 Minor Changes
Windows 8.1 & 2012R2 support in WinVer.nsh

Неужели NSIS ожил и пошел в ногу со временем :up

Krinkels 26-12-2013 07:57 2278692

Сам был в шоке, полез за сорцами, а там новая версия висит :)

MKN 26-12-2013 11:18 2278738

Страница-фейс инсталлятора в виде круга.

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

Выглядит это так (ессно, как вариант) :

Код:

!addplugindir .
!include nsDialogs.nsh
!include WinMessages.nsh
Page Custom mypagecreate
Page InstFiles

OutFile "CreateRoundRectRgn.exe"
Var dlg
Var button

Function .onInit
  InitPluginsDir
  File /oname=$PLUGINSDIR\s.bmp "s.bmp"
FunctionEnd

Function .onGUIInit
; вызов DLL для перемещения окна за любую точку
MoveAnywhere::Hook

; окно всегда поверх
System::Call "user32::SetWindowPos(i$HWNDPARENT,i-1,i,i,i,i,i3)"

; убрать заголовок 
System::Call `user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},0x9480084C)i.R0`

; убрать пунктирную рамку границы при перетаскивании окна
System::Call "user32::SystemParametersInfo(i0x0025,i0,*i.R0,i0)"
System::Call "user32::SystemParametersInfo(i0x0025,i1,i0,i0)"
 FunctionEnd

 Function .onGUIEnd
System::Call "user32::SystemParametersInfo(i0x0025,iR0,i0,i0)"
 FunctionEnd
 
 Function mypagecreate
nsDialogs::Create 1018
Pop $dlg
; цвет
SetCtlColors $HWNDPARENT "" 0xbde2f4
SetCtlColors $dlg "" 0xbde2f4

${NSD_CreateButton} 33u 35u 80 59 ""
Pop $button
; устанавливаем свой стиль кнопки (помещаем рисунок на кнопку)
StrCpy $0 $PLUGINSDIR\s.bmp
${NSD_AddExStyle} $button ${WS_EX_TRANSPARENT}|${WS_EX_TOPMOST}
${NSD_AddStyle} $BUTTON "${BS_BITMAP}"
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s'
Pop $6
SendMessage $BUTTON ${BM_SETIMAGE} ${IMAGE_BITMAP} $6

; фейс в виде круга
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)"
IntOp $1 $1 + 5
IntOp $2 $2 + 30
System::Call "Gdi32::CreateRoundRectRgn(i0,i0,i200,i200,i200,i200)i.r0"
System::Call "User32::SetWindowRgn(i$HWNDPARENT, ir0, i1)"

${NSD_OnClick} $button done
nsDialogs::Show
FunctionEnd

Function done
SendMessage $hwndparent ${WM_CLOSE} 0 0
FunctionEnd

Section
SectionEnd

Ессно кнопку делаем какую угодно и вешаем на неё что угодно.
Правда хотелось таскать фейс с рисунком в качестве фона, но что то у меня перетаскивание при этом не работает... Ну да и ладно...

Flix 26-12-2013 20:28 2279004

Всем привет!

Кто-нибудь собирает себе NSIS из исходников? Вопрос вот в чем. Пробую компилировать NSIS в среде MS Visual Studio 2008 (все настройки по умолчанию). Все чудесно, все собирается, но... не могу понять, почему размеры файлов с шаблонами диалоговых окон (в папке ..NSIS\Contrib\UIs\) у меня получаются больше, чем в официальном релизе?

Оригинал


Моя компиляция


А у вас как? Случаем не знаете, что нужно сделать, чтобы размеры получались меньше? Или не заморачиваться по этому поводу?

Другой вопрос. На сайте загрузки есть архив с названием nsis-3.0a2-strlen_8192.zip. Как надо изменить исходный код программы, чтобы сразу компилировать это "strlen_8192"?

kotkovets 27-12-2013 01:28 2279166

Цитата:

Цитата Flix
Кто-нибудь собирает себе NSIS из исходников? »

походу только разработчики и занимаются.. :)

Krinkels 29-12-2013 00:13 2280045

Цитата:

Цитата Flix
Случаем не знаете, что нужно сделать, чтобы размеры получались меньше? »

Сборка идет как Debug или же Release?

Flix 29-12-2013 18:02 2280300

Цитата:

Цитата Krinkels
Сборка идет как Debug или же Release? »

Здравствуйте!
По правде сказать, я не знаю. Просто решил попробовать и посмотреть что получится. Делаю все так, как написано у разработчика в рекомендациях по сборке NSIS. Установил Python, SCons, Zlib, WxWidget и Microsoft Visual C++. Потом просто в командной строке, из под каталога с исходниками NSIS, набираю scons dist-installer и нажимаю [Enter]. Выполняется компиляция и создание дистрибутива. А про Debug или Release там ничего не сказано. Но судя по вашему вопросу, подозреваю, что сборка выполняется Debug. Чтобы знать наверняка, надо будет сценарии scons просмотреть. Спасибо за наводку!

Saten 02-01-2014 01:25 2281848

Здраствуйте.
Вопрос такого рода: как добавить к инсталятору дополнительные ключи тихой установки, потипу: /S /RU устанавливается русская версия программы, /S /EN английская соответственно.

K.A.V. 02-01-2014 09:53 2281902

Цитата:

Цитата Saten
Здраствуйте.
Вопрос такого рода: как добавить к инсталятору дополнительные ключи тихой установки, потипу: /S /RU устанавливается русская версия программы, /S /EN английская соответственно. »

Это можно сделать после прочтения Справочника по NSIS

Saten 02-01-2014 11:30 2281921

K.A.V., ну да, это как хочешь узнать из учебника географии про Японию, но тебя для этого посылают читать весь учебник =)
ну а если серьезно.. я читал справку, даже полную справку читал, но я не смог разобраться как это все устроено. И собственно вопрос: может есть посты, где можно об этом почитать, тема, раздел, кто нибудь из людей поможет...

2ой вопрос: в кастомной странице (nsDialog) добавил картинку, потом сделал так чтобы картинка менялась при переключении радиобутонов.. все хорошо все меняется, но взял я скомпилированный exe файл и запустил на другом ноутбуке и там нет картинок (но появились когда я их положил рядом с exeшником). Как интегрировать их в ехешник?

3ий вопрос: проблема касается переменных, а в данном случае $DESKTOP. В моей системе папка Десктоп перенесена на диск Д (D:\Desktop), но переменная определяет старый путь (C:\Users\SateneX\Desktop). Это как нибудь лечится? или придётся извращаться с выдиранием значения пути рабочего стола из реестра?

K.A.V. 02-01-2014 11:39 2281927

Цитата:

Цитата Saten
K.A.V., ну да, это как хочешь узнать из учебника географии про Японию, но тебя для этого посылают читать весь учебник »

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

Цитата:

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

Скачайте старенький HM NIS Edit, я начинал с него, там есть прекрасный мастер, который может создать первый ваш исходник, создаёте, потом открываете справочник и ищите, какая функция/команда к чему относится, чего нет справочнике - здесь растолкуем, если сами знаем
Вам нужно читать команды (для обработки ключей)
"Перевод справки NSIS => GetParameters"
"Перевод справки NSIS => GetOptions"
А как вы там уже будете это обрабатывать - не знаю, либо вызов определённой функции (в функции Перевод справки NSIS => Стандартные функции => .onInit) в зависимости от указанного ключа, в которой будет происходит распаковка нужного файла локализации...не знаю, смотрите сами

Цитата:

Цитата Saten
2ой вопрос: в кастомной странице (nsDialog) добавил картинку, потом сделал так чтобы картинка менялась при переключении радиобутонов.. все хорошо все меняется, но взял я скомпилированный exe файл и запустил на другом ноутбуке и там нет картинок (но появились когда я их положил рядом с exeшником). Как интегрировать их в ехешник? »

Плохо значит вы читали справочник, если не обманываете
"Перевод справки NSIS => File"

Цитата:

Цитата Saten
3ий вопрос: проблема касается переменных, а в данном случае $DESKTOP. В моей системе папка Десктоп перенесена на диск Д (D:\Desktop), но переменная определяет старый путь (C:\Users\SateneX\Desktop). Это как нибудь лечится? или придётся извращаться с выдиранием значения пути рабочего стола из реестра? »

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

AlekseyPopovv 02-01-2014 20:48 2282241

Как сделать что бы программа (к примеру "Starus FAT Recovery") запускалась от имени администратора?
ExecWait "$EXEDIR\${APPDIR}\${APPEXE}"

kotkovets 02-01-2014 21:20 2282254

Цитата:

Цитата AlekseyPopovv
Как сделать что бы программа (к примеру "Starus FAT Recovery") запускалась от имени администратора? »

http://forum.oszone.net/showpost.php?p=1830962

Saten 02-01-2014 22:48 2282308

Цитата:

Цитата Saten
3ий вопрос: проблема касается переменных, а в данном случае $DESKTOP. В моей системе папка Десктоп перенесена на диск Д (D:\Desktop), но переменная определяет старый путь (C:\Users\SateneX\Desktop). Это как нибудь лечится? или придётся извращаться с выдиранием значения пути рабочего стола из реестра? »

никак не могу решить данную проблему

Код:

Function .onInit
  ReadRegStr $5 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Desktop"
FunctionEnd

Section
  MessageBox MB_YESNO "путь к столу $5"
  CreateShortCut "$5\${PRODUCT_NAME}.lnk" "$INSTDIR\bin\x86\3DMark11.exe"
SectionEnd

MessageBox отображает путь D:\Desktop, ярлык создается C:\Users\SateneX\Desktop.. помимо D:\Desktop пробовал создавать в D:\, c:\, d:\papka, c:\papka с этими директориями все впорядке

UPD. RequestExecutionLevel (юзер, админ, хайт) вот что было нужно

Saten 04-01-2014 17:44 2282943

добрый вечер всем.
Не подскажите как сделать так чтобы на этапе инсталляции файлов при установки определённого компонента появлялось маленькое окошко например с таким содержанием "установка директХ" и соответственно когда компонент установился окошечко закрывалось.

K.A.V. 04-01-2014 18:09 2282951

Цитата:

Цитата Saten
Не подскажите как сделать так чтобы на этапе инсталляции файлов при установки определённого компонента появлялось маленькое окошко например с таким содержанием "установка директХ" и соответственно когда компонент установился окошечко закрывалось. »

В начале кода пропишите:
Код:

!include "WinMessages.nsh"
Код:

Section "Установка DirectX"
        Banner::show "Подготовка к установке..."
        Banner::getWindow
        Pop $1
        GetDlgItem $2 $1 76
        SendMessage $2 ${WM_SETTEXT} 0 "STR:Пожалуйста, подождите..."
        GetDlgItem $2 $1 1030
        SendMessage $2 ${WM_SETTEXT} 0 "STR:Установка DirectX..."
Sleep 2000
; ... Ваш код
; ... Ваш код
; ... Ваш код
        SendMessage $2 ${WM_SETTEXT} 0 "STR:Удаление временных файлов..."
Sleep 2000
; ... Ваш код
; ... Ваш код
; ... Ваш код
        Banner::destroy
SectionEnd

Команду "Sleep" удалите потом, это просто для примера вам, запустите, посмотрите как смотрится и удалите :)

Saten 04-01-2014 19:12 2282968

K.A.V., благодарю.. а иконку нельзя убрать в диалоговом окне?

K.A.V. 04-01-2014 21:59 2283069

Цитата:

Цитата Saten
K.A.V., благодарю.. а иконку нельзя убрать в диалоговом окне? »

Код:

        Banner::show "Подготовка к установке..."
        Banner::getWindow
        Pop $1
        GetDlgItem $2 $1 -1
          ShowWindow $2 0

        GetDlgItem $2 $1 76
        SendMessage $2 ${WM_SETTEXT} 0 "STR:Пожалуйста, подождите..."
        GetDlgItem $2 $1 1030
        SendMessage $2 ${WM_SETTEXT} 0 "STR:Установка DirectX..."
Sleep 2000
; ... Ваш код
; ... Ваш код
; ... Ваш код
        SendMessage $2 ${WM_SETTEXT} 0 "STR:Удаление временных файлов..."
Sleep 2000
; ... Ваш код
; ... Ваш код
; ... Ваш код
        Banner::destroy

Если хотите настроить поточнее вид баннера, то прописывайте свой UI файл как файл оболочки и редактируйте ресурс 111 через ResHacker или подобные ей программы
Код:

!define MUI_UI "файл ресурса.ехе"
где "файл ресурса.ехе" - путь к файлу ресурсов диалогов интерфейса инсталлятора, дефолтные лежат по пути: <NSIS>\Contrib\UIs, за основу возьмите, к примеру, modern.exe, вообщем, экспериментируйте

Saten 05-01-2014 02:58 2283197

Вложений: 1
Доброй ночи =)
kotkovets, вот тут вы выкладывали модификацию плагина InvokeShellVerb
столкнулся с проблемой или неисправностью данного.. приступим к описанию:
Имеею 2 рабочие (x86 и x64) и 1 виртуальную (x86x64) машины.
Прописываю дефолтный путь установки InstallDir "$PROGRAMFILES\...." ну и вставляю в код ${PinToTaskBar}, все хорошо прикрепляется и исправно работает в 32 и 64 битных системах.
Далее изменяю путь на InstallDir "$PROGRAMFILES64\..." затем вставляю в код ${PinToTaskBar}, компилю.. на 32 битной системе все хорошо открывается, а на 64битной создается значок на панели инструментов, но при открытии приложения через него (ну или само приложении из директории) они не стакаются, т.е стоят в панели 2 иконки 1ого приложения одна мертвая 2ая запущенная..

прикрепил картинку: 1ое свойства ярлыка 2ое свойства процесса 3 возможность прикрепления хотя пути нахождения программы одинаковые.. и так со всеми программами из данной директории

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

kotkovets 07-01-2014 18:19 2284307

Цитата:

Цитата Saten
иконка оживает только в том случае если через нее запустить приложение от администратора »

честно у себя проблем не заметил (x64)..
Попробуйте так:
Код:

InvokeShellVerb::DoIt "$ProgramFiles64\папка программы" "файл запуска" "5386"
Хедер делает удобную подстановку данных в плагин - и все!..
если проблема осталась.. то, остается у вас косяк или в плагине.

Saten 07-01-2014 18:48 2284327

kotkovets, и так тоже пробовал как вы описали.. даже находил похожее проблемы на забугорных форумах..
проблема только в х64 винде при попытки установки в обычный program files (без х86..
воссоздать проблему легко достаточно сменить дефолтный путь установки в c:\program files\XXXXx

скорее всего дело в плагине(

Krinkels 08-01-2014 11:53 2284698

Удалено

K.A.V. 08-01-2014 12:04 2284704

Цитата:

Цитата Krinkels
Друзья, представляю вам новую версию справочника по NSIS. Добавил туда подсветку синтаксиса. »

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

kotkovets 08-01-2014 12:06 2284706

K.A.V., я в курсе, забыл тебя предупредить..

MKN 08-01-2014 12:16 2284714

Друзья, нет повода для шума... А вот то, что справочник давно можно было и дополнить и расширить виноваты мы все... И я есно тоже... Ленивы однако... :)

K.A.V. 08-01-2014 12:16 2284715

Цитата:

Цитата kotkovets
забыл тебя предупредить »

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

Попросите модератора изменить автора темы Справочник по NSIS на себя или на Krinkels, удалите меня из авторов, чтобы не нужно было в будущем меня даже информировать об изменениях в справочнике

И удачи вам в развитии справочника, в этой теме я больше не появлюсь

MKN 08-01-2014 12:26 2284720

Ну вот, договорились... Причастные к недоразумению - надо что то срочно делать... :) Жаль не в одном городе живём. Устроили бы рождественскую встречу и всё мирно разрешили.

Krinkels 08-01-2014 14:54 2284826

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

kotkovets 08-01-2014 21:33 2285063

Цитата:

Цитата Krinkels
как будто и ничего не было »

Цитата:

Цитата MKN
Устроили бы рождественскую встречу и всё мирно разрешили »

под горячительные напитки :jester:

Kopejkin 09-01-2014 15:00 2285472

Цитата:

Цитата Krinkels
...Добавил туда подсветку синтаксиса »

Не везде корректно отображается.



Во всем документе есть несколько таких мест

K.A.V. 09-01-2014 19:41 2285621

Цитата:

Цитата Krinkels
Не нужно горячиться, я лишь хотел сделать как лучше »

Я понимаю, что для вас "Авторское право" - это пустой звук, если вы научились читать, то увидели бы на главной страничке справочника:

Цитата:

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

С чего вы вообще решили, что kotkovets главный автор и если он говорит "разрешаю" (допустим, так и было) - то вам разрешено?
Кто автор публикаций новых версий справочника здесь и здесь?

А то, что вы на свой ник в справочнике установили ссылку на свой сайт, на котором распространяетчся варез - это во-первых нарушение ОПК, во вторых - все ссылки ников должны идти на профили участников на данном форуме.

И вам никто не давал право распространять "вашу новую версию справочника" по сторонним ресурсам, в т.ч. и через ваш варезный сайт, на каком основании это всё сделано? Пропиарить ваш варезник засчет справочника?


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

По пожеланиям к справочнику, есть тема на форуме, почему вы сначала не написали там что-то типа "у меня есть идея, а давайте-ка сделаем подсветку кода!" и посмотрев на ответы читателей справочника все вместе бы решили, а оно нужно вообще?
Зачем нужна подсветка кода на страничках? Подсветка кода, которая работает через раз при открытии страничек (раз открыл - код не читабелен, потому что его просто нет, второй раз открыл - есть), это раз
Два. Зачем нужна подсветка кода при просмотре страничек? Подсветка нужна в редакторе скриптов. Код в текущей версии выделен специально не напрягающей рамкой с содержимым, чтобы не отвлекать своё внимание от текста (скопировал-вставил в свой проект, всё), лично для моих глаз не приятно, т.к. сливается с фоном страницы и всё перемешивается, и текст и "подсветка"

Krinkels 09-01-2014 20:01 2285631

K.A.V.
Справочник удален, и все что с ним связано. Но раз такое отношение, я теперь палец о палец не ударю чтоб хоть как то его улучшить или сделать более красивым.
З.Ы. Если уважаемый K.A.V., либо кто то еще, более достойный чем я, соберется добавить подсветку в справочник, то пусть пишет в л.с., я скину все свои наработки и расскажу что стоит доделать/исправить.

K.A.V. 09-01-2014 21:40 2285676

Цитата:

Цитата Krinkels
Но раз такое отношение »

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

Цитата:

Цитата Krinkels
я теперь палец о палец не ударю чтоб хоть как то его улучшить или сделать более красивым »

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

Вам будет приятно, если кто-то взломает ваш сайт и изменит на нём оформление по своему вкусу, вбив на главную страницу сайта свой ник и ссылку на свой сайт, при этом сказав, мол, "мне так нравится, смотрите, что я сделал"?

red_byte 16-01-2014 14:30 2290215

NSIS x64 инсталлятор
 
Друзья! Подскажите пожалуйста, есть NSIS скрипт инсталлера, собственно он собирает 32 битный установщик, работает хорошо, все отлично, но тут встал вопрос - нужно пересобрать установщик под х64, ибо 32 битный инсталлер, ставит нужные мне файлы не в system32,а в C:\Windows\SysWoW64. По этому у меня возник вопрос - придется все
заново переписывать, или есть хитрый способ пересобрать готовый скрипт под х64? Какие подводные камни могут встретится на этому пути? пытался пошерстить по сети, но путного мало чего нашел, в основном описываются х32 случаи. Буду рад любой помощи!
Спасибо за внимание.

Ж.Д.А.Л.К.Е.Р. 16-01-2014 14:50 2290238

Читай здесь:
Цитата:

32-bit applications can access %SystemRoot%\System32 through the pseudo directory %SystemRoot%\sysnative.
И почитай про PROCESSOR_ARCHITEW6432.

Пример использования PROCESSOR_ARCHITEW6432 в батнике:
Цитата:

@Echo off
If Defined PROCESSOR_ARCHITEW6432 %SystemRoot%\sysnative\cmd.exe /q /k "Call %0" & Exit
Regedit /s "%~dp0WUfix.reg"
Regedit /s "%~dp0Conv2007\WUfix7.reg"
If Exist "%~dp0Setting.reg" Regedit /s "%~dp0Setting.reg"
Cscript "%~dp0Turn_on_updates.vbs" //NoLogo
Exit
В этом примере reg должны быть добавлены в реестр без WoW64 пере адресаций, поэтому If Defined проверяет наличие переменной PROCESSOR_ARCHITEW6432 и запускает все что идет ниже от имени х64 версии cmd.exe.

K.A.V. 16-01-2014 15:25 2290268

Код:

!include "x64.nsh"
Цитата:

; RunningX64 checks if the installer is running on x64.
;
; ${If} ${RunningX64}
; MessageBox MB_OK "running on x64"
; ${EndIf}
;
; DisableX64FSRedirection disables file system redirection.
; EnableX64FSRedirection enables file system redirection.
;
; SetOutPath $SYSDIR
; ${DisableX64FSRedirection}
; File some.dll # extracts to C:\Windows\System32
; ${EnableX64FSRedirection}
; File some.dll # extracts to C:\Windows\SysWOW64
;

Mafia_forever 17-01-2014 23:05 2291234

Всем привет ,существует ли утилита которая создает ассоциации для файлов ?

MKN 18-01-2014 09:24 2291455

Цитата:

Цитата Mafia_forever
существует ли утилита которая создает ассоциации для файлов ? »

для NSIS есть хедер - Assoc.nsh
есть плагин - http://nsis.sourceforge.net/Applicat...ration_plug-in
и есть макрос (был в теме )
ну и ессно, прописать нужное, можно вручную.

Но всё это бесполезно в Windows 8 - для уже ассоциированных системой файлов. Ничего путного в NSIS, для ассоциирования файлов в Windows 8, пока не придумано... (Не придумано пользователями NSIS. Разрабы ряда ПО, это дело давно победили. Каким методом - не известно... Возможно посредством экспорта специального XML файла с помощью dism
(типа : dism /Online /Import-DefaultAppAssociations:Z:\$W8i\$W8-Deploy\test.xml ) Про это был раговор на MSFN Forum_е. Не изучал, не знаю... )

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

Mafia_forever 18-01-2014 11:05 2291488

MKN Спасибо

K.A.V. 19-01-2014 05:22 2291977

Цитата:

Цитата MKN
Возможно ли c помощью NSIS, организовать замену в файле, одних байт на другие ? ( Т.е. - заменить в файле по такому то адресу, имеющееся значение - на другое) »

Вот мне припекло, сидел с бубном шаманил сейчас :biggrin:
Вообщем, у меня получилось заменить в файле по hex смещению одни байты на другие, при открытии файла мы не можем открыть его для перезаписи определённых байт, а только добавить, у меня получилось произвести именно замену байт без смещения :tongue:

Вообщем, может кому пригодится, делюсЯ
Код:

FileOpen $0 "C:\Users\APTEM\Desktop\123.exe" a
  FileSeek $0 "0x0001C6E7" SET ; прыгаем на нужное hex смещение
  FileSeek $0 "0x0001C6E7" SET ; прыгаем ещё раз на нужное hex смещение, у вас не глюк, команда дублирована
  FileWriteByte $0 "100" ; пишем своё значение
FileClose $0

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

FileOpen $0 "C:\Users\APTEM\Desktop\123.exe" a
  FileSeek $0 "0" END
  FileWrite $0 "$\n$\rЭти строки будут добавлены в конец файла"
FileClose $0


red_byte 20-01-2014 08:38 2292594

Цитата:

Цитата K.A.V.
!include "x64.nsh"
Цитата:
; RunningX64 checks if the installer is running on x64.
;
; ${If} ${RunningX64}
; MessageBox MB_OK "running on x64"
; ${EndIf}
;
; DisableX64FSRedirection disables file system redirection.
; EnableX64FSRedirection enables file system redirection.
;
; SetOutPath $SYSDIR
; ${DisableX64FSRedirection}
; File some.dll # extracts to C:\Windows\System32
; ${EnableX64FSRedirection}
; File some.dll # extracts to C:\Windows\SysWOW64
; »

Спасибо огромное! Помогло! У меня еще один вопросик - нет ли простейшего примера написания на Cpack'e сборки инсталлера NSIS? или NSIS64 ? попытался пошерстить по инету, но более менее путевое нашел только это:
http://www.cmake.org/Wiki/CMake:CPac...enerators#NSIS

wolkow70 20-01-2014 11:28 2292640

Кто нибудь может подсказать можно ли как-то определить букву логического диска на котором записан сам nsis скрипт? И еще интересует можно ли получить путь к файлу скрипта. В справочнике в GetDrives не нашел такого.

red_byte 20-01-2014 11:50 2292649

Цитата:

Цитата red_byte
Спасибо огромное! Помогло! У меня еще один вопросик - нет ли простейшего примера написания на Cpack'e сборки инсталлера NSIS? или NSIS64 ? попытался пошерстить по инету, но более менее путевое нашел только это:
http://www.cmake.org/Wiki/CMake:CPac...enerators#NSIS »

После небольшой пляски с бубнами накидал такую штуку:

PROJECT(INSTALLER)
INCLUDE(CPack)
INSTALL(PROGRAMS "HelloWorld.bat" DESTINATION "./bin")
SET(CPACK_PACKAGE_NAME "HelloWorldPackage")
SET(CPACK_GENERATOR NSIS64)
SET(CPACK_PACKAGE_VENDOR "Visual Technology Services")
SET(CPACK_PACKAGE_VERSION_MAJOR 1)
SET(CPACK_PACKAGE_VERSION_MINOR 0)
SET(CPACK_PACKAGE_VERSION_PATCH 1)
SET(CPACK_RESOURCE_FILE_LICENSE "License-Full.txt")
SET(CPACK_PACKAGE_FILE_NAME "HelloWorldPackageFileName")
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}")
SET(CPACK_NSIS_MODIFY_PATH ON)
Под 32х битами все хорошо собирается и создается, но пробую собрать 64битную версию (делаю это так - cpack -G "NSIS64" -C Release) а он мне все равно собирает 32х битный инсталлер, в чем тут кроется причина? где я ошибаюсь? Спасибо, премного благодарен за внимание.

Цитата:

Цитата wolkow70
Кто нибудь может подсказать можно ли как-то определить букву логического диска на котором записан сам nsis скрипт? И еще интересует можно ли получить путь к файлу скрипта. В справочнике в GetDrives не нашел такого. »

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

wolkow70 20-01-2014 14:12 2292713

Цитата:

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

Уже подумал, что можно вырезать первую букву из $EXEDIR, но все равно интересует сама функция.

K.A.V. 20-01-2014 15:47 2292768

Цитата:

Цитата red_byte
У меня еще один вопросик - нет ли простейшего примера написания на Cpack'e сборки инсталлера NSIS? или NSIS64 ? попытался пошерстить по инету, но более менее путевое нашел только это: »

Я могу подсказать только командам под Win-систему, указанную вами программу услышал впервые в жизни, подсказать ничего не могу по этому вопросу :)

Цитата:

Цитата wolkow70
можно вырезать первую букву из $EXEDIR, но все равно интересует сама функция. »

Код:

        ${GetRoot} "C:\Program Files\NSIS" $R0
        ; $R0="C:"

Не?

wolkow70 20-01-2014 17:30 2292852

Цитата:

Цитата K.A.V.
Не? »

Нет. Мне нужно определить путь не к папке с NSIS, а к папке со скриптами, которые на другом диске. А нужно для того, чтобы не править скрипты при запуске из под разных ОС, расположенных на разных логических разделах.
Например: !define pkgdir "D:\NSIS".
Но при запуске из под разных ОС, расположенных на разных логических разделах буква диска определяется по разному, и приходится править скрипт перед запуском

MKN 20-01-2014 18:21 2292888

Цитата:

Цитата wolkow70
приходится править скрипт »

А не проще ли, вернее - правильнее, никогда не использовать в скриптах явные пути.
В частности, не привязывать плагины к конкретному местоположению.
Достаточно в скрипте указать : !addplugindir . ( или указать иной уровень вложения) и "положить" нужные плагины рядом со скриптом.

K.A.V. 20-01-2014 19:21 2292940

Цитата:

Цитата wolkow70
Мне нужно определить путь не к папке с NSIS »

Я вам показал пример использования команды для извлечения буквы диска из пути, а не определение папки NSIS
По сути можно воспользоваться обычной командой StrCpy по отсеву первых 2-х символов в строке пути, о команде StrCpy написано в нашем справочнике

Цитата:

Цитата wolkow70
Но при запуске из под разных ОС, расположенных на разных логических разделах буква диска определяется по разному, и приходится править скрипт перед запуском »

Вам правильно ниже MKN написал, об этом и в справочнике сказано:

Цитата:

Цитата !addincludedir
Данная команда добавляет дополнительный каталог в дополнение к ${NSISDIR}\Include, в котором расположены ваши Include файлы, очень удобно для отдельного большого проекта

Код:

!addincludedir ..\include
!include something.nsh

Цитата:

Цитата !addplugindir
Данная команда добавляет дополнительный каталог в дополнение к ${NSISDIR}\Plugins, в котором расположены ваши NSIS плагины, очень удобно для отдельного большого проекта

Код:

!addplugindir myplugin
MyPlugin::SomeFunction


MKN 22-01-2014 13:42 2294015

Определение кодовой страницы

Функция GetACP получает кодовую страницу, установленную на компьютере (ANSI).
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Код:

outfile "codepage.exe"

Section
System::Call 'Kernel32::GetACP() i .r18'
MessageBox MB_OK " codepage $R8"
SectionEnd


Vincent7 22-01-2014 16:16 2294121

Подскажите, как установить ограничение на количество вводимых символов в текстбокс?

K.A.V. 22-01-2014 16:29 2294137

Цитата:

Цитата Vincent7
Подскажите, как установить ограничение на количество вводимых символов в текстбокс? »

Сейчас все кинутся и напишут вам всевозможные варианты кодов (IO, nsDialogs, WinAPI), которые только могут быть, с надеждой, что один из них будет тот, который вам нужен

MKN 22-01-2014 16:31 2294142

Цитата:

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

Используй (пример для 5 символов переменной Password_Text) :

${NSD_SetTextLimit} $Password_Text 5

${NSD_SetTextLimit} $Password_Confirm 5


А точнее, используй http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html
Код:

${NSD_SetTextLimit} control_HWND limit

Vincent7 22-01-2014 20:34 2294369

Спасибо. А как сделать чтобы в текстбокс можно было вводить только цифры?

K.A.V. 22-01-2014 21:04 2294385

Цитата:

Цитата Vincent7
Спасибо. А как сделать чтобы в текстбокс можно было вводить только цифры? »

Код:

${NSD_CreateText} 0 0 100% 12u "1234567890"
 pop $Text
 ${NSD_AddStyle} $Text ${ES_NUMBER}


Vincent7 22-01-2014 22:20 2294414

Благодарствую.

MKN 23-01-2014 12:12 2294630

Ввод цифрового пароля (в примере - это 77777 ) с сопроводительными сообщениями можно организовать и так :
читать дальше »
Код:

OutFile 'Password-Example.exe'

!include "MUI.nsh"
!include "LogicLib.nsh"
!include "nsDialogs.nsh"
!include 'WordFunc.nsh'

Page custom ConfigPage CheckConfig ''
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE 'English'
!insertmacro StrFilter

Var Password_Text
Var Password_Confirm

Function ConfigPage
!insertmacro MUI_HEADER_TEXT 'TEXT' 'HEADER_TEXT'
nsDialogs::Create 1018
Pop $0
${NSD_CreateGroupBox} 50% 0 50% 80% "                            Пароль"
${NSD_CreateLabel} 61% 20u 30% 10% '      Введите пароль'
${NSD_CreateLabel} 60% 70u 33% 10% '    Подтвердите пароль'

${NSD_CreatePassword} 65% 40u 20% 10% ''
Pop $Password_Text
${NSD_CreatePassword} 65% 85u 20% 10% ''
Pop $Password_Confirm

; максимальное количества цифр пароля
${NSD_SetTextLimit} $Password_Text 5
${NSD_SetTextLimit} $Password_Confirm 5
               
${NSD_OnChange} $Password_Text EditNotify
${NSD_OnChange} $Password_Confirm EditNotify

nsDialogs::Show
FunctionEnd

Function CheckConfig
${NSD_GetText} $Password_Text $0
${NSD_GetText} $Password_Confirm $1

${If} $0 == ''
${OrIf} $1 == ''
MessageBox MB_OK 'Введите пароль !'
Abort
${EndIf}

; ПАРОЛЬ
StrCpy $5 77777

${If} $0 != $5
MessageBox MB_OK 'Не правильный пароль ! !'
Abort
${EndIf}

${If} $0 == $5
${AndIf} $1 != $5
MessageBox MB_OK 'Не правильное подтверждение пароля !'
Abort
${EndIf}
FunctionEnd

Function EditNotify
Pop $R0
; считываем изменения из $R0 и заносим в переменную $0
${NSD_GetText} $R0 $0

; определяем длину строки из $0  ( заносим значение в $1 )
StrLen $1 $0       

; фильтруем для $0 ( это $Password_Text ), ввод только цифр (для этого уст значение параметра : 1 )
; заносим результат в $2
${StrFilter} $0 '1' '' '' $2

; определяем длину строки из $2 -  ( заносим значение в $3 )
StrLen $3 $2
       
; если $1 равно любому значению, кроме равного $3
${If} $1 <> $3
MessageBox MB_OK 'Для ввода допустимы только цифры !'
${EndIf}
FunctionEnd

Section
SectionEnd


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

MKN 24-01-2014 10:19 2295150

Появился новый "шкурный" проект для NSIS : VCL Styles for NSIS

http://theroadtodelphi.wordpress.com...yles-for-nsis/

Но размер NSISVCLStyles.dll явно велик, что не есть хорошо...

K.A.V. 24-01-2014 11:02 2295166

Цитата:

Цитата MKN
Но размер NSISVCLStyles.dll явно велик »

1,5-то мегабайт? По сравнению с той dll, которую я в SFX Creator юзаю это просто божественно, там от DMSoft целые 6 Мб :biggrin: (правда там упакованы сразу и необходимые DLL), а как здесь поведёт себя DLL на разных системах - нужно только тестить

Вот парни написали скрипт (может, и девушки), а написать инсталлер своего же скина нормально не смогли, сидел тупил сейчас пару минут, хотел сразу после установки скомпилить скрипт примера, а мне компилятор такой говорит
Цитата:

Invalid command: NSISVCLStyles::LoadVCLStyleA
Error in script "C:\Program Files\The Road To Delphi\NSISVCLStyles\Scripts\example1.nsi" on line 47 -- aborting creation process
Прошелся по папкам NSIS - и правда нету dll :)

Вообщем, у кого ОС 32-bit, бегите за файлом плагина в папочку C:\Program Files (x86)\NSIS :biggrin:

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

MKN 24-01-2014 11:41 2295187

Цитата:

Цитата K.A.V.
1,5-то мегабайт? По сравнению с той dll, которую я в SFX Creator юзаю это просто божественно »

Если инсталлер без скина -100К, а ошкуренный в 10 раз более, то это совсем не божественно... :)
А с установкой автор действительно промахнулся... У меня эта DLL вообще никак и никуда не попала. Пришлось просто извлечь её из установщика.

K.A.V. 24-01-2014 12:38 2295215

Цитата:

Цитата MKN
Если инсталлер без скина -100К, а ошкуренный в 10 раз более »

Паниковать из-за таких цифр можно было лет 10 назад, когда в ходу были флоппи-дисководы, помню, моя первая скопированная игра другу - копирование ярлыка с рабочего стола :biggrin:
Сейчас же, этот мегабайт особого веса не придаёт, если учесть сжатие и объёмы данных, которые пользователям вообще приходится качать в наше время...К тому же, что это за установщик на 100К? Распаковать пару своих фоток? ;)

Всё равно, для альтернативы пойдёт (к тому же, если присутствует встроенный редактор скинов), хоть какое-то разнообразие в поддержке скинов+составление конкуренции другим разрабам подобных плагинов

MKN 24-01-2014 13:16 2295235

Цитата:

Цитата K.A.V.
Сейчас же, этот мегабайт особого веса не придаёт »

Вообщем то да. За исключением всё же, когда инсталлер малого объёма, что бывает часто (разные служебные утилиты и конструкторы). Вот тут то, если захочешь украсить инсталлер, и удивляешься размеру такой одёжки... :) Ведь есть же та же SkinH.dll, малого объёма.

K.A.V. 26-01-2014 06:49 2296435

Проигрывание WAV-файлов

Код:

!define SND_ASYNC 1
!define SND_FILENAME 0x20000
!define SND_LOOP 8


; Проигрываем с ожиданием завершения
  System::Call 'Winmm::PlaySound(t"$EXEDIR\sound.wav", i0, i${SND_FILENAME})'

; Проигрываем без ожидания завершения
  System::Call 'Winmm::PlaySound(t"$EXEDIR\sound.wav", i0, i${SND_FILENAME}|${SND_ASYNC})'

; Проигрываем без ожидания завершения + с зацикливанием
  System::Call 'Winmm::PlaySound(t"$EXEDIR\sound.wav", i0, i${SND_FILENAME}|${SND_ASYNC}|${SND_LOOP})'

Может, кому пригодится, буду юзать в своём креаторе

Минимум ОС: Win2000

Vincent7 26-01-2014 14:20 2296572

Скажите, почему в onclick функции не срабатывает abort?
Код:

${NSD_OnClick} $button click
function click
MessageBox MB_OK "Abort"
abort
functionend

Сообщение есть, аборта нет

K.A.V. 26-01-2014 21:34 2296905

Код:

Function func

 nsDialogs::Create 1018
 pop $0

 ${NSD_CreateButton} 25u 27u 150u 15u "Жми давай!"
 pop $button
 ${NSD_OnClick} $button click

 nsDialogs::Show

FunctionEnd


function click
MessageBox MB_OK "Abort"
abort
MessageBox MB_OK|MB_ICONINFORMATION "after abort"
functionend

Сообщение есть, аборт есть, второго сообщения нет, что я делаю не так, чтобы получить ваше "Сообщение есть, аборта нет"?

Vincent7 27-01-2014 00:07 2296979

Код:

!include "nsDialogs.nsh"
Page custom func
OutFile "test.exe"

var button

Function func
nsDialogs::Create 1018
pop $0
${NSD_CreateButton} 25u 27u 150u 15u "Жми давай!"
pop $button
${NSD_OnClick} $button click
nsDialogs::Show
FunctionEnd

function click
MessageBox MB_OK "Abort"
abort
MessageBox MB_OK|MB_ICONINFORMATION "after abort"
FunctionEnd
Section
SectionEnd

Первое сообщение есть, аборта нет, второго сообщения нет.

K.A.V. 27-01-2014 00:18 2296984

Цитата:

Цитата Vincent7
Первое сообщение есть, аборта нет, второго сообщения нет. »

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

У меня ваш скрипт отрабатывает корректно, т.е. Первое сообщение есть, второго сообщения нет, потому что срабатывает команда Abort

abort - прекращение выполнения команд ниже данной команды, а вы какой функционал от неё ожидаете?

Vincent7 27-01-2014 00:20 2296985

Я жду закрытия программы. А на что еще нужен аборт?

Begin2Fly 27-01-2014 00:22 2296986

Цитата:

Цитата Vincent7
Я жду закрытия программы. А на что еще нужен аборт? »

Много на что: http://nsis.sourceforge.net/Abort
Попробуйте "Quit".

K.A.V. 27-01-2014 00:22 2296987

Цитата:

Цитата Vincent7
Я жду закрытия программы. А на что еще нужен аборт? »

Где вы прочитали, что команда abort закрывает инсталлятор? :o

Команда для закрытия инсталлятора - quit
abort - прекращение выполнения команд ниже данной команды

Vincent7 27-01-2014 00:37 2296995

Ясно, спасибо. Совсем забыл про quit

Vincent7 27-01-2014 22:24 2297515

Как ни странно, но с Quit результат такой же как и с Abort.

K.A.V. 27-01-2014 23:05 2297541

Цитата:

Цитата Vincent7
Как ни странно, но с Quit результат такой же как и с Abort. »

А я всё вспомнить не мог, какой же был багу у nsDialogs :)
Не знаю, может как-то решается это дело в скрипте, кто пишет на nsDialogs может и подскажет вам, я пишу диалоги на IO

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

Код:

!include "nsDialogs.nsh"
Page custom func
OutFile "test.exe"

var button

Function func
nsDialogs::Create 1018
pop $0
${NSD_CreateButton} 25u 27u 150u 15u "Жми давай!"
pop $button
${NSD_OnClick} $button click
nsDialogs::Show
FunctionEnd


function click
MessageBox MB_OK "Abort"
  SendMessage $HWNDPARENT ${WM_CLOSE} 0 0
FunctionEnd


Section
SectionEnd


Vincent7 28-01-2014 17:48 2298009

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

K.A.V. 28-01-2014 18:11 2298020

Цитата:

Цитата Vincent7
на заданое изначально число? »

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

Цитата:

Цитата Vincent7
если в текст боксе вводят число меньшее, чем уже заданное там число »

Для такого сравнения вам в помощь либо if конструкция (в справочнике есть описание), либо команда IntCmp
читать дальше »
Код:

IntCmp $0 5 ЕСЛИ_РАВНО ЕСЛИ_МЕНЬШЕ ЕСЛИ_БОЛЬШЕ
ЕСЛИ_РАВНО:
  DetailPrint "$$0 == 5"
  Goto done
ЕСЛИ_МЕНЬШЕ:
  DetailPrint "$$0 < 5"
  Goto done
ЕСЛИ_БОЛЬШЕ:
  DetailPrint "$$0 > 5"
  Goto done
done:



Цитата:

Цитата Vincent7
при переходе на любой другой контрол »

Смотря что вы подразумеваете под "переходом"

Цитата:

Цитата Vincent7
это число автоматически менялось на заданое изначально число? »

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

Vincent7 28-01-2014 18:28 2298031

K.A.V., при выходе из контрола, то есть при наведении курсора на любое другое место на странице

K.A.V. 28-01-2014 20:28 2298085

Цитата:

Цитата Vincent7
при наведении курсора на любое другое место на странице »

Средствами nsDialogs этого не сделать, насколько мне известно

MKN 29-01-2014 09:25 2298323

Цитата:

Цитата K.A.V.
Средствами nsDialogs этого не сделать »

Как я понял задачу, надо фиксировать "выход из текстбокса" указателя мыши - т..е. когда из области текстбокса будет убран курсор-указатель мыши.
Если так, то это можно организовать с помощью GetCursorPos с последующим определением GetClassName для места нахождения указателя и дальнейшей логикой сравнения - если GetClassName=Edit, то курсор мыши находится в области текстбокса, если нет, то посылаем в текстбокс нужные циферки. Где то такой код уже был...

AndreyGun 29-01-2014 18:25 2298685

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


Если добавить в код команду: !define MUI_COMPONENTSPAGE_SMALLDESC
получается так

А можно ли сделать что бы было так? (как выделено красным)

Saten 29-01-2014 19:11 2298720

добрый вечер.. имеются 2 страницы созданные с помощью nsDialog.. нужно чтобы при активации CheckBoxa на 1ой странице пропускалась 2ая, ну и соответственно наоборот если CheckBox не отмечен, то отображается 2ая страница

Vincent7 29-01-2014 20:16 2298776

Код:

function page 2
${NSD_GetState} $checkbox $R1
${If} $R1 == 1
goto end
${Else}
${EndIf}
nsDialogs::Create 1018



nsDialogs::Show
end:
functionend

как то так...

K.A.V. 29-01-2014 20:52 2298794

Цитата:

Цитата AndreyGun
А можно ли сделать что бы было так? (как выделено красным) »

Справочник по NSIS > Описания плагинов > nsDialogs: Создаем собственные страницы инсталлятора

Цитата:

Цитата Saten
имеются 2 страницы созданные с помощью nsDialog.. нужно чтобы при активации CheckBoxa на 1ой странице пропускалась 2ая, ну и соответственно наоборот если CheckBox не отмечен, то отображается 2ая страница »

Цитата:

Цитата Vincent7
function page 2
${NSD_GetState} $checkbox $R1
${If} $R1 == 1
goto end
${Else}
${EndIf}
nsDialogs::Create 1018
nsDialogs::Show
end:
functionend »

Не учите плохому написанию кода, зачем использовать if конструкции вместе с goto? :o

Либо так:
Код:

Function func 
${NSD_GetState} $checkbox $R1
 ${If} $R1 != 1
  nsDialogs::Create 1018
  nsDialogs::Show
${EndIf}
FunctionEnd

Либо через StrCmp
Код:

Function func 
${NSD_GetState} $checkbox $R1
 StrCmp $R1 "1" end 0
  nsDialogs::Create 1018
  nsDialogs::Show
end:
FunctionEnd


Vincent7 29-01-2014 21:03 2298802

Цитата:

зачем использовать if конструкции вместе с goto?
А что в этом плохого?

K.A.V. 29-01-2014 21:15 2298803

Цитата:

Цитата Vincent7
А что в этом плохого? »

1. Не красиво
2. Запутанно
3. Увеличение числа команд, которые мало того, что создают некрасивую, запутанную конструкцию, да ещё и используются все возможные команды, без которых нужно было обойтись, если вы предлагаете if конструкцию


---
Цитата:

Цитата MKN
Как я понял задачу, надо фиксировать "выход из текстбокса" указателя мыши - т..е. когда из области текстбокса будет убран курсор-указатель мыши.
Если так, то это можно организовать с помощью GetCursorPos с последующим определением GetClassName для места нахождения указателя и дальнейшей логикой сравнения - если GetClassName=Edit, то курсор мыши находится в области текстбокса, если нет, то посылаем в текстбокс нужные циферки. Где то такой код уже был... »

У меня получилось определить, что положение курсора нахоходится над элементом text, только функциями из Gdi32, могу позже выложить пример кода
Правда в такой ситуации, что, создавать только таймер и по нему определять, внесено ли в поле изменение? Или как? Я, к примеру, никогда не печатаю держа курсор на элементе - он меня смущает :biggrin: Какую тогда логику в коде строить? Проверка через X-секунд, вводилось ли значение в поле и потом определять, находится ли курсор над тексбоксом? Как-то не очень стабильно мне кажется...

Saten 30-01-2014 00:01 2298911

Vincent7, K.A.V., блогодарю сделал по аналогии
Код:

Function page1Destroy
  ${NSD_GetState} $CheckBoxAct2 $CheckAct2
FunctionEnd

Function Page2Init
  ${If} $CheckAct2 == 1
  Abort
  ${EndIf}
  nsDialogs::Create 1018
  nsDialogs::Show
FunctionEnd


MKN 30-01-2014 10:29 2299039

Цитата:

Цитата K.A.V.
Какую тогда логику в коде строить? Проверка через X-секунд, вводилось ли значение в поле и потом определять, находится ли курсор над тексбоксом? »

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

Цитата Vincent7
если в текст боксе вводят число меньшее, чем уже заданное там число, то выходе из текст бокса,
это число автоматически менялось на заданое изначально число? »

задать бы вопрос - а на хрена это надо ? Какой практический смысл в таком извращении ?
Мне вот стало интересно решение этой задачи в совсем другом ракурсе практики... Ну да ладно.

Если взять ранее предлагаемый пример с вводом пароля, то отследить нахождение указателя можно, добавив в Function EditNotify такой код :
Код:

System::Alloc 8
Pop $0
System::Call 'USER32::GetCursorPos(ir0)'
System::Call '*$0(i.r8,i.r9)'
System::Free $0
StrCpy $1 $Password_Text
System::Call 'USER32::WindowFromPoint(ir8,ir9)i.r1'
System::Call 'USER32::GetClassName(ir1,t.r2,i ${NSIS_MAX_STRLEN})'
MessageBox mb_ok "$1=$2"  ; если $1=Edit, тогда бла-бла-бла

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

PS Также меня интересует, каким образом отслеживать клики нужных кнопок мыши и как организовать комбинированные нажатия на кнопки, совместно с выбранным символом клавиш. ( Например, на странице есть кнопка, нажав которую совместно с цифрой 1 - запустится или получится одно действие, а нажатие той же кнопки, совместно с цифрой 2 - другое. И т.д. для любых сочетаний символов, в том числе и без нажатия кнопок - только с клавиатуры...
Вроде как для этого можно использовать GetAsyncKeyState... Только не получается...

K.A.V. 30-01-2014 11:05 2299066

Цитата:

Цитата MKN
Не над, а внутри границ »

Имею ввиду "внешне" ;)

Цитата:

Цитата MKN
Если взять ранее предлагаемый пример с вводом пароля, то отследить нахождение указателя можно, добавив в Function EditNotify такой код : »

Ну, это видать только под конкретный 1 элемент на страничке я так понял? А если 2 Edit'a, твоя функция также останется актуальна? :)

Цитата:

Цитата MKN
Наверняка можно сделать изящнее и продвинутее, но возиться не понятно ради чего, лень, да и знаний не хватает... »

Именно поэтому я не стал выкладывать свой код, потому что конкретной цели не особо вижу (да и только набросав, выкладывать "колючий" стыдно), как я выше написал - функция всё равно будет багнутой изначально, т.к. если я введу в элемент значение будучи держа курсор рядом с элементом - провал функции, т.к. ну ты сам понял, положение курсора != а мы уже расчитали и поменяли значение у юзера, что может у него вызвать удивление и забаву, хотя можно потом сказать, что "это не баг, это фича" :biggrin:
Если юзать GDI32, как у меня сейчас в коде (тоже не знал как делать, после твоего первого сообщения с упоминанием PtInRect полез по MSDN), то там создаётся регион от размера элемента (так сказать "невидимые границы"), и потом вызов функции проверки, находятся ли указанные координаты (в нашем случае положение курсора мыши) в пределах этих "невидимых линий", вроде бы тоже работает, если мне не показалось :)

Цитата:

Цитата MKN
каким образом отслеживать клики нужных кнопок мыши »

Это походу только с хуками делается, вообще не в курсе

Цитата:

Цитата MKN
как организовать комбинированные нажатия на кнопки, совместно с выбранным символом клавиш. ( Например, на странице есть кнопка, нажав которую совместно с цифрой 1 »

В момент нажатия кнопки просто проверять статус, нажата ли указанная клавиша, тоже если покопаться по MSDN, думаю такую функцию не составит труда найти, наверное :)

K.A.V. 30-01-2014 11:38 2299094

Цитата:

Цитата MKN
Вроде как для этого можно использовать GetAsyncKeyState... Только не получается... »

Чего не получается?

Код:

Function func 

nsDialogs::Create 1018

 ${NSD_CreateButton} 25u 27u 150u 15u "0"
 pop $button
 ${NSD_OnClick} $button buttonclick
 
nsDialogs::Show
FunctionEnd



function buttonclick

    System::Call "User32::GetAsyncKeyState(i0x10)i.r0"
                                         
        MessageBox MB_OK|MB_ICONINFORMATION "$0"

FunctionEnd

Функция на проверку нажатия левого шифта, если зажата - отрицательное значение выдаёт, если была нажата - 1

MKN 30-01-2014 11:40 2299096

Цитата:

Цитата K.A.V.
А если 2 Edit'a, твоя функция также останется актуальна? »

Нет, этот случай только для одного Edit'a ( или другого элемента )

Цитата:

Цитата K.A.V.
В момент нажатия кнопки просто проверять статус, нажата ли указанная клавиша, тоже если покопаться по MSDN, думаю такую функцию не составит труда найти »

Есть такая
Цитата:

; Функция GetAsyncKeyState устанавливает, в нажатом или отпущенном состоянии находится клавиша во время, когда вызывается функция
; и была ли клавиша нажата после предыдущего вызова GetAsyncKeyState().
; Функция GetAsyncKeyState работает с кнопками мыши. Однако она контролирует состояние физических, а не логических кнопок мыши,
; которыми физические кнопки отображаются.

; назначить коды :
;!define VK_LBUTTON 0x01 # Left mouse button
;!define VK_SHIFT 0x10
System::Call "user32::GetKeyState(i ${код клавиши}) i.r0"
Только с калбэками какая то хрень - или 0 или не 0. От этого вроде как и пляшут. Только это годится только для одного символа... И то много непонятного... А если , как я выше говорил ?

зы Пока калякал, ты уже нашёл этот пример. :)

K.A.V. 30-01-2014 12:21 2299113

Цитата:

Цитата MKN
Только с калбэками какая то хрень - или 0 или не 0. »

Выше я написал, если зажать кнопку и нажать на наш элемент кнопки - возвращается отрицательное значение
Если нажать кнопку и отжать - возвращается 1 (была нажата)
Если не была нажата кнопка - 0

Цитата:

Цитата MKN
А если , как я выше говорил ? »

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

MaGoth 01-02-2014 19:32 2300772

Привет, други.. :)
Пошарился тут по заказникам разрабов, но так толком и не нашел нормального описания по работе с ртф файлами..
Интересуют редактирование текста, кодировка, стилистика и т.д.. Что-нить по этой теме есть вообще с возможностями редактирования приближенными к редактору ?!

K.A.V. 01-02-2014 20:07 2300792

Цитата:

Цитата MaGoth
Интересуют редактирование текста, кодировка, стилистика и т.д.. Что-нить по этой теме есть вообще с возможностями редактирования приближенными к редактору ?! »

Так откройте RTF файл любым текстовым редактором, да посмотрите содержимое, и погуглите что-нибудь типа такой инфы
Может, какие и консольные приложения есть для работы с RTF, не интересовался таким функционалом

MKN 01-02-2014 21:23 2300838

Цитата:

Цитата MaGoth
но так толком и не нашел нормального описания по работе с ртф файлами.. »

А NSIS тут каким боком ?
Цитата:

Цитата MaGoth
интересуют редактирование текста, кодировка, стилистика и т.д.. »

Любой текстовый редактор типа Word и т.д.
Только RTF формат давно морально устарел.
Если уж форматы Microsoft Office 1997-2003 (.doc, .xls, .ppt) уже считаются архаичными (http://habrahabr.ru/post/152427/), то кому нужно это бесполезное старьё RTF...

MaGoth 01-02-2014 21:36 2300848

Эм...
Цитата:

Цитата MKN
А NSIS тут каким боком ? »

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

Цитата:

Цитата MKN
то кому нужно это бесполезное старьё RTF... »

Используется в старых игрушках для описания доки прочего, надоело по 100500 раз менять кодировки и лохматить тонну файлов на осьми языках.. :(

K.A.V. 02-02-2014 07:59 2301023

Цитата:

Цитата MaGoth
Дык, прямым вообще-то, хотелось бы в нем писать создание этих файлов с требуемым форматированием »

Это тоже самое, что говорить про предназначение велосипеда, он связан с паханием поля, велосипед создали - чтобы заменить домашний скот и на нём пахать поле в несколько гектаров
Я же вам дал наводку, RTF файл это тот же текстовый документ, но с особым содержанием, хотите разобраться - читайте доки в инете по типу той, что я вам указал в ссылке про формат файла
А для "создания и редактирования" RTF файлов есть софт, NSIS никак не связан с файлами любого типа, его задача - упаковать и распаковать, всё. Максимум - показать RTF файл в виде информации или лицензионного соглашения

MKN 02-02-2014 11:04 2301079

Цитата:

Цитата MaGoth
хотелось бы в нем писать создание этих файлов »

Имеется ввиду написание скриптов NSIS ? Тогда уж лучше использовать специализированные текстовые редакторы.
Специализация заключается в подсветке синтаксиса программного кода и наличия специальных стилей-шаблонов, ну и конечно инструментов поиска-замены, создания макросов операций и пр. удобства, очень ускоряющие работу.
В частности для написания NSIS скриптов. Таких редакторов много ( http://ufprograms.ru/pages/text/besp...redaktory.html ).
А лучший , на мой взгляд, - Notepad++ . Выбирай сам на свой вкус.
А RTF здесь и рядом не валялся. :)

Цитата:

Цитата MaGoth
надоело по 100500 раз менять кодировки »

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

MaGoth 02-02-2014 18:59 2301379

Цитата:

Цитата K.A.V.
Это тоже самое, что говорить про предназначение велосипеда, он связан с паханием поля, велосипед создали - чтобы заменить домашний скот и на нём пахать поле в несколько гектаров
Я же вам дал наводку, RTF файл это тот же текстовый документ, но с особым содержанием, хотите разобраться - читайте доки в инете по типу той, что я вам указал в ссылке про формат файла
А для "создания и редактирования" RTF файлов есть софт, NSIS никак не связан с файлами любого типа, его задача - упаковать и распаковать, всё. Максимум - показать RTF файл в виде информации или лицензионного соглашения »

Мда... я про Фому мне про Ерему...
Спрошу иначе, есть ли в Нсис возможности, для создания форматирования текста в файлах ртф. для txt-файлов точно есть команды, прописываемые в строку по тексту... а здесь?

Цитата:

Цитата MKN
Имеется ввиду написание скриптов NSIS ? »

Имеется ввиду написание текста для создания текстового файла средствами Нсис с расширением rtf, Т.е.

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

В итоге, в каталоге инсталл будет требуемый файл *.rtf
Notepad++ я и так использую ибо работаю с ЮТФ версией Нсис..

K.A.V. 03-02-2014 02:52 2301614

Цитата:

Цитата MaGoth
Спрошу иначе, есть ли в Нсис возможности, для создания форматирования текста в файлах ртф »

Цитата:

Цитата MaGoth
для txt-файлов точно есть команды, прописываемые в строку по тексту... а здесь? »

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

MaGoth 03-02-2014 03:19 2301615

Цитата:

Цитата K.A.V.
Я же вам дал ссылку выше, RTF-файл - это TXT-файл с особым синтаксисом, то, что вы не хотите в этом разбираться и в упор игнорируете то, что вам пишут -ваши проблемы »

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

Т.е. тот код по вашей ссылке внешне похожий на Си(вроде как) отработает в инсталлере или нет, если его указывать?
Пример хотя бы увидеть какой, дальше сам разберусь.

K.A.V. 03-02-2014 03:31 2301619

Цитата:

Цитата MaGoth
И потом, как же не игнорировать, если спрашиваю про возможности Нсис для форматирования текста в ртф, а в ответ получаю »

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

Цитата:

Цитата MaGoth
Т.е. тот код по вашей ссылке внешне похожий на Си(вроде как) »

Это и есть содержимое RTF файла, а не код языка программирования, так сказать "особая кодировка файла", статью читать нужно, а не высматривать отдельные куски в тексте
Откройте любой RTF файл через текстовый редактор, сколько ещё раз нужно это повторить, чтобы вы попробовали это сделать?

Цитата:

Цитата MaGoth
Пример хотя бы увидеть какой, дальше сам разберусь. »

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

Вот пример RTF файла, в котором написано:
Windows 7 Ultimate

Код:

{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\colortbl ;\red255\green0\blue0;}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang1033\f0\fs22 Windows \b 7\b0  \cf1 Ultimate\cf0\par
}

Видите? Обычный TXT файл с особым содержанием

MaGoth 03-02-2014 05:29 2301628

Цитата:

Цитата K.A.V.
Вот пример RTF файла, в котором написано:
Windows 7 Ultimate »

Да, все разобрался, и что нужно вкрутил в инсталляшку.
Спасибо. :)

TretyakRoman 04-02-2014 16:13 2302576

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

WriteRegStr HKLM "SOFTWARE\aroganit" "Product_Version" "${PRODUCT_VERSION}"
WriteRegStr HKLM "SOFTWARE\aroganit" "Install_Date" "$2.$1.$0 $4:$5:$6"
WriteRegStr HKLM "SOFTWARE\aroganit" "Install_Dir" "$INSTDIR"
WriteRegStr HKLM "SOFTWARE\aroganit" "db" "aroganit"
WriteRegStr HKLM "SOFTWARE\aroganit" "server" "."

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

Начал дальше разбираться, нашел вот такую штучку:

RequestExecutionLevel admin

К сожалению ни каких результатов не дало.

Пробовал другие варианты:

ExecWait reg add hklm\SOFTWARE\aroganit /v Product_Version /t REG_SZ /d ${PRODUCT_VERSION} и т.д., не получилось

Затем создал bat-ник и reg-файл и их запускал с помощью ExecWait, успеха не дало.

Вручную reg-файл через cmd выполнялся успешно, bat-ник выполнялся успешно только когда cmd под админом.

Проблемы скорее всего с правами, как мне их повысить в NSIS. Буду благодарен за помощь :)

Begin2Fly 04-02-2014 16:23 2302586

TretyakRoman, скорее всего у вас всё переадресуется в Software\WoW6432Node. Перед командами записи в реестр напишите такое: SetRegView 64

TretyakRoman 04-02-2014 16:32 2302591

Помогло, буду дальше развивать свои навыки в NSIS. Спасибо большое.

navab 05-02-2014 11:53 2303080

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

MKN 05-02-2014 12:27 2303118

Цитата:

Цитата navab
На странице компонент пользователь отмечает нужные. Как для каждой из них указать свою директорию? »

См. здесь : http://forums.winamp.com/showthread.php?t=230330

K.A.V. 05-02-2014 12:28 2303119

Цитата:

Цитата navab
Как для каждой из них указать свою директорию? »

Не совсем понятно, что вы имеете ввиду...

Как при отметке определённого компонента изменить каталог установки?
читать дальше »
Код:

Section /o "Мой компонент"
  StrCpy $INSTDIR "C:\Мой путь"
  SetOutPath "$INSTDIR"
  File "мой файл для упаковки.txt"
SectionEnd

Section /o "Мой компонент 2"
  StrCpy $INSTDIR "C:\Мой путь 2"
  SetOutPath "$INSTDIR"
  File "мой файл для упаковки 2.txt"
SectionEnd



Или как создать для каждого компонента отдельное запоминание папки?
читать дальше »
Код:

Section /o "Мой компонент"
Var /global MyVarComponent1
  StrCpy $MyVarComponent1 "C:\Мой путь"
  SetOutPath "$MyVarComponent1"
  File "мой файл для упаковки.txt"
SectionEnd

Section /o "Мой компонент 2"
Var /global MyVarComponent2
  StrCpy $MyVarComponent2 "C:\Мой путь 2"
  SetOutPath "$MyVarComponent2"
  File "мой файл для упаковки 2.txt"
SectionEnd


navab 05-02-2014 12:45 2303133

K.A.V, нужно чтобы для каждого выбранного компонента пользователь мог сам выбрать путь, просто записать его в скрипте нельзя.
MKN, я так понял это примерно то что нужно, только код приведенный там не компилируется.
PHP код:

# variables to hold the installation directories 
var Component1Dir 
var Component2Dir 
var Component3Dir 

# components page 
!insertmacro MUI_PAGE_COMPONENTS 

# multiple directory pages 
!define MUI_PAGE_CUSTOMFUNCTION_PRE Component1DirPre 
!define MUI_DIRECTORYPAGE_VARIABLE Component1Dir 
!insertmacro MUI_PAGE_DIRECTORY 

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component2DirPre 
!define MUI_DIRECTORYPAGE_VARIABLE Component2Dir 
!insertmacro MUI_PAGE_DIRECTORY 

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component3DirPre 
!define MUI_DIRECTORYPAGE_VARIABLE Component3Dir 
!insertmacro MUI_PAGE_DIRECTORY 

# The file installation 'page' 
!insertmacro MUI_PAGE_INSTFILES 

# The components (sections) 
Section Component1 
  
# stuff here. Be sure to use the directory variable corresponding 
  # to the directory page used. In this case, for example: 
  
SetOutPath "$Component1Dir" 
    
File "somefile" 
    
File "someotherfile" 
SectionEnd 

Section Component2 
  
# stuff here 
  
SetOutPath "$Component2Dir" 
    
File "somefile" 
    
File "someotherfile" 
SectionEnd 

Section Component3 
  
# stuff here 
  
SetOutPath "$Component3Dir" 
    
File "somefile" 
    
File "someotherfile" 
SectionEnd 

# Functions run before showing each directory page. 
# Here we'll call Abort to stop the page from showing up 
#  if the user didn't select the component 
Function Component1DirPre 
  
# Get the flags for the section 
  
SectionGetFlags ${Component1$R0 
  
# Binary 'and' with value '1' (selected or not) 
  
IntOp $R0 $R0 
  
# If it is not selected 
  
IntCmp $R0 0 0 +
    
# Then Abort. This will prevent the page from showing up 
    
Abort 
  
# Otherwise, continue 
FunctionEnd 

Function Component2DirPre 
  SectionGetFlags 
${Component2$R0 
  IntOp $R0 $R0 

  IntCmp $R0 0 0 
+
    Abort 
FunctionEnd 

Function Component3DirPre 
  SectionGetFlags 
${Component3$R0 
  IntOp $R0 $R0 

  IntCmp $R0 0 0 
+
    Abort 
FunctionEnd 

Error in macro MUI_PAGE_DIRECTORY on line 21

K.A.V. 05-02-2014 13:23 2303167

Код:

var Component1Dir
var Component2Dir
var Component3Dir

!insertmacro MUI_PAGE_COMPONENTS

!define MUI_DIRECTORYPAGE_VARIABLE $Component1Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_DIRECTORYPAGE_VARIABLE $Component2Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_DIRECTORYPAGE_VARIABLE $Component3Dir
!insertmacro MUI_PAGE_DIRECTORY

!insertmacro MUI_PAGE_INSTFILES






Section TEST1 Component1
  SetOutPath "$Component1Dir"
#    File "..."
#    File "..."
SectionEnd

Section TEST2 Component2
  SetOutPath "$Component2Dir"
#    File "..."
#    File "..."
SectionEnd

Section TEST3 Component3
  SetOutPath "$Component3Dir"
#    File "..."
#    File "..."
SectionEnd


navab 05-02-2014 13:27 2303172

я так понимаю, что мы объявляем две константы времени компиляции. В эти переменные заносится результат возвращаемый Component1Dir например, вызывается макрос и вываливается ошибка в самом макросе:
PHP код:

!ifdef MUI_DIRECTORYPAGE_VARIABLE
      DirVar 
"${MUI_DIRECTORYPAGE_VARIABLE}"
    
!endif 

K.A.V., сделал как Вы написали, всегда выскакивают 3 окна с указанием директории, сколько бы компонентов не было выбрано.

K.A.V. 05-02-2014 14:24 2303228

Цитата:

Цитата navab
K.A.V., сделал как Вы написали, всегда выскакивают 3 окна с указанием директории, сколько бы компонентов не было выбрано. »

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

Код:

var Component1Dir
var Component2Dir
var Component3Dir

!insertmacro MUI_PAGE_COMPONENTS

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component1DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component1Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component2DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component2Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component3DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component3Dir
!insertmacro MUI_PAGE_DIRECTORY

!insertmacro MUI_PAGE_INSTFILES





Section TEST1 Component1
  SetOutPath "$Component1Dir"
#    File "..."
#    File "..."
SectionEnd

Section TEST2 Component2
  SetOutPath "$Component2Dir"
#    File "..."
#    File "..."
SectionEnd

Section TEST3 Component3
  SetOutPath "$Component3Dir"
#    File "..."
#    File "..."
SectionEnd
           

 
Function Component1DirPre
  SectionGetFlags ${Component1} $R0
  IntOp $R0 $R0 & 1
  StrCmp $R0 "1" +2 0
    Abort
FunctionEnd

Function Component2DirPre
  SectionGetFlags ${Component2} $R0
  IntOp $R0 $R0 & 1
  StrCmp $R0 "1" +2 0
    Abort
FunctionEnd

Function Component3DirPre
  SectionGetFlags ${Component3} $R0
  IntOp $R0 $R0 & 1
  StrCmp $R0 "1" +2 0
    Abort
FunctionEnd


navab 05-02-2014 14:40 2303243

Спасибо, все работает. Если можно еще пару вопросов, просто хотел бы разобраться:
1.
PHP код:

StrCmp $R0 "1" +2 0
Abort 

что тут происходит?
2. Попробовал переделать функции таким образом:
PHP код:

var Component1Dir
var Component2Dir
var Component3Dir

var chek1
var chek2
var chek3

!insertmacro MUI_PAGE_COMPONENTS

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component1DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component1Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component2DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component2Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component3DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component3Dir
!insertmacro MUI_PAGE_DIRECTORY


!insertmacro MUI_PAGE_INSTFILES

# The components (sections)
Section Component1
  StrLen 
$"$MUI_PAGE_CUSTOMFUNCTION_PRE"
  
SetOutPath "$Component1Dir"
SectionEnd

Section Component2
  
# stuff here
  
SetOutPath "$Component2Dir"
SectionEnd

Section Component3
  
# stuff here
  
SetOutPath "$Component3Dir"
SectionEnd


Function Component1DirPre
  SectionGetFlags 
${Component1$chek3
    MessageBox MB_OK 
"$chek3"
    
${If} $chek3 == 0
    Abort
    
${EndIf}
FunctionEnd

Function Component2DirPre
  SectionGetFlags 
${Component2$chek1
    MessageBox MB_OK 
"$chek1"
    
${If} $chek1 == 0
    Abort
    
${EndIf}
FunctionEnd

Function Component3DirPre
  SectionGetFlags 
${Component3$chek2
    MessageBox MB_OK 
"$chek2"
    
${If} $chek2 == 0
    Abort
    
${EndIf}
FunctionEnd 

Значения chek1-chek3 получаю все время одинаковые, либо все 0, либо все 1, соответственно вывод страниц работает не правильно. Что не так?

K.A.V. 05-02-2014 14:56 2303257

Цитата:

Цитата navab
что тут происходит? »

Плохо читали справочник, попробуйте сами разобраться
Справочник по NSIS => Перевод справки NSIS => SectionGetFlags
+
Справочник по NSIS => Перевод справки NSIS => StrCmp

Цитата:

Цитата navab
2. Попробовал переделать функции таким образом: »

Я же вам сразу дал переделанные части кода, читайте в справочнике, как правильно прописывать секции
Справочник по NSIS => Перевод справки NSIS => Section
У вас секции без индексов (в ссылке, данной MKN изначально код не совсем рабочий), а в моём коде там поправлено, смотрите внимательней

Было (без указаний идентификаторов секций, как у вас сейчас):

Код:

Section Component3
  # stuff here
  SetOutPath "$Component3Dir"
SectionEnd

В моём коде:
Код:

Section TEST3 Component3
  SetOutPath "$Component3Dir"
#    File "..."
#    File "..."
SectionEnd


MKN 05-02-2014 15:11 2303268

По моему, идея использовать стандартные страницы PAGE_COMPONENTS для выбора INSTDIR - не удачная...
Ладно, когда компонентов 2-3, а если 10 или более ? Задолбаешься страницы перелистывать и вообще забудешь для какого компонента чего выбрать и уже выбрал...
Такие вещи надо делать на кастомной странице, где всё удобно и наглядно.

navab 05-02-2014 15:26 2303284

Читал и то и другое, я так понял, что полсле опрератора должны идти метки, типа isless, isequal и т.п.
А такая форма
StrCmp $R0 "1" +2 0
означает, что если R0==1, то пропускаем следующую строчку? Но тогда мы просто попадаем на EndFunction, каким образом в этом случае срабатывает механизм отмены показа страницы?
По SectionGetFlags вопросов не было.
Да, идентификаторы я не заметил, а как они влияют на выполнение функций? Мы то вызываем SectionGetFlags ${Component1}, т.е. по имени обращаемся?

MKN, подскажите каким образом это сделать? Про кастом пайдж прочитал в справочнике, но как реализовать не совсем понятно.

navab 05-02-2014 15:47 2303304

и вдогонку, перед !insertmacro MUI_PAGE_COMPONENTS пишу !insertmacro MUI_PAGE_WELCOME - свал,
Error: resolving install function "Nsis2Io" in function "mui.WelcomePre_23.5.9"
Error - aborting creation process

K.A.V. 05-02-2014 16:02 2303313

Цитата:

Цитата navab
StrCmp $R0 "1" +2 0
означает, что если R0==1, то пропускаем следующую строчку? »

В справочнике же есть пример...
Число +2 здесь означает, если значения равны, то пропустить одну команду, относительно команды StrCmp

Цитата:

Цитата navab
каким образом в этом случае срабатывает механизм отмены показа страницы? »

Почему отмены то? Если R0==1 - секция отмечена, а если отмечена, значит мы показываем страничку выбора каталога, т.е. не прерываем исполнение следующего по коду макроса командой abort

Цитата:

Цитата navab
Да, идентификаторы я не заметил, а как они влияют на выполнение функций? Мы то вызываем SectionGetFlags ${Component1}, т.е. по имени обращаемся? »

Такое ощущение, что вы ещё один гость в этой теме, который просто не видит словосочетаний "читайте справочник", примеры в справочнике на страничке SectionGetFlags для кого были написаны? Там разве идёт обращение по имени секции? Или вы такой же уникальный, как некоторые в этой теме, что мы все должны вам персонально пересказать содержание страниц справочника?

Цитата:

Цитата navab
и вдогонку »

Может, заплатите всем, кто здесь вам "решает проблемы, которые вы накидываете вдогонку"?
Ищите проблему в своём скрипте, при добавлении строки
Код:

!insertmacro MUI_PAGE_WELCOME
у меня ошибки компиляции не возникает

Цитата:

Цитата navab
MKN, подскажите каким образом это сделать? Про кастом пайдж прочитал в справочнике, но как реализовать не совсем понятно. »

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


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

MKN 05-02-2014 16:14 2303320

Цитата:

Цитата navab
каким образом это сделать? »

С помощью http://nsis.sourceforge.net/Docs/nsD...ctfolderdialog
Примеров тьма и в теме и в сети.

navab 05-02-2014 16:16 2303322

не злитесь.
за помощь спасибо

AndreyGun 12-02-2014 20:24 2308031

Доброго времени суток Ув.Форумчане!

Вопрос по NSIS, возможно ли сделать так как здесь:
http://fixila.com/download/FixilaPlus.exe

кто не хочет качать объясню с радостью.

При запуске инсталлятора на странице приветствия есть ссылка на лиц соглашение.

1ый Вопрос - Возможно разместить ссылку в описании на странице приветствия?

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

Тобишь, страница выбора компонентов разделена на несколько страниц, вместо одной.

2ой Вопрос - Возможно ли такое сделать в NSIS (несколько страниц выбора компонентов, только на одной странице одна галочка)? Так как я не знаю в чем собран данный SETUPник

ну и 3ий Вопрос - Можно ли установить фон, на страницАХ выбора компонентов.

Спасибо!

K.A.V. 13-02-2014 12:22 2308350

Цитата:

Цитата AndreyGun
http://fixila.com/download/FixilaPlus.exe »

При запуске Касперский ругается на попытку приложения загрузить вредоносное ПО, предупреждать нужно

Цитата:

Цитата AndreyGun
1ый Вопрос - Возможно разместить ссылку в описании на странице приветствия? »

Какой смысл в ссылке на лицензию? Лучше сделать отдельную страничку, т.к. если пользователь запустит установщик на компе, где нет интернета - смысл ссылки пропадает
Приведу сразу пример кода, т.к. вроде бы не видел ещё данной необходимости у кодеров, может, ещё кому пригодится для других нужд
читать дальше »

Код:


!include "MUI2.nsh" ; Подключаем графический интерфейс средствами nsDialogs

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "WelcomeFinishLink_K.A.V._Example" ; Функция создания ссылки
!insertmacro MUI_PAGE_WELCOME ; Показ странички приветствия

Page custom MyComponents  ; Показ странички компонентов

!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "russian"

Caption "K.A.V. Example"                 
Name "K.A.V. Example"                 
OutFile "TestLink.exe"


Function WelcomeFinishLink_K.A.V._Example  ; Функция создания ссылки
StrCpy $0 "175"
; Если используете MUI_WELCOMEPAGE_TITLE_3LINES, поставьте значение "185"

    ${NSD_CreateLink} 120u $0u 195u 10u "OSZone.net - лучший сайт!"  ; Текст и позиция ссылки
    Pop $0
    SetCtlColors $0 "0x0000A8" "0xFFFFFF"  ; Назначаем синий цвет текста (первый параметр) и цвет фона текста (второй параметр)
    ${NSD_OnClick} $0 "OpenSite_K.A.V._Example" ; Назначаем действие по нажатию на ссылку, выполнение функции
FunctionEnd

Function OpenSite_K.A.V._Example  ; Функция, выполняемая при нажатии на ссылку
  ExecShell open "http://www.oszone.net/"  ; Команда открытия сайта в интернете
FunctionEnd

         
         
         
         
Function MyComponents  ; Показ странички компонентов
nsDialogs::Create 1018
 Pop $0
 SetCtlColors $0 "" "0xFFFF80"  ; Назначаем желтый цвет фона
 SetCtlColors $HWNDPARENT "" "0xFFFF80"  ; Назначаем желтый цвет фона

 ${NSD_CreateCheckBox} 0 45u 100u 10u "Тестовый элемент" ; Тестовый элемент чекбокса
 Pop $0
 SetCtlColors $0 "" "0xFFFF80"  ; Назначаем желтый цвет фона каждому создаваемому элементу

nsDialogs::Show
FunctionEnd
         
         



Section 
SectionEnd



Цитата:

Цитата AndreyGun
2ой Вопрос - Возможно ли такое сделать в NSIS (несколько страниц выбора компонентов, только на одной странице одна галочка)? »

Справочник по NSIS » Описание плагинов » nsDialogs: Создаем собственные страницы инсталлятора
Читали? Походу нет

Цитата:

Цитата AndreyGun
ну и 3ий Вопрос - Можно ли установить фон, на страницАХ выбора компонентов. »

Ответ в примере моего кода выше

AndreyGun 13-02-2014 18:45 2308623

Цитата:

Цитата K.A.V.
Справочник по NSIS » Описание плагинов » nsDialogs: Создаем собственные страницы инсталлятора
Читали? Походу нет »

Спасибо большое за ответы.

1. По поводу ссылки, я имел ввиду вообще ссылку на что то )(Это для справки) Это у меня кстати частично получилось:
http://nsis.sourceforge.net/Add_link...come_page_(MUI)
Единственный минус в том что нужно вводить квадрат видимости ссылки который перекрывается страницу, то есть -
Текст
Ссылка - сделать можно, а

Текст
ССылка
Текст - не получается, белый фон перекрывает текст что ниже ссылки.(по крайней мере у меня)

2. Читал справочник, и по nsDialogs, но я пока не могу разобраться в назначении действий, Т.е - чтобы при нажатии на чекбокс выбиралась программа для установки, а не просто "клацалась" галочка, чтобы при нажатии кнопки "Назад" выполнялось соответствующее действие.
Еще Я пробовал через HM NSIS Edit создать страницу, создал, все в точности как мне нужно, кнопки расположенны в нужных местах, но я не пойму как кнопке назначить действие - назад , вперед и тд(как выше описано).
(Делал кстати по справочнику Обучение IO собственные странички)

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

3. Кстати вопрос назрел, переместить кнопку, тоже через nsDialogs можно?

AndreyGun 13-02-2014 22:10 2308714

Цитата:

Цитата K.A.V.
При запуске Касперский ругается на попытку приложения загрузить вредоносное ПО, предупреждать нужно »

Cорри, у меня стандартный WIn 8 защитник молчит. Может не вирус, а как например на кряки для игр ругается.

K.A.V. 13-02-2014 22:19 2308727

Цитата:

Цитата AndreyGun
1. По поводу ссылки, я имел ввиду вообще ссылку на что то )(Это для справки) »

Я же вам привёл универсальный код, там вызывается функция при нажатии на ссылку, а какой вам функционал нужен при нажатии - уже пишите сами, в моём примере это команда открытия сайта
Вы просили ссылку в тексте, как в указанном вами установщике - я вам дал готовый код

Цитата:

Цитата AndreyGun
не могу разобраться в назначении действий, Т.е - чтобы при нажатии на чекбокс выбиралась программа для установки, а не просто "клацалась" галочка »

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

${NSD_GetState} $CheckBox $R0
$CheckBox - переменная элемента управления, с помощью данной переменной мы будем читать значение чекбокса, когда она указывается - тоже есть в справочнике, при создании элемента:
Код:

${NSD_CreateCheckBox} 0 45u 100u 10u "Можно отметить флажком"
Pop $CheckBox

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

Цитата:

Цитата AndreyGun
чтобы при нажатии кнопки "Назад" выполнялось соответствующее действие. »

При кнопке "Назад" будет показана предыдущая страница, вроде бы заходила здесь уже речь об обработке данного события, лень мне искать

Воспользуйтесь поиском в теме по фразе "nsDialogs", много примеров здесь найдёте

Цитата:

Цитата AndreyGun
3. Кстати вопрос назрел, переместить кнопку, тоже через nsDialogs можно? »

Кнопку, такую как "Далее" и "Отмена"? Можете редактировать файл ресурса интерфейса в папке NSIS:
Код:

.\NSIS\Contrib\UIs
Точнее, взять оттуда файл, отредактировать и прописать в скрипте:
Код:

!define MUI_UI "путь к exe файлу"

AndreyGun 13-02-2014 23:45 2308797

Цитата:

Цитата K.A.V.
Пробовали хотя бы сами вписать код в справочнике и посмотреть на результат? »

Пробовал, я просто еще не особо "догоняю" в этой теме)

Спасибо за полезные ответы, очень признателен.

Kopejkin 15-02-2014 22:16 2309662

Почему-то после установки NSIS 3.02 HM NIS Edit 2.0.3 не может открыть скомпилированный файл.
---------------------------
Win32 Error. Code: 2.
Не удается найти указанный файл.
--------------------------
Вручную файл нормально запускается.

K.A.V. 16-02-2014 14:28 2309876

Цитата:

Цитата Kopejkin
HM NIS Edit 2.0.3 не может открыть скомпилированный файл. »

Баг версии, у меня точно также, в версии 2.0.1 такой проблемы нет, насчет 2.0.2 не знаю
Я вообще через NIS Edit отучился запускать инсталляшки, т.к. уж очень часто редактор сваливается в краш с закрытием всех открытых файлов, когда пишу "креатор" - открытых файлов может быть штук ~10, и уж очень неудобно потом вспоминать, где был курсор в каждом редактируемом файле, так что я компилю через контекстое меню, а NIS Edit - просто редактор, пока лень брать другой, не особо много уже пишу на NSIS

Kopejkin 17-02-2014 02:13 2310251

Ну если вы не "особо много пишете", то значит я вообще ничего не пишу :) А где взять версию 2.0.1? Я как-то привык к HM NIS Edit.

Begin2Fly 17-02-2014 09:02 2310346

Цитата:

Цитата Kopejkin
А где взять версию 2.0.1? »

http://sourceforge.net/projects/hmne...%20NIS%20Edit/

Vincent7 20-02-2014 00:13 2312150

Здравствуйте господа. Такой вопрос, можно ли декомпилировать эти плагины как нибудь чтобы узнать как ими пользоваться? взяты из nsis установщика.
http://gfile.ru/a5twO

K.A.V. 20-02-2014 00:46 2312165

Цитата:

Цитата Vincent7
можно ли декомпилировать эти плагины как нибудь чтобы узнать как ими пользоваться? »

Либо спросите у BioWare, либо только методом тыка (а может, я просто в этой теме не особо шарю и можно как-то по-другому :)), список функций можно узнать, а для чего данные функции нужны и какие параметры передавать в них - сидите копайтесь сами, если нужно
Список функций:
читать дальше »
Код:

nsisDirSelect::Null
nsisDirSelect::Unload
nsisDirSelect::rSelect
nsisDirSelect::silentDirSelect
nsisNextFile::GetNextFile
nsisNextFile::Null
nsisUnRar2::Extract
nsisUnRar2::GetUnpackedTotals
nsisUnRar2::Null
nsisUnRar2::SetProgressBar
nsisUnRar2::UnloadUnrarDLL
unrar::RARCloseArchive
unrar::RARGetDllVersion
unrar::RAROpenArchive
unrar::RAROpenArchiveEx
unrar::RARProcessFile
unrar::RARProcessFileW
unrar::RARReadHeader
unrar::RARReadHeaderEx
unrar::RARSetCallback
unrar::RARSetChangeVolProc
unrar::RARSetPassword
unrar::RARSetProcessDataProc
unrar::___CPPdebugHook



Например, можно распаковать файлы из RAR архива вот такой командой:
Код:

nsisUnRar2::Extract "$DESKTOP\plugins.rar" "$DESKTOP\TEST"
1ый параметр - путь к RAR архиву, 2ой - директория назначения
И команда не отработает в .onInit функции, плагину нужен графический интерфейс инсталлятора (может, покопаетесь и получится, я не стал сидеть разбираться), поэтому конкретно данная команда отработает только в секциях

Kopejkin 20-02-2014 17:04 2312547

Цитата:

Цитата K.A.V.
...в версии 2.0.1 такой проблемы нет, насчет 2.0.2 не знаю... »

В версии 2.0.2 такой проблемы тоже нет.

Подскажите, как в инсталляторе отобразить еще одну страничку, не обязательно после странички с лицензионным сообщением, в которой текст из rtf/txt файла будет отображен на том языке, который был выбран в начале установки, т.е. подобно странице лицензии? Создавать кастомную страницу или можно обойтись штатными средствами?

И еще. Нужно предоставить пользователю возможность запуска программы после её установки на финишной странице инсталлятора. Нюанс в том, что инсталлятор универсальный: для х86/х64. Программа, устанавливаемая на 64-разр. ОС имеет одно имя, а на 32-разр. - другое.
Собственно, разница в именах небольшая, но она есть: WinSnap64.exe и WinSnap.exe? Путь установки по-умолчанию одинаков для систем обеих разрядностей - C:\Program Files\WinSnap.

Может здесь кто-нибудь уже решал подобные проблемы? Ткните носом, пожалуйста?

K.A.V. 20-02-2014 17:59 2312578

Цитата:

Цитата Kopejkin
Подскажите, как в инсталляторе отобразить еще одну страничку, не обязательно после странички с лицензионным сообщением, в которой текст из rtf/txt файла будет отображен на том языке, который был выбран в начале установки, т.е. подобно странице лицензии? Создавать кастомную страницу или можно обойтись штатными средствами? »

Можно штатными средствами, но у меня, к примеру, не получается изменить текст в шапке, где пишется "Лицензионное соглашение" и "Прочтите условия соглашения бла бла бла", поэтому в своём креаторе я написал функции по скрытию данного текста при показе файла информации, если устроит такой вариант - пользуйтесь

Цитата:

Цитата Kopejkin
И еще. Нужно предоставить пользователю возможность запуска программы после её установки на финишной странице инсталлятора. Нюанс в том, что инсталлятор универсальный: для х86/х64. Программа, устанавливаемая на 64-разр. ОС имеет одно имя, а на 32-разр. - другое.
Собственно, разница в именах небольшая, но она есть: WinSnap64.exe и WinSnap.exe? Путь установки по-умолчанию одинаков для систем обеих разрядностей - C:\Program Files\WinSnap.
Может здесь кто-нибудь уже решал подобные проблемы? Ткните носом, пожалуйста? »

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

!define MUI_LICENSEPAGE_TEXT_BOTTOM "$(^ClickNext)" ; меняем текст под элементом отображения текста информация (за место инфы о принятии соглашения будет просто "Нажмите кнопку далее")
!define MUI_PAGE_CUSTOMFUNCTION_PRE TextInfoPage ; функция для скрытия двух строк в шапке, об этом я написал в начале своего сообщения
!insertmacro MUI_PAGE_LICENSE "$(infotext)" ; здесь мы указываем, что следует показать файл информации, в зависимости от выбранного языка
!define MUI_PAGE_CUSTOMFUNCTION_PRE TextInfoPage2  ; функция для показа двух строк в шапке, об этом я написал в начале своего сообщения, чтобы на страничке Лицензии данные строки были видны
!insertmacro MUI_PAGE_LICENSE "$(license)" ; здесь мы указываем, что следует показать файл лицензии, в зависимости от выбранного языка

!insertmacro MUI_PAGE_INSTFILES

!define MUI_FINISHPAGE_RUN ; Добавляем галочку запуска приложения на финишной странице
!define MUI_FINISHPAGE_RUN_TEXT "$(runprogram)" ; текст запуска программы, в зависимости от языка
!define MUI_FINISHPAGE_RUN_FUNCTION RunProgramFunc  ; функция запуска приложения, именно здесь мы решим, какой EXE файл нам необходимо запустить
!insertmacro MUI_PAGE_FINISH ; подключаем финишную страничку

; ------------
!insertmacro MUI_LANGUAGE "Russian" ; подключаем язык
!insertmacro MUI_LANGUAGE "English"  ; подключаем язык
LicenseLangString infotext ${LANG_RUSSIAN} "C:\Users\APTEM\Desktop\Text_Russian.txt" ; файл с информацией на русском языке
LicenseLangString infotext ${LANG_ENGLISH} "C:\Users\APTEM\Desktop\Text_English.txt"  ; файл с информацией на английском языке

LicenseLangString license ${LANG_RUSSIAN} "C:\Users\APTEM\Desktop\license_Russian.txt"  ; файл с лицензией на английском языке
LicenseLangString license ${LANG_ENGLISH} "C:\Users\APTEM\Desktop\license_English.txt"  ; файл с лицензией на английском языке

LangString runprogram ${LANG_RUSSIAN} "Запустить приложение" ; текст запуска приложения на русском языке
LangString runprogram ${LANG_ENGLISH} "Run program" ; текст запуска приложения на английском языке

Теперь добавим остальные функции:
Функции для скрытия/показа текста в шапке
Код:

Function TextInfoPage
 GetDlgItem $1 $HWNDPARENT 1037
  ShowWindow $1 0
 GetDlgItem $1 $HWNDPARENT 1038
  ShowWindow $1 0
 GetDlgItem $1 $HWNDPARENT 1
  SendMessage $1 0x000C 0 "STR:$(^NextBtn)" ; этой командой при показе странички информации мы меняем имя кнопки на "Далее"
FunctionEnd

Function TextInfoPage2
 GetDlgItem $1 $HWNDPARENT 1037
  ShowWindow $1 1
 GetDlgItem $1 $HWNDPARENT 1038
  ShowWindow $1 1
FunctionEnd

Функция запуска приложения на финишной страничке в зависимости от разрядности ОС
Код:

Function RunProgramFunc
var /global IsWow64Process
  System::Call kernel32::GetCurrentProcess()i.s
  System::Call kernel32::IsWow64Process(is,*i.s)
  Pop $IsWow64Process
StrCmp $IsWow64Process "1" 0 +2
 exec "$INSTDIR\MyProgram_x64.exe"
StrCmp $IsWow64Process "0" 0 +2
 exec "$INSTDIR\MyProgram.exe"
FunctionEnd

Если ничего не забыл, то должно работать :)

Kopejkin 21-02-2014 03:58 2312816

Цитата K.A.V.:
...не получается изменить текст в шапке.. »
Это называется "заработался". Я на этом тоже подорвался :) Поэтому и спрашивал.

Чтобы заменить текст, нужно для строк 1-4 использовать LangString
А для последней, пятой - LicenseLangString

Код:

    !define MUI_PAGE_HEADER_TEXT  "$(info_title)"                                ;1. где "Лиц. соглашение"
    !define MUI_PAGE_HEADER_SUBTEXT "$(info_subtitle)"                    ;2. где "Прочтите условия.."
    !define MUI_LICENSEPAGE_TEXT_BOTTOM " * * * * * * * *"            ;3. текст под текстовым полем
    !define MUI_LICENSEPAGE_BUTTON "$(info_button)"                        ;4. текст на кнопке "Далее"
    !insertmacro MUI_PAGE_LICENSE "$(infotext)"                                  ;5. имя файла с текстом

А за финишную страничку еще раз спасибо.

Vincent7 21-02-2014 18:25 2313255

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

kotkovets 21-02-2014 19:25 2313291

Цитата:

Цитата Vincent7
установщик переходил на финишную страницу »

в данном случае поможет только отрисовка своей странички финиша
в функции abort отрисовываем нужную страничку или прыгаем на стандарт, подбирая циферку
Код:

!include "MUI2.nsh"

!define MUI_ABORTWARNING
!define MUI_ABORTWARNING_TEXT "отменить установку?"
!define MUI_CUSTOMFUNCTION_ABORT Abort
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

OutFile test.exe

Section

SectionEnd


Function Abort
  MessageBox MB_OK "abort" IDOK
  SendMessage $HWNDPARENT "0x408" "$R9" "цифра"
FunctionEnd

примеры есть прыжки по страничкам и здесь на форуме я не раз выкладывал
http://nsis.sourceforge.net/Go_to_a_NSIS_page#Modern_UI

Vincent7 22-02-2014 22:24 2313903

Код:

!include "MUI2.nsh"
!define MUI_PAGE_CUSTOMFUNCTION_ABORT Exit
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

OutFile "test.exe"

Section
DetailPrint "Installing"
Sleep 3000
SectionEnd

Function rgo
IntCmp $9 0 0 move move
StrCmp $9 "X" 0 move
StrCpy $9 "120"
move:
SendMessage $HWNDPARENT "0x408" "$9" ""
FunctionEnd

Function Exit
StrCpy $9 1
Call rgo
Abort
FunctionEnd

выдает ошибку в функции exit по завершению компилирования

Begin2Fly 22-02-2014 22:28 2313907

Цитата:

Цитата Vincent7
выдает ошибку в функции exit по завершению компилирования »

Не ошибку, а уведомление о том, что эта функция не вызывалась.
1 warning: install function "Exit" not referenced - zeroing code (260-264) out
Переводчик вам в помощь.

Vincent7 23-02-2014 00:18 2313964

но она ведь вызывается. разве нет?
!define MUI_PAGE_CUSTOMFUNCTION_ABORT Exit

K.A.V. 23-02-2014 00:55 2313974

Цитата:

Цитата Vincent7
но она ведь вызывается. разве нет? »

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

Вам показали:
Цитата:

Цитата kotkovets
!define MUI_CUSTOMFUNCTION_ABORT Abort »

А вы у себя написали:
Цитата:

Цитата Vincent7
!define MUI_PAGE_CUSTOMFUNCTION_ABORT Exit »


wolkow70 23-02-2014 10:29 2314095

Столкнулся с такой проблемой: не могу через макрос
${GetOptions} $CMDLINE "/D=" $0
прочитать значение ключа "/D=" в командной строке. Устанавливается флаг ошибки, и в переменной пусто.
Причем для любой другой буквы параметр читается, а для "D" нет.
Понимаю, что этот ключ специфичный, но нужно из функции .OnInit прочитать значение, или хотя-бы проверить на наличие ключа.
Кто нибудь может дать подсказку?

Begin2Fly 23-02-2014 12:48 2314154

wolkow70, а если пойти другим путём и вместо проверки самого ключа посмотреть на то, за что он отвечает?
То есть в данном случае за смену папки установки, поэтому, как вариант:

Код:

${IfNot} $INSTDIR == "%ПАПКА УСТАНОВКИ ПО УМОЛЧАНИЮ%"
  MessageBox MB_OK "Ключ /D присутствует и его значение: $INSTDIR"
${Else}
  MessageBox MB_OK "Ключ /D если и присутствует, то папка установки совпадает с папкой по умолчанию"
${EndIf}


wolkow70 23-02-2014 13:15 2314171

Цитата:

Цитата Begin2Fly
wolkow70, а если пойти другим путём и вместо проверки самого ключа посмотреть на то, за что он отвечает?
То есть в данном случае за смену папки установки, поэтому, как вариант: »

Примерно по такому пути пока и пошел. Сделал примерно так:

Var CmdInstallDirectory
InstallDir "$INSTDIR"

Function .OnInit
StrCpy $CmdInstallDirectory "$INSTDIR"
;
здесь разный код, в том числе переназначение $INSTDIR по нужным условиям
;
${If} "$CmdInstallDirectory" == ""
${Else}
StrCpy "$INSTDIR" "$CmdInstallDirectory"
${EndIf}
FunctionEnd

Получается, что если нет ключа /D= , то $INSTDIR меняется в функции, а если ключ /D= присутствует, то значение $INSTDIR восстанавливается в конце функции из ключа /D=.

Kopejkin 23-02-2014 13:22 2314174

Цитата:

Цитата MKN:
Появился новый "шкурный" проект для NSIS : VCL Styles for NSIS »
Пытался сделать полностью черный скин на основе AquaGraphite.vsf



Оригинальный AquaGraphite



Переделанный мною скин

Перекрасил на изображении скина все, что нужно... и не нужно (обведено красным) :)
Но так и не избавился от серого фона окна. Может кто подскажет, где и что отвечает за цвет фона окна?
В редакторе скинов просмотрел все вкладки - ничего похожего на значение цвета или ссылку на изображение скина не нашел. А может быть не заметил?
P.S. У меня на Win7 (x64) с этими шкурками противно мерцает полоска прогресс-бара.

На ту же тему.
В редакторе скинов SHeditor (SkinSharp) для создания нового скина нужно загрузить изображение скина и прописать (установить в визуальном редакторе) координаты всех элементов (гемор еще тот). "Подсунуть" редактору измененное изображение скина можно, но тогда он теряет значение всех координат. Т.е. возвращаемся к тому, с чего начинали. Нет ли способа попроще?
Изображение готового скина можно экспортировать (только *.bmp). Допустим, я разукрашу это изображение так, как мне нужно. Работка тоже не из простых, но где-то и поработать не грех :)
Формат и итоговый размер изображения можно настроить. А вот как узнать, хотя бы в том же hex-редакторе, в каком формате изображение было в коде и где этот кусок кода находится?

K.A.V. 23-02-2014 13:30 2314179

Цитата:

Цитата wolkow70
Столкнулся с такой проблемой: не могу через макрос
${GetOptions} $CMDLINE "/D=" $0
прочитать значение ключа "/D=" в командной строке. Устанавливается флаг ошибки, и в переменной пусто.
Причем для любой другой буквы параметр читается, а для "D" нет. »

Читайте командную строку через API функцию:
Код:

Function .onInit
var /global CommandLine
 System::Call "Kernel32::GetCommandLine()t.r0"
 StrCpy $CommandLine $0
MessageBox MB_OK|MB_ICONINFORMATION "$CommandLine"
FunctionEnd


wolkow70 23-02-2014 14:03 2314204

Цитата:

Цитата K.A.V.
Читайте командную строку через API функцию: »

Да, спасибо, работает. Затем можно и ${GetOptions} применить.
В общем, работает так:

Function .OnInit
var /global CommandLine
System::Call "Kernel32::GetCommandLine()t.r0"
StrCpy $CommandLine $0
ClearErrors
${GetOptions} $CommandLine "/D=" $R0
IfErrors +2
StrCpy $INSTDIR "$R0"
Pop $R0
FunctionEnd

Vincent7 23-02-2014 19:43 2314390

K.A.V., в моем случае не помогает код который дал kotkovets, ни те что в представленой им ссылке. Все дело в плагине nsisunrar2, при его использовании он создает ' свою' кнопку отмены, при нажатии которой прерывается только секция в которой используется этот плагин. А затем уже кнопка отмена возвращается в свое обычное состояние, и нужно нажимать ее еще раз. Как быть?

kotkovets 23-02-2014 23:46 2314507

Цитата:

Цитата Vincent7
Все дело в плагине nsisunrar2, при его использовании он создает ' свою' кнопку отмены »

все правильно, разработчик сделал отмену своих действий (плагина),
просите автора ещё и сделать глобальное прерывание :), так сказать на выбор..

K.A.V. 24-02-2014 01:36 2314559

Цитата:

Цитата Vincent7
Как быть? »

Как? Ну, как, я же вам сказал: если вы пользуетесь неизвестным плагином - вам вряд-ли кто-то по нему что-то скажет, а если бы вы посидели и ещё "потыкали", чего вы не делали, я уверен (опять же из-за вашей лени, которая мне уже известна), то могли бы добиться возвращения от плагина числового значения об исходе распаковке архива

Код:

nsisUnRar2::Extract "$DESKTOP\plugins.rar" "$DESKTOP\TEST"
pop $0
pop $1 ; 0 - архив не распакован, 1 - архив распакован
  MessageBox MB_OK|MB_ICONINFORMATION "$1"

мне кажется, плагин возвращает то, что вам нужно

Если к примеру, указанного архива не существует, то в переменных будут следующие данные (опять же смотря на переменную $1 - что там возвращается я не в курсе, видимо коды возврата именно плагина, о которых знает только разраб)
Код:

nsisUnRar2::Extract "$DESKTOP\plugins.rar" "$DESKTOP\TEST"
pop $0
pop $1
pop $2

; $0 - error
; $1 - 15
; $2 - RAR open failed: File open error.

за вас снова всю работу сделали, не проще было бы вам добавить UnRAR.exe в дистрибутив?

Flix 24-02-2014 14:21 2314812

Цитата:

Цитата Kopejkin
Но так и не избавился от серого фона окна. Может кто подскажет, где и что отвечает за цвет фона окна? »

Видать ты не все перекрасил на рисунке. Смотри:


А вот перекрасили:


И теперь цвет фона окна будет - черным.

Цитата:

Цитата Kopejkin
"Подсунуть" редактору измененное изображение скина можно, но тогда он теряет значение всех координат. Т.е. возвращаемся к тому, с чего начинали. Нет ли способа попроще? »

Да, так и есть. Я сам пробовал и так, и сяк, но все равно нужно все координаты и позиции проставлять с нуля.

Цитата:

Цитата Kopejkin
А вот как узнать, хотя бы в том же hex-редакторе, в каком формате изображение было в коде и где этот кусок кода находится? »

Изображение в файле проекта SHeditor хранится в формате BMP, но в нем нет заголовка. Где именно, узнать очень просто. Сохрани изображение из проекта в отдельный файл. Затем открой его и сам файл проекта в НЕХ-редакторе. Выдели и скопируй в буфер пару десятков байт из массива с рисунком, но только не с самого начала файла, а отступи байт 50. Перейди на вкладку с массивом проекта и задай поиск байт, находящихся в буфере. Так ты сможешь найти рисунок. Можешь попробовать его подменить, но размер нового рисунка (без заголовка) не должен отличаться от исходного ни на байт, мне например этого не удалось добиться (правда я преследовал немного другую цель). Но может у тебя все получится. :)

Flix 24-02-2014 15:30 2314860

Возвращаясь к "шкурному" вопросу при помощи SkinSharp, то вот перечень всех функций, которые поддерживает библиотека SkinH.dll (описание API в исходном коде библиотеки - перевод с китайского):

Код:

/*************************************************************/
/*        Описание SkinSharp API                                                                        */
/*************************************************************/

#ifndef SKIN_H
#define SKIN_H

/********************** Коды ошибок **************************/
#define                SRET_OK                                0        // Операция выполнена успешно
#define                SRET_ERROR                        1        // Операция не удалась
#define                SRET_ERROR_READ                        2        // Ошибка файловых операций       
#define                SRET_ERROR_PARAM                3        // Неверный параметр
#define                SRET_ERROR_CREATE                4        // Ошибка создания стиля
#define                SRET_ERROR_FORMAT                5        // Неверный формат стиля
#define                SRET_ERROR_VERSION                6        // Неверная версия стиля
#define                SRET_ERROR_PASSWORD                7        // Неверный пароль доступа к стилю
#define                SRET_ERROR_INVALID                8        // Ошибка авторизации
/*************************************************************/


#define DECLSKINHAPI __declspec(dllimport) int  __stdcall

extern "C"
{
/****************** Функция SkinH_Attach *********************/
// Загрузка файла стиля skinh.she. Для успешной загрузки стиля,
// файл стиля *.she должен быть в одном каталоге с файлом SkinH.dll.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_Attach();
/*************************************************************/

/****************** Функция SkinH_AttachEx *******************/
// Загрузка файла стиля по указанному пути.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_AttachEx(
                                LPCTSTR strSkinFile,        // Путь к файлу стиля.
                                LPCTSTR strPassword        // Пароль к файлу стиля.
                                );
/*************************************************************/

/****************** Функция SkinH_AttachExt ******************/
// Загрузка указанного файла стиля с заданными параметрами насыщенности, оттенка и яркости.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_AttachExt(
                                LPCTSTR strSkinFile,        // Путь к файлу стиля.
                                LPCTSTR strPassword,        // Пароль к файлу стиля.
                                int nHue,                // Оттенок. Диапазон значений от -180 до +180, по умолчанию 0.
                                int nSat,                // Насыщенность. Диапазон значений от -100 до +100, по умолчанию 0.
                                int nBri                // Яркость. Диапазон значений от -100 до +100, по умолчанию 0.
                                );
/*************************************************************/

/****************** Функция SkinH_AttachRes ******************/
// Загрузка указанного ресурса стиля с заданными параметрами насыщенности, оттенка и яркости.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_AttachRes(
                                LPBYTE        pShe,                // Указатель на ресурсы стиля.
                                DWORD        dwSize,                // Размер ресурсов.
                                LPCTSTR strPassword,        // Пароль к файлу стиля.
                                int nHue,                // Оттенок. Диапазон значений от -180 до +180, по умолчанию 0.
                                int nSat,                // Насыщенность. Диапазон значений от -100 до +100, по умолчанию 0.
                                int nBri                // Яркость. Диапазон значений от -100 до +100, по умолчанию 0.
                                );
/*************************************************************/

/****************** Функция SkinH_AttachResEx ****************/
// Загрузка указанного имени ресурса стиля с заданными параметрами насыщенности, оттенка и яркости.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_AttachResEx(
                                LPCTSTR lpName,                // Имя ресурса.
                                LPCTSTR lpType,                // Тип ресурса.
                                LPCTSTR strPassword,        // Пароль к файлу стиля.
                                int nHue,                // Оттенок. Диапазон значений от -180 до +180, по умолчанию 0.
                                int nSat,                // Насыщенность. Диапазон значений от -100 до +100, по умолчанию 0.
                                int nBri                // Яркость. Диапазон значений от -100 до +100, по умолчанию 0.
                                );
/*************************************************************/

/****************** Функция SkinH_Detach *********************/
// Выгрузка стиля.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_Detach();
/*************************************************************/

/****************** Функция SkinH_DetachEx *******************/
// Выгрузка стиля для указанного дескриптора окна.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_DetachEx(
                                HWND hWnd                // Дескриптор (handle) окна.
                                );
/*************************************************************/

/****************** Функция SkinH_SetWindowAlpha *************/
// Установка уровня прозрачности для указанного дескриптора окна.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_SetWindowAlpha(
                                HWND hWnd,                // Дескриптор (handle) окна.
                                int nAlpha                // Прозрачность. Диапазон значений от 0 до 255.
                                );
/*************************************************************/

/****************** Функция SkinH_AdjustHSV ******************/
// Настройка оттенка, насыщенности и яркости стиля.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_AdjustHSV(
                                int nHue,                // Оттенок. Диапазон значений от -180 до +180, по умолчанию 0.
                                int nSat,                // Насыщенность. Диапазон значений от -100 до +100, по умолчанию 0.
                                int nBri                // Яркость. Диапазон значений от -100 до +100, по умолчанию 0.
                                );
/*************************************************************/

/****************** Функция SkinH_GetColor *******************/
// Получение значения цвета в точке с координатами nX, nY.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_GetColor(
                                HWND hWnd,                // Дескриптор (handle) окна или элемента управления.
                                int nX,                        // Значение координаты Х.
                                int nY                        // Значение координаты Y.
                                );
/*************************************************************/

/****************** Функция SkinH_Map ************************/
// Установка стиля для определенного типа элемента управления.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_Map(
                                HWND hWnd,                // Дескриптор (handle) окна или элемента управления.
                                int nType                // Тип элемента управления.
                                );
        // Идентификаторы элементов управления
        #define TYPE_UNKNOWN                                0
        #define TYPE_ANIMATE                                1001
        #define TYPE_CHECKBOX                                1002
        #define TYPE_COMBOBOX                                1003
        #define TYPE_COMBOLBOX                                1004
        #define TYPE_CONTROLBAR                                1005
        #define TYPE_DATETIME                                1006
        #define TYPE_EDITBOX                                1007
        #define TYPE_GROUPBOX                                1008
        #define TYPE_HEADERCTRL                                1009
        #define TYPE_HOTKEY                                1010
        #define TYPE_IPADDRESS                                1011
        #define TYPE_LABEL                                1012
        #define TYPE_LISTBOX                                1013
        #define TYPE_LISTVIEW                                1014
        #define TYPE_MDICLIENT                                1015
        #define TYPE_MENU                                1016
        #define TYPE_MONTHCAL                                1017
        #define TYPE_PICTURE                                1018
        #define TYPE_PROGRESS                                1019
        #define TYPE_PUSHBUTTON                                1020
        #define TYPE_RADIOBUTTON                        1021
        #define TYPE_REBAR                                1022
        #define TYPE_RICHEDIT                                1023
        #define TYPE_SCROLLBAR                                1024
        #define TYPE_SCROLLCTRL                                1025
        #define TYPE_SPINCTRL                                1026
        #define TYPE_STATUSBAR                                1027
        #define TYPE_TABCTRL                                1028
        #define TYPE_TOOLBAR                                1029
        #define TYPE_TOOLBARWND                                1030
        #define TYPE_TRACKBAR                                1031
        #define TYPE_TREEVIEW                                1032
        #define TYPE_WINDOW                                1034
        #define TYPE_COMCTRL                                1036
        #define TYPE_PAINTCTRL                                1037
/*************************************************************/

/****************** Функция SkinH_SetAero ********************/
// Включение/Отключение эффекта Aero.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_SetAero(
                                int bAero                // Включить Aero - 1. Отключить Aero - 0.
                                );
/*************************************************************/

/****************** Функция SkinH_AdjustAero *****************/
// Установка параметров Aero.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_AdjustAero(
                                int nAlpha,                // Прозрачность. Диапазон значений от 0 до 255 (по умолчанию 0).
                                int nShwDark,                // Яркость тени. Диапазон значений от 0 до 255 (по умолчанию 0).
                                int nShwSharp,                // Четкость тени. Диапазон значений от 0 до 255 (по умолчанию 0).
                                int nShwSize,                // Размер тени. Диапазон значений от 2 до 19 (по умолчанию 2).
                                int nX,                        // Смещение по горизонтали (X), 0-25 (по умолчанию 0).
                                int nY,                        // Смещение по вертикали (Y), 0-25 (по умолчанию 0).
                                int nRed,                // Красный компонент цвета. Диапазон значений от 0 до 255 (по умолчанию -1).
                                int nGreen,                // Зеленый компонент цвета. Диапазон значений от 0 до 255 (по умолчанию -1).
                                int nBlue                // Синий компонент цвета. Диапазон значений от 0 до 255 (по умолчанию -1).
                                );
/*************************************************************/

/****************** Функция SkinH_SetWindowMovable ***********/
// Установка для формы свойства Moveable.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_SetWindowMovable(
                                HWND hWnd,                // Дескриптор (handle) окна.
                                BOOL bMovable                // 0 - неперемещаемая, 1 - перемещаемая.
                                );
/*************************************************************/

/****************** Функция SkinH_SetBackColor ***************/
// Установка фонового цвета для заданного элемента управления
// (только для элементов управления CheckBox, Edit, GroupBox).
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_SetBackColor(
                                HWND hWnd,                // Дескриптор (handle) элемента управления.
                                int nRed,                // Значение красного компонента цвета.
                                int nGreen,                // Значение зеленого компонента цвета.
                                int nBlue                // Значение синего компонента цвета.
                                );
/*************************************************************/

/****************** Функция SkinH_SetForeColor ***************/
// Установка переднего цвета для заданного элемента управления
// (только для элементов управления CheckBox, Edit, GroupBox).
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_SetForeColor(
                                HWND hWnd,                // Дескриптор (handle) элемента управления.
                                int nRed,                // Значение красного компонента цвета.
                                int nGreen,                // Значение зеленого компонента цвета.
                                int nBlue                // Значение синего компонента цвета.
                                );
/*************************************************************/

/****************** Функция SkinH_LockUpdate *****************/
// Обновление или блокировка эффекта стиля для указанного дескриптора
// окна или элемента управления, в случае многократной смены стиля.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_LockUpdate(
                                HWND hWnd,                // Дескриптор (handle) окна или элемента управления.
                                int bUpdate                // Блокировать эффект - 1, обновить эффект - 0.
                                );
/*************************************************************/

/****************** Функция SkinH_SetMenuAlpha ***************/
// Установка прозрачности меню.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_SetMenuAlpha(
                                int nAlpha                // Прозрачность. Диапазон значений от 0 до 255.
                                );
/*************************************************************/

/****************** Функция SkinH_NineBlt ********************/
// Отрисовка контекста элемента.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_NineBlt(
                                HDC hDtDC,                // Контекст элемента.
                                int left,                // Координата X левого верхнего угла элемента.
                                int top,                // Координата Y левого верхнего угла элемента.
                                int right,                // Координата X правого нижнего угла элемента.
                                int bottom,                // Координата Y правого нижнего угла элемента.
                                int nMRect                // Идентификатор (ID) элемента.
                                );
/*************************************************************/

/****************** Функция SkinH_SetTitleMenuBar ************/
// Установка заголовка меню.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_SetTitleMenuBar(
                                HWND hWnd,                // Дескриптор (handle) окна.
                                BOOL bEnable,                // 1 - установить параметры меню. 0 - отменить установку.
                                int nTMenuY,                // Высота панели меню.
                                int nTopOffs,                // Смещение сверху.
                                int nRightOffs                // Смещение вправо.
                                );
/*************************************************************/
       
/****************** Функция SkinH_SetFont ********************/
// Установка шрифта для заданного элемента управления.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_SetFont(
                                HWND hWnd,                // Дескриптор (handle) элемента управления.
                                HFONT hFont                // Дескриптор шрифта.
                                );
/*************************************************************/
               
/****************** Функция SkinH_SetFontEx ******************/
// Установка свойств шрифта для заданного элемента управления.
// В случае успешного выполнения операции возвращает код 0.

        DECLSKINHAPI SkinH_SetFontEx(
                                HWND hWnd,                // Дескриптор (handle) элемента управления.
                                LPCTSTR szFace,                // Имя шрифта.
                                int nHeight,                // Высота шрифта.
                                int nWidth,                // Ширина шрифта.
                                int nWeight,                // Плотность шрифта.
                                int nItalic,                // Стиль курсив.
                                int nUnderline,                // Стиль подчеркнутый.
                                int nStrikeOut                // Стиль зачеркнутый.
                                );
/*************************************************************/

/****************** Функция SkinH_VerifySign *****************/
// Проверка цифровой подписи.
// Подпись есть и она действительна - возвращает код 1.
// Подписи нет или она недействительна - возвращает код 0.

        DECLSKINHAPI SkinH_VerifySign();
/*************************************************************/

}
#endif

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

Код:

  # Настройка оттенка, насыщенности и яркости стиля.
    ; 80 - значение оттенка
    ; 75 - значение насыщенности
    ;  0 - значение яркости 
  System::Call SkinH::SkinH_AdjustHSV(i80,i75,i0)

Необходимые параметры можно подобрать при помощи обозревателя стилей SkinViewer:



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

Kopejkin 25-02-2014 03:45 2315166

По-моему, чернее не бывает...
Красил в первую очередь, т.к. "явно" указывало - Client.



P.S. А этот просмотрщик скинов как отдельное приложение доступен? С наскоку не нашел. Пусть было бы в хозяйстве.

Код:

/**********Функция SkinH_Attach *********************/
// Загрузка файла стиля skinh.she. Для успешной загрузки стиля,
// файл стиля *.she должен быть в одном каталоге с файлом SkinH.dll.
// В случае успешного выполнения операции возвращает код 0.

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

Flix 25-02-2014 19:49 2315612

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

Вот все в куче: СКАЧАТЬ

В архиве:
- SHEditor - редактор стилей (русская версия от Leserg);
- SkinViewer - обозреватель стилей (при запуске обращается к папке Skins, если у вас появится новый стиль, просто положите его в эту папку и перезапустите программу - стиль появится в списке);
- Папка Skins - 116 стилей (внимание, многие стили необходимо исправлять (корректировать координаты позиции и прочее), т.к. большинство из них были сделаны в старой версии редактора);
- Папка DLL - библиотека SkinH.dll, соответственно ANSI и Unicode версии. Её можно применять в инсталляторах NSIS/Inno Setup (ANSI/Unicode).

При всем множестве возможных вариантов реализации скинизации инсталляторов NSIS/Inno Setup, я остановился именно на SkinSharp. Маленькая, да удаленькая. :)

Kopejkin 26-02-2014 02:34 2315778

Спасибо, сейчас и проверю.

Kopejkin 26-02-2014 11:41 2315923

Цитата:

Цитата Flix
...нужно использовать функцию SkinH_AttachEx

»
У себя никакой разницы не заметил. Все равно, для нормальной работы требуется skinh.she.

Цитата:

Цитата Flix
...библиотека SkinH.dll [post=2315612]»[/pos]

Страниц 50 назад MKN уже давал архив с этим "гардеробом".

SkinH.dll у MKN
версия: 1.0.6.6.
дата изменения: 15/08/2010
размер: 89,5 кб

SkinH.dl у Flix
версия: 1.0.6.6.
дата изменения: 11/09/2013
размер: 84,5 Кб

Разницы в работе не заметил.

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







Можно ли отключить для этих элементов шрифтовые эффекты-дефекты?

Со скинами VCL Style такой дефект присутствует в поле описания компонентов и то только при первом наведении мыши на эту область. Если щелкнуть по компоненту и снова навести указатель в поле описания, "эффект" уже не проявляется.
На бренде его и не было.


Vincent7 26-02-2014 15:33 2316046

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

Flix 26-02-2014 16:30 2316090

Цитата:

Цитата Kopejkin
Страниц 50 назад MKN уже давал архив с этим "гардеробом" »

Да что вы прицепились к версиям DLL. Я к примеру искал юникодную версию данной библиотеки, т.к. использую юникодные версии NSIS/Inno Setup. Нашел у китайцев и выложил сюда, сам я ничего не выдумал. Товарищ MKN нашел одну, я нашел другую. По функционалу они обе одинаковы, разные размеры файлов говорят о том, что наверное ломались разными людьми, но что вам использовать решайте сами.

Цитата:

Цитата Kopejkin
Можно ли отключить для этих элементов шрифтовые эффекты-дефекты? »

Мое мнение: Эти все так называемые "дефекты" являются результатом настроек персонализации Рабочего стола Windows (выбранная тема оформления, параметры ClearType и прочие настройки персонализации). Например, отключите у себя опцию ClearType (сглаживание текста) и указанного вами бага не будет.


Поэтому с такими "дефектами" приходится мириться или применять стили, где они не так явно проявляются. Возможно все же есть какое-то другое решение, но я его не знаю.

Цитата:

Цитата Kopejkin
Все равно, для нормальной работы требуется skinh.she. »

То есть вы указали путь к другому файла стиля и он не загрузился? А как же тогда работает обозреватель стилей? Там же выбирается конкретный файл (с другим именем) и он успешно загружается. Может вы допустили ошибку в параметрах функции SkinH_AttachEx?

K.A.V. 26-02-2014 17:01 2316118

Цитата:

Цитата Kopejkin
Во всем этом "мёде" есть ложечка дегтя - на всех "темных" темах некрасиво отображается шрифт с "тенью" или "выдавленный" (бренд, описание компонентов).
Это касается не только шкурок SkinSharp. Такой же эффект был и со шкурками ISSkin. »

Цитата:

Цитата Flix
Мое мнение: Эти все так называемые "дефекты" являются результатом настроек персонализации Рабочего стола Windows »

Данным элементам присвоен стиль "WS_DISABLED", возможно из-за этого получаются глюки при отображении текста данных элементов, попробуйте добавить функцию удаления стиля и назначения своего цвета тексту (серый и красный на выбор в моём примере)
*В примере идёт удаление стиля у надписи "Nullsoft Scriptable Install System"

Код:

!include "mui.nsh"
!include "nsDialogs.nsh"

!define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call"
!macro _NSD_RemoveStyle_Call CONTROL EXSTYLE
  Push `${CONTROL}`
  Push `${EXSTYLE}`
  System::Store SR1R0
  IntOp $R1 $R1 ~
  System::Call `user32::GetWindowLong(iR0,i${GWL_STYLE})i.R2`
  IntOp $R2 $R1 & $R2
  System::Call `user32::SetWindowLong(iR0,i${GWL_STYLE},iR2)`
  System::Store L
!macroend



!insertmacro MUI_PAGE_WELCOME

!define MUI_PAGE_CUSTOMFUNCTION_PRE RemoveDISABLEDStyle

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES

Функция
Код:

Function RemoveDISABLEDStyle
  GetDlgItem $0 $HWNDPARENT 1028
  ${NSD_RemoveStyle} $0 0x08000000L
;  SetCtlColors $0 "0xFF0000" transparent ; Красныйй цвет текста
  SetCtlColors $0 "0x808080" transparent ; Серый цвет текста
FunctionEnd


Flix 26-02-2014 18:34 2316173

Цитата:

Цитата Flix
Чтобы не переименовывать файл стиля, нужно использовать функцию SkinH_AttachEx (данное утверждение нуждается в проверке). »

Только что проверил - работает. Вот как выглядит код:
Код:

Function onGUIInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "${NSISDIR}\Plugins\x86-unicode\SkinH.dll"
  File "${NSISDIR}\Contrib\Skins\0011.she"

  ; При помощи функции SkinH_AttachEx загружаем файл стиля с именем 0011.she
  System::Call SkinH::SkinH_AttachEx(t'$PLUGINSDIR\0011.she')
 
#################### Patches for SkinSharp ####################
  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

Пути к файлам у вас конечно же могут быть другие. Я использую Unicode, поэтому и DLL юникодный. Таким образом можно не переименовывать файлы стилей.

Цитата:

Цитата K.A.V.
Данным элементам присвоен стиль "WS_DISABLED", возможно из-за этого получаются глюки при отображении текста данных элементов »

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

Kopejkin 26-02-2014 23:34 2316354

K.A.V., Приятно послушать разговор знающих людей. Особенно когда тема беседы понятна.
Т.к. это не про меня, буду вставлять умные слова в свои вопросы "хотелки".
Какой дескриптор у текста "Position your mouse over a component to see its description" и ... В общем, как у этого текста удалить стиль? :)
Домашняя работа.
При использовании скинов SkinSharp ваш способ не окрашивает текст в красный (серый), а дает возможность отображаться тексту "Nullsoft Install System"цветом других текстов скина. В окнах обычного инсталлятора (без скинов) текст окрашивается.
Для правильной работы команду "!define MUI_PAGE_CUSTOMFUNCTION_PRE RemoveDISABLEDStyle" понадобилось установить перед страницей приветствия.

Нашел я, все-таки, где цвет фона окна меняется в VCL Styles for NSIS. Странно, что долго искал :(
читать дальше »




Здесь можно поменять цвет текста.




А здесь цвет фона и других элементов окон.

K.A.V. 27-02-2014 01:17 2316421

Цитата:

Цитата Kopejkin
Какой дескриптор у текста "Position your mouse over a component to see its description" »

Переходим в папку \NSIS\Contrib\UIs и открываем modern.exe программой для просмотра ресурсов (ResHacker, Restorator и т.д.)
Ищем диалог, в котором располагается искомый элемент, в нашем случае это диалог 104 - выбор компонентов
Ищем нужный нам элемент и смотрим его ID - 1043

Теперь, чтобы выполнить взаимодействие с данным элементом при работе графического интерфейса инсталлятора (убрать/присвоить стиль, поменять текст/цвет и т.д.) - нам нужно узнать его дескриптор, дескриптор своего рода уникальный идентификатор каждого элемента в графическом интерфейсе любой программы, надеюсь, понятно объяснил, если что - гугл :)

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

  GetDlgItem $0 $HWNDPARENT 1043
$0 - переменная, куда будет поммещен дескриптор элемента с ID 1043
$HWNDPARENT - дескриптор окна инсталлятора
1043 - соответственно, ID элемента, дескрпитор которого нам нужно узнать
Это пример получения дескриптора элемента по идентификатору в ресурсах диалога

Чтобы удалить стиль конкретно обсуждаемый "WS_DISABLED", нужно выполнить команду:
Код:

${NSD_RemoveStyle} $0 0x08000000L
где $0 - дескриптор элемента, у которого удаляем стиль
0x08000000L - даёт понять команде, какой стиль удалять, в нашем случае это "WS_DISABLED"

Цитата:

Цитата Kopejkin
При использовании скинов SkinSharp ваш способ не окрашивает текст в красный (серый), а дает возможность отображаться тексту "Nullsoft Install System"цветом других текстов скина. В окнах обычного инсталлятора (без скинов) текст окрашивается. »

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

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

реализовать можно так:
1. Если нужно просто убрать стиль на элемент описания, то воспользуйтесь примером из пункта 3, удалив те участки кода в моих примерах, которые выделены жирным шрифтом

Сдеюущие примеры для того, чтобы убрать стиль и назначить цвет текста и фона элементу описания секций
2. Не красиво, нужно редактировать главный файл настроек интерфейса MUI, но удобно назначать описания секциям, не внося никаких изменений в главный файл скрипта вашего инсталлятора
Можно, например, просто скопировать указанный ниже файл и в ту же папку и изменить его имя, и за место
Код:

!include "mui.nsh"
прописать
Код:

!include "C:\Program Files\NSIS\Contrib\Modern UI\My_System.nsh"
Открываем файл: \NSIS\Contrib\Modern UI\System.nsh
Ищем
читать дальше »
Код:

!macro MUI_DESCRIPTION_BEGIN

  FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
  GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043

  StrCmp $0 -1 0 mui.description_begin_done
    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:"
    EnableWindow $MUI_TEMP1 0
    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$MUI_TEXT"
    Goto mui.description_done
  mui.description_begin_done:

!macroend


Закомменитруем строку EnableWindow $MUI_TEMP1 0, которая делает элемент с текстом описания неактивным
читать дальше »
Код:

!macro MUI_DESCRIPTION_BEGIN

  FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
  GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043

  StrCmp $0 -1 0 mui.description_begin_done
    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:"
;    EnableWindow $MUI_TEMP1 0
    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$MUI_TEXT"
    Goto mui.description_done
  mui.description_begin_done:

!macroend



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

  Function "${SHOW}"

    !insertmacro MUI_INNERDIALOG_TEXT 1042 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}"

    FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
    GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043
    EnableWindow $MUI_TEMP1 0

    !insertmacro MUI_INNERDIALOG_TEXT 1043 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
    StrCpy $MUI_TEXT "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW

  FunctionEnd



Меняем на:
читать дальше »
Код:

  Function "${SHOW}"

    !insertmacro MUI_INNERDIALOG_TEXT 1042 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}"

    FindWindow $MUI_TEMP2 "#32770" "" $HWNDPARENT
    GetDlgItem $MUI_TEMP1 $MUI_TEMP2 1043
    SetCtlColors $MUI_TEMP1 "0xFF0000"  "0xFFFFFF" ; Элемент текста описания, Красныйй цвет текста на белом фоне

    GetDlgItem $MUI_TEMP1 $MUI_TEMP2 1042
    SetCtlColors $MUI_TEMP1 ""  "0xFFFFFF" ; Ставим белый фон на слово "Описание", элемент рамки, цвет текста не меняется

    !insertmacro MUI_INNERDIALOG_TEXT 1043 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
    StrCpy $MUI_TEXT "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW

  FunctionEnd



3. Второй способ. Изменения вносятся только в ваш скрипт инсталлятора. Из плюсов - не нужно редактировать главный файл настроек MUI интерфейса. Минусы - нужно будет писать собственную функцию обработки показа описаний и нужно назначать описания секциям по порядковым номерам начиная с 0, т.е. в том порядке, в каком они прописаны в вашем скрипте.
Для начала
читать дальше »
Код:

!insertmacro MUI_PAGE_WELCOME

!define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES



Функция
читать дальше »
Код:

Function RemoveDISABLEDStyle_Description
FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $1 $0 1043
  ${NSD_RemoveStyle} $1 0x08000000L
  SetCtlColors $1 "0xFF0000"  "0xFFFFFF" ; Красныйй цвет текста на белом фоне
  GetDlgItem $1 $0 1042
  SetCtlColors $1 ""  "0xFFFFFF" ; Ставим белый фон на слово "Описание", элемент рамки, цвет текста не меняется

FunctionEnd



Пример двух секций с присвоением им описаний + функция для обработки показа описаний
читать дальше »
Код:

Section "Первая секция"
SectionEnd

Section "Вторая секция"
SectionEnd


Function .onMouseOverSection
    FindWindow $R0 "#32770" "" $HWNDPARENT
    GetDlgItem $R0 $R0 1043

    StrCmp $0 -1 "" +2
    SendMessage $R0 ${WM_SETTEXT} 0 "STR:$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)" ; текст "Наведите курсор мыши на название компонента, чтобы прочесть его описание." в зависимости от языка графического интерфейса

    StrCmp $0 0 "" +2
      SendMessage $R0 ${WM_SETTEXT} 0 "STR:Описание первой секции"

    StrCmp $0 1 "" +2
      SendMessage $R0 ${WM_SETTEXT} 0 "STR:Описание второй секции"
FunctionEnd



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

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END



вроде ничего не забыл

Kopejkin 27-02-2014 13:56 2316672

Цитата:

Цитата K.A.V
0x08000000L - даёт понять команде, какой стиль удалять, в нашем случае это "WS_DISABLED.»

Это, по образу и подобию, я скопипастил в первую очередь :)
читать дальше »

PHP код:

Function RemoveDISABLEDStyle
  
  GetDlgItem 
$0 $HWNDPARENT 1028
  
${NSD_RemoveStyle} $0 0x08000000L
  SetCtlColors 
$"0xFF0000" transparent Красный цвет текста

  GetDlgItem 
$1 $HWNDPARENT 1043
  
${NSD_RemoveStyle} $1 0x08000000L
  SetCtlColors 
$"0xFF0000" transparent Красный цвет текста

FunctionEnd 

Только для текста "Position your mouse over a component to see its description" этот вариант не прошел.
У элемента 1043 не оказалось параметра "WS_DISABLED". Там стоит "WS_VISIBLE". Поэтому и спросил.



Способ номер 2 не работает - ничего нигде не перекрашивается и стиль не удаляется.

Вот код, на котором испытывался способ 2.
(Скрипт с ошибками, поэтому и неправильно работает)

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

/*
ВНИМАНИЕ! СКРИПТ С ОШИБКАМИ.

Hide Style.nsi
Скрываем стили текстов и красим их
Совет от K.A.V.
*/

  
!include "MUI2.nsh"
  
;!include "nsDialogs.nsh" нужно-не нужноЧто с нимчто без него.
  !
addplugindir "..\..\Win32\Release" 

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

;
General
  Name 
"Hide Style"
  
OutFile "Hide_Style.exe"
;Default installation folder
  InstallDir 
"$TEMP"
;Request application privileges for Windows Vista
  RequestExecutionLevel user

;--------------------------------
  ; 
макрос удаления стиля текста (K.A.V.)
  !
define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call"
   
!macro _NSD_RemoveStyle_Call CONTROL EXSTYLE
        Push 
`${CONTROL}`
        
Push `${EXSTYLE}`
        
System::Store SR1R0
        IntOp $R1 $R1 
~
        
System::Call `user32::GetWindowLong(iR0,i${GWL_STYLE})i.R2`
        
IntOp $R2 $R1 $R2
        System
::Call `user32::SetWindowLong(iR0,i${GWL_STYLE},iR2)`
        
System::Store L
   
!macroend
   
  
!define MUI_ABORTWARNING

;--------------------------------
  !
define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description Команда отключения стиля текста
  
;!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit Команда использования скина
  
  
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
  
!insertmacro MUI_PAGE_COMPONENTS
  
!insertmacro MUI_PAGE_DIRECTORY
  
!insertmacro MUI_PAGE_INSTFILES
  
  
!insertmacro MUI_UNPAGE_CONFIRM
  
!insertmacro MUI_UNPAGE_INSTFILES
  
;--------------------------------
;
Languages
 
  
!insertmacro MUI_LANGUAGE "English"

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

Section "Первая секция"
SectionEnd

Section 
"Вторая секция"
SectionEnd


Function .onMouseOverSection
    FindWindow $R0 
"#32770" "" $HWNDPARENT
    GetDlgItem $R0 $R0 1043

    StrCmp 
$-"" +2
    SendMessage $R0 
${WM_SETTEXT"STR:$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)" текст "Наведите курсор мыши на название компонента, чтобы прочесть его описание." в зависимости от языка графического интерфейса

    StrCmp 
$0 0 "" +2
      SendMessage $R0 
${WM_SETTEXT"STR:Описание первой секции"

    
StrCmp $0 1 "" +2
      SendMessage $R0 
${WM_SETTEXT"STR:Описание второй секции"
FunctionEnd


;РАБОТАЮЩАЯ функция (для текста "Nullsoft Install System")

Function 
RemoveDISABLEDStyle_Description
  GetDlgItem 
$0 $HWNDPARENT 1028
  
${NSD_RemoveStyle} $0 0x08000000L
  SetCtlColors 
$"0xFF0000" transparent Красный цвет текста
  
;SetCtlColors $"0x808080" transparent Серый цвет текста
FunctionEnd

/*
; НЕ РАБОТАЮЩАЯ функция (для текста описания "Position your mouse over a component to see its description"

Function RemoveDISABLEDStyle_Description
FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $1 $0 1043
  ${NSD_RemoveStyle} $1 0x08000000L
  SetCtlColors $1 "0xFF0000"  "0xFFFFFF" ; Красный цвет текста на белом фоне
  GetDlgItem $1 $0 1042
  SetCtlColors $1 ""  "0xFFFFFF" ; Ставим белый фон на слово "Описание", элемент рамки, цвет текста не меняется
FunctionEnd

; Использование скинов SkinH (совет от Flix)
Function onGUIInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "D:\NSIS\SkinSharp\DLL\ANSI\SkinH.dll"
  File "D:\NSIS\SkinSharp\Skins\0012.she"
 ; При помощи функции SkinH_AttachEx загружаем файл стиля с именем 0011.she

  System::Call SkinH::SkinH_AttachEx(t'$PLUGINSDIR\0012.she')
  System::Call SkinH::SkinH_AdjustHSV(i-20,i,i) ; здесь можно красить скин

  ; Patches for SkinSharp 
  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
*/ 



Снимки с использованием скина SkinH и без него:



Функция работает



Функция не работает

Может я накосячил чего?
Сам добавил позднее:
Накосячил 100 %.


Со способом номер 1 еще не разбирался.

Flix 27-02-2014 14:27 2316693

Если необходимо просто избавиться от дефекта, появляющегося на элементах с текстом фирмы и описания компонентов при использовании некоторых стилей SkinSharp, то вариант, предложенный K.A.V. можно намного упростить. Как мы уже выяснили ранее, данный дефект проявляется на элементах, у которых имеется свойство WS_DISABLED, т.е. говоря простым язык - элемент отключен.



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

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

Код:

  ; Получаем дескриптор элемента управления с надписью бренда
  GetDlgItem $0 $HWNDPARENT 1028
  ; Включаем элемент управления (1- включить, 0- отключить)
  EnableWindow $0 1

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

Код:

  ; Функция включения элемента с описанием компонентов
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
  ; Функция включения элемента с описанием компонентов при наведении курсора мышки
  !define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyleOnSel

  !insertmacro MUI_PAGE_COMPONENTS

А теперь код самих функций:

Код:

# Функция включения стиля для элемента с описанием компонентов
Function ENABLEDStyle
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления
  EnableWindow $1 1
FunctionEnd

# Функция включения стиля для элемента с описанием компонентов
# при наведении курсора мышки на компоненты установки
Function ENABLEDStyleOnSel
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления
  EnableWindow $1 1
FunctionEnd

При этом строки с описанием компонентов можно оставить без изменений:

Код:

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END

Вот и все, при работе инсталлятора, например с темой 0011.she, указанного выше дефекта мы больше наблюдать не будем:



Полный код сценария (используется NSIS v3.0a2):
Код:

# Поддержка Unicode
Unicode true

!include MUI.nsh
!include nsDialogs.nsh

!define PRODUCT_NAME "My application"
SetCompressor lzma
BrandingText "Nullsoft Scriptable Install System"

 
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
 
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "License.txt"

; Функция включения элемента с описанием компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
; Функция включения элемента с описанием компонентов при наведении курсора мышки
!define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyleOnSel

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
 
!insertmacro MUI_LANGUAGE "Russian"
 
Name "SkinH"
OutFile "setup_SkinH.exe"
InstallDir "$PROGRAMFILES\My application"
 
Section "Секция 1" SEC1
SectionEnd

Section "Секция 2" SEC2
SectionEnd

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END
 
Function onGUIInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "${NSISDIR}\Plugins\x86-unicode\SkinH.dll"
  File "${NSISDIR}\Contrib\Skins\0011.she"
 
  ; Получаем дескриптор элемента управления с надписью бренда
  GetDlgItem $0 $HWNDPARENT 1028
  ; Включаем элемент управления (1- включить, 0- отключить)
  EnableWindow $0 1

  ; При помощи функции SkinH_AttachEx загружаем файл стиля с именем 0011.she
  System::Call SkinH::SkinH_AttachEx(t'$PLUGINSDIR\0011.she')
 
#################### Patches for SkinSharp ####################
  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 ENABLEDStyle
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления
  EnableWindow $1 1
FunctionEnd

# Функция включения стиля для элемента с описанием компонентов
# при наведении курсора мышки на компоненты установки
Function ENABLEDStyleOnSel
  ; Выполняем поиск окна инсталлятора
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления
  EnableWindow $1 1
FunctionEnd

Function .onGUIEnd
  ; Удаление временной папки
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
  System::Call Kernel32::FreeLibrary(is)
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd


Kopejkin 27-02-2014 14:53 2316724

Flix, подскажите, пожалуйста, правильный синтаксис написания параметров для функции SkinH_AttachExt. Я так понимаю, что тогда не нужно будет прописывать отдельную функцию настройки оттенка, насыщенности и яркости SkinH_AdjustHSV. Желательно, пример в вашем же скрипте.

K.A.V. 27-02-2014 15:18 2316753

Цитата:

Цитата Kopejkin
Способ номер 3 не работает - ничего нигде не перекрашивается и стиль не удаляется. »

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

Нужно
Код:

!include "nsDialogs.nsh"
Неправильно
Код:

  !define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description ; Команда отключения стиля текста
  !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"

  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES

Правильно
Код:


  !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description ; Команда отключения стиля текста
  !insertmacro MUI_PAGE_COMPONENTS

  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES

Цитата:

Цитата Kopejkin
Только для текста "Position your mouse over a component to see its description" этот вариант не прошел.
У элемента 1043 не оказалось параметра "WS_DISABLED". Там стоит "WS_VISIBLE". Поэтому и спросил. »

Всё дело в том, что данный элемент становится неактивным в момент наведения мышки на секции при работе инсталлятора

Flix 27-02-2014 16:32 2316805

Цитата:

Цитата Kopejkin
подскажите, пожалуйста, правильный синтаксис написания параметров для функции SkinH_AttachExt »

Да все очень просто. Меняете команду:

Код:

  ; При помощи функции SkinH_AttachEx загружаем файл стиля с именем 0011.she
  System::Call SkinH::SkinH_AttachEx(t'$PLUGINSDIR\0011.she')

На команду:

Код:

  ; При помощи функции SkinH_AttachExt загружаем файл стиля с именем 0012.she
  ; и указываем для него желаемые параметры (можно подобрать с помощью SkinViewer):
  ;  - Оттенок = 155
  ;  - Насыщенность = -32
  ;  - Яркость = -12
  ; Примечание: т.к. пароль для выбранного стиля не задан, то в параметрах
  ;            функции оставляем пустое значение (,,), т.е. для этого
  ;            параметра (strPassword) функция получит значение null.
  System::Call SkinH::SkinH_AttachExt(t'$PLUGINSDIR\0012.she',,i155,i-32,i-12)


Kopejkin 28-02-2014 11:26 2317164

Цитата:

Цитата K.A.V.
Думаете я просто так... »

И в мыслях не было морочить вам голову!

Ниже приведены сценарии, которые можно сразу скомпилировать и посмотреть результат. Так сказать, работа над ошибками :)
В первом я объединил два совета K.A.V. для branding-текста и текста описания компонентов.
Т.е. цвет branding-текста, текста подсказки и текстов описания компонентов становится красным, стили текстов отключаются.

Скрипт от K.A.V.
читать дальше »

Код:

;Variant by K.A.V..nsh

!include "mui.nsh"
!include "nsDialogs.nsh"

!define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call"
!macro _NSD_RemoveStyle_Call CONTROL EXSTYLE
  Push `${CONTROL}`
  Push `${EXSTYLE}`
  System::Store SR1R0
  IntOp $R1 $R1 ~
  System::Call `user32::GetWindowLong(iR0,i${GWL_STYLE})i.R2`
  IntOp $R2 $R1 & $R2
  System::Call `user32::SetWindowLong(iR0,i${GWL_STYLE},iR2)`
  System::Store L
!macroend

!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_PRE RemoveDISABLEDStyle    ; команда отключения стиля для BRANDING.
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description ; отключение стиля описания
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

BrandingText "Nullsoft Scriptable Install System"
Name "'Variant by K.A.V.'"
OutFile "kav.exe"
InstallDir "$TEMP"

Section "Первая секция"
SectionEnd

Section "Вторая секция"
SectionEnd

Function RemoveDISABLEDStyle
  GetDlgItem $0 $HWNDPARENT 1028
  ${NSD_RemoveStyle} $0 0x08000000L
  SetCtlColors $0 "0xFF0000" transparent ; Красный цвет текста
FunctionEnd

Function .onMouseOverSection
    FindWindow $R0 "#32770" "" $HWNDPARENT
    GetDlgItem $R0 $R0 1043

    StrCmp $0 -1 "" +2
    SendMessage $R0 ${WM_SETTEXT} 0 "STR:$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)"  ; текст
                    ; "Наведите курсор мыши на название компонента, чтобы прочесть его описание."
                    ;  в зависимости от языка графического интерфейса
    StrCmp $0 0 "" +2
    SendMessage $R0 ${WM_SETTEXT} 0 "STR:Описание первой секции"

    StrCmp $0 1 "" +2
    SendMessage $R0 ${WM_SETTEXT} 0 "STR:Описание второй секции"
FunctionEnd

Function RemoveDISABLEDStyle_Description
    FindWindow $0 "#32770" "" $HWNDPARENT
    GetDlgItem $1 $0 1043
    ${NSD_RemoveStyle} $1 0x08000000L
    SetCtlColors $1 "0xFF0000" "0xF0F0F0" ; Красный текст на сером фоне (цвет фона-ОБЯЗАТЕЛЬНО)
    GetDlgItem $1 $0 1042
    SetCtlColors $1 "" ""                ; Сейчас установлен прозрачный? цвет фона.
                                          ; Белый цвет "0xFFFFFF" фона на слово "Описание".
                                          ; Элемент рамки, цвет текста не меняется.
FunctionEnd



А этот вариант предложил Flix. Решает те же задачи.
читать дальше »

Код:

; Variant by Flix.nsi

!include MUI2.nsh
!include nsDialogs.nsh

!define PRODUCT_NAME "'Variant by Flix'"
SetCompressor lzma
BrandingText "Nullsoft Scriptable Install System"

!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"

; Функция включения элемента с описанием компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
; Функция включения элемента с описанием компонентов при наведении курсора мышки
!define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyleOnSel

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_LANGUAGE "Russian"

Name "${PRODUCT_NAME}"
OutFile "flix.exe"
InstallDir "$TEMP"

Section "Секция 1" SEC1
SectionEnd

Section "Секция 2" SEC2
SectionEnd

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END

Function onGUIInit
  ; Получаем дескриптор элемента управления с надписью бренда
  GetDlgItem $0 $HWNDPARENT 1028
  ; Включаем элемент управления (1- включить, 0- отключить)
  EnableWindow $0 1
  SetCtlColors $0 "0xFF0000" transparent ; Красный цвет текста
FunctionEnd

Function ENABLEDStyle
  ; Функция включения стиля для элемента с описанием компонентов.
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления
  EnableWindow $1 1
  SetCtlColors $1 "0xFF0000" "0xF0F000" ; Красный текст на желтом.
  ; Желтый выбран для наглядности. Цвет фона задавать ОБЯЗАТЕЛЬНО!
  ; Если фон прозрачный - тексты описания накладываются.
FunctionEnd

Function ENABLEDStyleOnSel
  ; Функция включения стиля для элемента с описанием компонентов
  ; при наведении курсора мышки на компоненты установки.
  ; Выполняем поиск окна инсталлятора
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления
  EnableWindow $1 1
  SetCtlColors $1 "0xFF0000" "0xF0F000" ; Красный текст на желтом фоне
FunctionEnd



Надеюсь, что ничего не переврал.

Я попытался переделать вариант Flix, использующий скины SkinSharp, в инсталлятор с функцией удаления. Чтобы деинсталлятор тоже был "одет". И стили branding-текста и описаний также отключались.
Но запутался окончательно. То uninstall function "***" not referenced, то Function named ".onGUIInit" already exists. То еще чего-нибудь.

Вот все, что у меня получилось. Прошу не бросать на пол-дороги! :)

Применение скина SkinSharp в инсталляторе и деинсталляторе.
читать дальше »

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




Код:

;Uninstall_SkinH.nsh

!include MUI2.nsh
!include nsDialogs.nsh

!define PRODUCT_NAME "'Install-Uninstall SkinH'"
SetCompressor lzma
BrandingText "Nullsoft Scriptable Install System"

!insertmacro MUI_PAGE_WELCOME

!define MUI_PAGE_CUSTOMFUNCTION_PRE RemoveDISABLEDStyle
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"

; Функция включения элемента с описанием компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
; Функция включения элемента с описанием компонентов при наведении курсора мышки
!define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyleOnSel

!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_LANGUAGE "Russian"

Name "${PRODUCT_NAME}"
OutFile "UninSkinH.exe"

; The default installation directory
InstallDir $DESKTOP\UninSkinH"

Section "Секция 1" SEC1
SectionEnd

Section "Секция 2" SEC2
SectionEnd

Section ""
  SetOutPath $INSTDIR
  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END

Section un."Uninstall Skin"
        delete "$INSTDIR\Uninstall.exe"
        SetShellVarContext all
        RMDir /r "$INSTDIR"
      SetAutoClose false
SectionEnd

Function .onInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "D:\NSIS\SkinSharp\DLL\ANSI\SkinH.dll"
  File "D:\NSIS\SkinSharp\Skins\0012.she"
  ;При помощи функции SkinH_AttachExt загружаем файл стиля с именем 0012.she
  System::Call SkinH::SkinH_AttachExt(t'$PLUGINSDIR\0012.she',,i-150,i-0,i-0)
  #################### Patches for SkinSharp ####################
  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 RemoveDISABLEDStyle
  ; Получаем дескриптор элемента управления с надписью бренда
  GetDlgItem $0 $HWNDPARENT 1028
  ; Включаем элемент управления (1- включить, 0- отключить)
  EnableWindow $0 1
FunctionEnd

Function ENABLEDStyle
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления
  EnableWindow $1 1
FunctionEnd

Function ENABLEDStyleOnSel
  ; Функция включения стиля для элемента с описанием компонентов
  ; при наведении курсора мышки на компоненты установки.
  ; Выполняем поиск окна инсталлятора
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления
  EnableWindow $1 1
FunctionEnd

Function un.onInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "D:\NSIS\SkinSharp\DLL\ANSI\SkinH.dll"
  File "D:\NSIS\SkinSharp\Skins\0012.she"
  ;При помощи функции SkinH_AttachExt загружаем файл стиля с именем 0012.she
  System::Call SkinH::SkinH_AttachExt(t'$PLUGINSDIR\0012.she',,i-30,i-0,i-0)
  #################### Patches for SkinSharp ####################
  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

Function un.onGUIEnd
  ; Удаление временной папки
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
  System::Call Kernel32::FreeLibrary(is)
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd


Flix 01-03-2014 03:26 2317583

Цитата:

Цитата Kopejkin
Я попытался переделать вариант Flix, использующий скины SkinSharp, в инсталлятор с функцией удаления. Чтобы деинсталлятор тоже был "одет". »

Не надо было ничего переделывать, а только по аналогии добавить все тоже самое для деинсталлятора. :)
читать дальше »
Код:

# Поддержка Unicode
Unicode true

!include MUI2.nsh

!define PRODUCT_NAME "'Install-Uninstall SkinH'"
SetCompressor lzma
BrandingText "Nullsoft Scriptable Install System"


##################### Диалоги ИНСТАЛЛЯЦИИ #######################
; Подключаем стиль оформления к интерфейсу
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
; Показываем диалог приветствия
!insertmacro MUI_PAGE_WELCOME
; Показываем диалог с лицензией
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
; Включаем элемент с описанием компонентов в диалоге компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
; Включаем элемент с описанием компонентов при наведении курсора мышки
!define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyle
; Показываем диалог с выбором компонентов установки
!insertmacro MUI_PAGE_COMPONENTS
; Показываем диалог с выбором пути установки
!insertmacro MUI_PAGE_DIRECTORY
; Показываем диалог установки файлов
!insertmacro MUI_PAGE_INSTFILES
; Показываем диалог завершения установки
!insertmacro MUI_PAGE_FINISH
#################################################################

################### Диалоги ДЕИНСТАЛЛЯЦИИ #######################
; Подключаем стиль оформления к интерфейсу
!define MUI_CUSTOMFUNCTION_UNGUIINIT un.onGUIIni
; Показываем диалог приветствия
!insertmacro MUI_UNPAGE_WELCOME
; Показываем диалог подтверждения
!insertmacro MUI_UNPAGE_CONFIRM
; Включаем элемент с описанием компонентов в диалоге компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.ENABLEDStyle
; Включаем элемент с описанием компонентов при наведении курсора мышки
!define MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION un.ENABLEDStyle
; Показываем диалог с выбором компонентов деинсталляции
!insertmacro MUI_UNPAGE_COMPONENTS
; Показываем диалог удаления файлов
!insertmacro MUI_UNPAGE_INSTFILES
; Показываем диалог завершения
!insertmacro MUI_UNPAGE_FINISH
#################################################################

; Язык инсталлятора - Русский
!insertmacro MUI_LANGUAGE "Russian"

; Имя инсталлятора
Name "${PRODUCT_NAME}"
; Путь и имя файла инсталлятора
OutFile "UninSkinH.exe"

; Путь установки по умолчанию
InstallDir "$PROGRAMFILES\My application"

Section "Секция 1" SEC1
; Файлы для установки
SectionEnd

Section "Секция 2" SEC2
; Файлы для установки
SectionEnd

Section "Секция 3" SEC3
  SetOutPath $INSTDIR
  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd

; Секция деинсталлятора
Section "Uninstall" SEC4
  delete "$INSTDIR\Uninstall.exe"
  SetShellVarContext all
  RMDir /r "$INSTDIR"
SectionEnd

; Описание компонентов =ИНСТАЛЛЯТОРА=
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC3} "Описание третьей секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END

; Описание компонентов =ДЕИНСТАЛЛЯТОРА=
!insertmacro MUI_UNFUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC4} "Описание секции деинсталлятора"
!insertmacro MUI_UNFUNCTION_DESCRIPTION_END

; Функция скинизации интерфейса при инициализации GUI =ИНСТАЛЛЯТОРА=
Function onGUIInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "${NSISDIR}\Plugins\x86-unicode\SkinH.dll"
  File "${NSISDIR}\Contrib\Skins\0012.she"
 
  # Убираем дефект отображения текста с надписью бренда -------
    ; Получаем дескриптор элемента управления с надписью бренда
    GetDlgItem $0 $HWNDPARENT 1028
    ; Включаем элемент управления (1- включить, 0- отключить)
    EnableWindow $0 1
  # -----------------------------------------------------------
 
  ;При помощи функции SkinH_AttachExt загружаем файл стиля с именем 0012.she
  System::Call SkinH::SkinH_AttachExt(t'$PLUGINSDIR\0012.she',,i-150,i-0,i-0)
 
  #################### Patches for SkinSharp ####################
  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

; Функция выгрузки SkinH.dll при закрытии GUI =ИНСТАЛЛЯТОРА=
Function .onGUIEnd
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
  System::Call Kernel32::FreeLibrary(is)
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

; Функция скинизации интерфейса при инициализации GUI =ДЕИНСТАЛЛЯТОРА=
Function un.onGUIIni
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "${NSISDIR}\Plugins\x86-unicode\SkinH.dll"
  File "${NSISDIR}\Contrib\Skins\0012.she"
 
  # Убираем дефект отображения текста с надписью бренда -------
    ; Получаем дескриптор элемента управления с надписью бренда
    GetDlgItem $0 $HWNDPARENT 1028
    ; Включаем элемент управления (1- включить, 0- отключить)
    EnableWindow $0 1
  # -----------------------------------------------------------
 
  ;При помощи функции SkinH_AttachExt загружаем файл стиля с именем 0012.she
  System::Call SkinH::SkinH_AttachExt(t'$PLUGINSDIR\0012.she',,i-30,i-0,i-0)
 
  #################### Patches for SkinSharp ####################
  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

; Функция выгрузки SkinH.dll при закрытии GUI =ДЕИНСТАЛЛЯТОРА=
Function un.onGUIEnd
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
  System::Call Kernel32::FreeLibrary(is)
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

; Функция, которая включает элемент с описанием компонентов.
; Используется для диалога с выбором компонентов при инсталляции.
Function ENABLEDStyle
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления
  EnableWindow $1 1
FunctionEnd

; Функция, которая включает элемент с описанием компонентов.
; Используется для диалога с выбором компонентов при деинсталляции.
Function un.ENABLEDStyle
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления
  EnableWindow $1 1
FunctionEnd


Kopejkin 01-03-2014 11:23 2317625

Теперь, когда такие чайники, как я, будут "доставать" форум подобными вопросами, можно просто указать ссылку. :)
Еще раз спасибо.

4eshireCat 01-03-2014 20:22 2317838

Ребят, пожалуйста подскажите, если кто знает - возможно ли на кастомной страничке создать кнопку заданного цвета (например красного) без использования скинов и не подгружая битмап, как в SkinnedButton? Может быть это возможно как-то реализовать через WinAPI? Сам я пока в этой теме не сильно разбираюсь и буду очень благодарен, если кто-то поможет.

wolkow70 02-03-2014 16:27 2318108

Столкнулся с такой ситуацией, что нужно запустить exe файл на стадии Function .OnInit, то есть на этой стадии файл уже должен быть в папке $PLUGINSDIR , а добиться этого никак не могу. Кто-нибудь поможет?

Begin2Fly 02-03-2014 16:36 2318111

Цитата:

Цитата wolkow70
Столкнулся с такой ситуацией, что нужно запустить exe файл на стадии Function .OnInit, то есть на этой стадии файл уже должен быть в папке $PLUGINSDIR , а добиться этого никак не могу. Кто-нибудь поможет? »

InitPluginsDir

MKN 02-03-2014 16:50 2318118

Цитата:

Цитата 4eshireCat
возможно ли на кастомной страничке создать кнопку заданного цвета (например красного) без использования скинов и не подгружая битмап, »

Не подгружая битмап - скорее всего нет.
Цитата:

Цитата 4eshireCat
Может быть это возможно как-то реализовать через WinAPI? »

Дык всё равно придётся загружать битмап с цветом или рисунком...

А почему такая боязнь загрузки битмапа ?

wolkow70 02-03-2014 17:01 2318126

Цитата:

Цитата Begin2Fly
InitPluginsDir »

Пробовал, не получается...

Function .OnInit
;
InitPluginsDir
SetOutPath $PLUGINSDIR
File "DTOOLS\SPTDinst-x86.exe"
ExecWait '"$PLUGINSDIR\SPTDinst-x86.exe" add /q'
FunctionEnd


Файла в папке нет.

Begin2Fly 02-03-2014 17:10 2318129

wolkow70, попробуйте так:

Код:

Function .OnInit
InitPluginsDir
File /oname=$PLUGINSDIR\SPTDinst-x86.exe "DTOOLS\SPTDinst-x86.exe"
ExecWait '"$PLUGINSDIR\SPTDinst-x86.exe" add /q'
FunctionEnd


wolkow70 02-03-2014 17:54 2318150

Цитата:

Цитата Begin2Fly
попробуйте так: »

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

Flix 02-03-2014 18:38 2318179

Цитата:

Цитата wolkow70
Все равно не распаковывается файл. »

Скачал с оффсайта данный драйвер (SPTD). Добавил в код команды:

Код:

Function .onInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File SPTDinst-v186-x86.exe
  ExecWait "$PLUGINSDIR\SPTDinst-v186-x86.exe add /q"
FunctionEnd

Скомпилировал, запустил. Все прекрасно распаковывается и запускается. Только вы должны учитывать то факт, что если данный драйвер на вашей системе уже установлен, то повторный запуск установки драйвера с такими параметрами не даст никакого результата. Чтобы проверить, запускается ли файл или нет, уберите ключ add /q. Например, в моем случае я уже получаю сообщение, что для завершения установки драйвера необходима перезагрузка системы.


Если на вашей системе драйвер не установлен, то вы получите стандартное окно исталлятора драйвера.

wolkow70 02-03-2014 18:56 2318187

Цитата:

Цитата Flix
Чтобы проверить, запускается ли файл или нет, уберите ключ add /q. »

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

4eshireCat 03-03-2014 00:45 2318320

Цитата:

Цитата MKN
Не подгружая битмап - скорее всего нет. »

Жаль. На Delfi это решается вроде без особых проблем, путем отрисовки контрола с использованием стиля BS_OWNERDRAW. Но как это правильно реализовать на NSIS - ума у меня не хватает :dont-know
Цитата:

Цитата MKN
А почему такая боязнь загрузки битмапа ? »

Дело не в боязни. Просто думал, что есть более универсальный и элегантный способ. Кнопок несколько и они разные. Если для каждой кнопки делать картинку (+варианты), то это не очень удобно.

PS В любом случае, спасибо за ответ!

Flix 03-03-2014 03:41 2318365

Цитата:

Цитата 4eshireCat
Ребят, пожалуйста подскажите, если кто знает - возможно ли на кастомной страничке создать кнопку заданного цвета (например красного) без использования скинов и не подгружая битмап »

Цитата:

Цитата 4eshireCat
На Delfi это решается вроде без особых проблем, путем отрисовки контрола с использованием стиля BS_OWNERDRAW. Но как это правильно реализовать на NSIS - ума у меня не хватает »

Здесь также к элементу "Кнопка" надо добавить стиль BS_OWNERDRAW (поддерживается спецификациями NSIS), а затем задать цвет текста и фона. В самом простом варианте:

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

; Раскрашиваем кнопку

!include nsDialogs.nsh
!include LogicLib.nsh

Name "Color Button"
OutFile "Color Button.exe"

XPStyle on

Page custom nsDialogsPage

Var BUTTON

Function nsDialogsPage

        nsDialogs::Create 1018
        Pop $0

        ################### Элемент КНОПКА #####################
        ${NSD_CreateButton} 50u 50u 65u 12u "Test"
        Pop $BUTTON
        ; Добавляем стиль "BS_OWNERDRAW"
        ${NSD_AddStyle} $BUTTON ${BS_OWNERDRAW}
        ; Задаем цвет текста (FFD800) и цвет фона (387AFF)
        SetCtlColors $BUTTON 0xFFD800 0x387AFF
        ; Задаем функцию для обработки нажатий по кнопке
        GetFunctionAddress $0 OnClick
        nsDialogs::OnClick $BUTTON $0
        ;-------------------------------------------------------
       
        nsDialogs::Show

FunctionEnd

; Функция обработки нажатия по кнопке
Function OnClick
        Pop $0 # HWND
        MessageBox MB_OK "Вы нажали кнопку $\"Test$\"."
FunctionEnd

Section
SectionEnd


Недостатки:
- кнопка не имеет фаски (окантовки);
- отсутствует визуализация нажатий и установки фокуса как у обычной кнопки;
- отсутствует центровка текста в элементе (и по высоте, и по ширине).

Для решения этих моментов элементу необходимо каждый раз отправлять сообщение DrawItem (отрисовка элемента - WM_DRAWITEM), которое в свою очередь передает указатель на DrawItemStruct. Это довольно сложно реализовать языком NSIS. Если бы этот способ был универсальней и элегантней, то наверняка бы никто не городил все эти плагины для скинизации интерфейса. Хотя, можете попробовать, а вдруг у вас получится ;) .

MKN 03-03-2014 11:33 2318456

Цитата:

Цитата Flix
к элементу "Кнопка" надо добавить стиль BS_OWNERDRAW »

К сожалению этот способ даже близко не напоминает кнопку и тем более нажатие на кнопку и выглядит как клик на битмап...
Тем не менее, весьма полезен для расширения NSIS-кругозора. :)
Цитата:

Цитата 4eshireCat
Если для каждой кнопки делать картинку (+варианты), то это не очень удобно. »

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

4eshireCat 04-03-2014 23:59 2319210

Цитата:

Цитата Flix
Хотя, можете попробовать, а вдруг у вас получится »

Попробовал :) Получился не фонтан конечно, но и не самый плохой вариант:

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

!include MUI2.nsh
Page custom nsDialogsPage
!insertmacro MUI_LANGUAGE "Russian"

Caption "Create Color Button"
OutFile "ColorButton.exe"
RequestExecutionLevel user

Var Dlg
Var Link
Var Label
Var Button

Function MouseOver
  System::Alloc 1
  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 = $Label
  SetCtlColors $Label  0xFFFFFF 0x0000FF
${Else}
  SetCtlColors $Label  0xFFFFFF 0xFF0000
${EndIf}
  System::Call user32::RedrawWindow(i$Label,i0,i0,i0x0105)
 
${If} $1 = $Link
  SetCtlColors $Link  0xFFFFFF 0x0000FF
${Else}
  SetCtlColors $Link  0xFFFFFF 0xFF0000
${EndIf}
  System::Call user32::RedrawWindow(i$Link,i0,i0,i0x0105)
 
  ${If} $1 = $Button
  SetCtlColors $Button  0xFFFFFF 0x0000FF
${Else}
  SetCtlColors $Button  0xFFFFFF 0xFF0000
${EndIf}
  System::Call user32::RedrawWindow(i$Button,i0,i0,i0x0105)
FunctionEnd

Function nsDialogsPage
  nsDialogs::Create 1018
  Pop $Dlg

  ####### Вариант 1 (Label) #######
 
  ${NSD_CreateLabel} 100 90 100 40 "Label"
  Pop $Label
  ${NSD_AddStyle} $Label ${SS_CENTER}|${BS_CENTER}
  SetCtlColors $Label 0xFFFFFF 0xFF0000
  ${NSD_OnClick} $Label Label

  ####### Вариант 2 (Link) #######
   
  ${NSD_CreateLink} 250 90 100 40 "$\n              Link            $\n"
  Pop $Link
  SetCtlColors $Link 0xFFFFFF 0xFF0000
  ${NSD_OnClick} $Link Link
 
  ####### Вариант 3 (Button) #######
 
  nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW} 1 175 150 100 40 "$\n          Button          $\n"
  ;${NSD_CreateButton} 175 150 100 40 "$\n          Button          $\n"
  Pop $Button
  ;${NSD_AddStyle} $Button ${BS_OWNERDRAW}
  SetCtlColors $Button 0xFFFFFF 0xFF0000
  ${NSD_OnClick} $Button Button
 
  ${NSD_CreateTimer} MouseOver 50
  nsDialogs::Show
FunctionEnd

Function Label
  System::Call user32::RedrawWindow(i$Label,i0,i0,i0x0105)
  nsResize::Set $Label 101 91 100 40 ; для большего эффекта нажатия делаем перерисовку со смещением на 1 px вправо и вниз
  Sleep 100
  nsResize::Set $Label 100 90 100 40 ; возвращаем "кнопочку" на исходную позицию
  MessageBox MB_OK "Вариант 1 (Label)"
FunctionEnd

Function Link
  System::Call user32::RedrawWindow(i$Link,i0,i0,i0x0105)
  nsResize::Set $Link 251 91 100 40
  Sleep 100
  nsResize::Set $Link 250 90 100 40
  MessageBox MB_OK "Вариант 2 (Link)"
FunctionEnd

Function Button
  System::Call user32::RedrawWindow(i$Button,i0,i0,i0x0105)
  nsResize::Set $Button 176 151 100 40
  Sleep 100
  nsResize::Set $Button 175 150 100 40
  MessageBox MB_OK "Вариант 3 (Button)"
FunctionEnd

Section
SectionEnd


Flix 06-03-2014 05:01 2319770

Вложений: 1
Цитата:

Цитата 4eshireCat
Получился не фонтан конечно, но и не самый плохой вариант »

Ну раз пошла такая пьянка, то предлагаю вам такой вариант. Идея заключается в визуализации нажатия кнопки при помощи изменения тени, которую можно создать, разместив под элементом дополнительные статические элементы с соответствующим цветом фона. В данном примере под кнопкой размещены два элемента типа Label без текста. Один смещен влево-вверх на 1 пкс. относительно элемента элемента кнопки, а другой вправо-вниз на 1 пкс. В этом направлении можно фантазировать и дальше, я думаю смысл вам понятен. Чтобы отловить нажатие левой кнопки мышки (WM_LBUTTONDOWN) пришлось задействовать плагин WndSubclass. К сожалению, он поддерживает только ANSI версию NSIS. Высоту кнопок уменьшил, чтобы текст по вертикали смотрелся по центру элемента. Выравнивание по горизонтали делаем пробелами.

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

Код сценария:

; Раскрашиваем кнопки

!include nsDialogs.nsh
!include LogicLib.nsh
!include WinMessages.nsh
!include WndSubclass.nsh

Name "Color Buttons"
OutFile "Color Buttons.exe"

XPStyle on

Page custom nsDialogsPage

Var BUTTONx1 ; элемент кнопка 1
Var Labelx1  ; окантовка кнопки 1 (светлый)
Var Labelx2  ; окантовка кнопки 1 (темный)
Var BUTTONx2 ; элемент кнопка 2
Var Labelx3  ; окантовка кнопки 2 (светлый)
Var Labelx4  ; окантовка кнопки 2 (темный)
Var BUTTONx3 ; элемент кнопка 3
Var Labelx5  ; окантовка кнопки 3 (светлый)
Var Labelx6  ; окантовка кнопки 3 (темный)
Var PressButtonVar1
Var PressButtonVar2
Var PressButtonVar3

; Визуальная обработка кнопки 1 при наведении курсора
Function MouseOver1
  System::Alloc 1
  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 = $BUTTONx1
    ; Цвета элементов при наведении курсора мышки
    SetCtlColors $BUTTONx1 0x000000 0x1CCDFF  ; кнопка
    SetCtlColors $Labelx1 0xFFFFFF 0x005540 ; окантовка кнопки
    SetCtlColors $Labelx2 0xFFFFFF 0xB5EEFF ; окантовка кнопки
  ${Else}
    ; Обычные цвета элементов
    SetCtlColors $BUTTONx1 0x000000 0x0097FF  ; кнопка
    SetCtlColors $Labelx1 0xFFFFFF 0x005540 ; окантовка кнопки
    SetCtlColors $Labelx2 0xFFFFFF 0xB5EEFF ; окантовка кнопки
  ${EndIf}
  ; Перерисовка кнопки
  System::Call user32::RedrawWindow(i$BUTTONx1,i0,i0,i0x0105)
  ; Перерисовка окантовки
  System::Call user32::RedrawWindow(i$Labelx1,i0,i0,i0x0105)
  System::Call user32::RedrawWindow(i$Labelx2,i0,i0,i0x0105)
FunctionEnd

; Визуальная обработка нажатия кнопки 1
Function PressButton1
    ${If} $2 = ${WM_LBUTTONDOWN}
      SetCtlColors $Labelx1 0xFFFFFF 0xB5EEFF
      SetCtlColors $Labelx2 0xFFFFFF 0x005540
      ; Перерисовываем элемент окантовки
      System::Call user32::RedrawWindow(i$Labelx1,i0,i0,i0x0105)
      System::Call user32::RedrawWindow(i$Labelx2,i0,i0,i0x0105)
      ; Изменяем цвет кнопки
      SetCtlColors $BUTTONx1 0xFFFFFF 0x0097FF
      ; Перерисовываем кнопку
      System::Call user32::RedrawWindow(i$BUTTONx1,i0,i0,i0x0105)
      Sleep 100
    ${EndIf}
FunctionEnd

; Визуальная обработка кнопки 2 при наведении курсора
Function MouseOver2
  System::Alloc 1
  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 = $BUTTONx2
    ; Цвета элементов при наведении курсора мышки
    SetCtlColors $BUTTONx2 0x000000 0x88FF87  ; кнопка
    SetCtlColors $Labelx3 0xFFFFFF 0x007F0E ; окантовка кнопки
    SetCtlColors $Labelx4 0xFFFFFF 0xA5FF7F ; окантовка кнопки
  ${Else}
    ; Обычные цвета элементов
    SetCtlColors $BUTTONx2 0x000000 0x00FF11  ; кнопка
    SetCtlColors $Labelx3 0xFFFFFF 0x007F0E ; окантовка кнопки
    SetCtlColors $Labelx4 0xFFFFFF 0xA5FF7F ; окантовка кнопки
  ${EndIf}
  ; Перерисовка кнопки
  System::Call user32::RedrawWindow(i$BUTTONx2,i0,i0,i0x0105)
  ; Перерисовка окантовки
  System::Call user32::RedrawWindow(i$Labelx3,i0,i0,i0x0105)
  System::Call user32::RedrawWindow(i$Labelx4,i0,i0,i0x0105)
FunctionEnd

; Визуальная обработка нажатия кнопки 2
Function PressButton2
    ${If} $2 = ${WM_LBUTTONDOWN}
      SetCtlColors $Labelx3 0xFFFFFF 0xA5FF7F
      SetCtlColors $Labelx4 0xFFFFFF 0x007F0E
      ; Перерисовываем элемент окантовки
      System::Call user32::RedrawWindow(i$Labelx3,i0,i0,i0x0105)
      System::Call user32::RedrawWindow(i$Labelx4,i0,i0,i0x0105)
      ; Изменяем цвет кнопки
      SetCtlColors $BUTTONx2 0xFFFFFF 0x34AF00
      ; Перерисовываем кнопку
      System::Call user32::RedrawWindow(i$BUTTONx2,i0,i0,i0x0105)
      Sleep 100
    ${EndIf}
FunctionEnd

; Визуальная обработка кнопки 3 при наведении курсора
Function MouseOver3
  System::Alloc 1
  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 = $BUTTONx3
    ; Цвета элементов при наведении курсора мышки
    SetCtlColors $BUTTONx3 0x000000 0xFF4F66  ; кнопка
    SetCtlColors $Labelx5 0xFFFFFF 0x890012 ; окантовка кнопки
    SetCtlColors $Labelx6 0xFFFFFF 0xFFC6CE ; окантовка кнопки
  ${Else}
    ; Обычные цвета элементов
    SetCtlColors $BUTTONx3 0x000000 0xFF001F  ; кнопка
    SetCtlColors $Labelx5 0xFFFFFF 0x890012 ; окантовка кнопки
    SetCtlColors $Labelx6 0xFFFFFF 0xFFC6CE ; окантовка кнопки
  ${EndIf}
  ; Перерисовка кнопки
  System::Call user32::RedrawWindow(i$BUTTONx3,i0,i0,i0x0105)
  ; Перерисовка окантовки
  System::Call user32::RedrawWindow(i$Labelx5,i0,i0,i0x0105)
  System::Call user32::RedrawWindow(i$Labelx6,i0,i0,i0x0105)
FunctionEnd

; Визуальная обработка нажатия кнопки 3
Function PressButton3
    ${If} $2 = ${WM_LBUTTONDOWN}
      SetCtlColors $Labelx5 0xFFFFFF 0xFFC6CE
      SetCtlColors $Labelx6 0xFFFFFF 0x890012
      ; Перерисовываем элемент окантовки
      System::Call user32::RedrawWindow(i$Labelx5,i0,i0,i0x0105)
      System::Call user32::RedrawWindow(i$Labelx6,i0,i0,i0x0105)
      ; Изменяем цвет кнопки
      SetCtlColors $BUTTONx3 0xFFFFFF 0xCC001B
      ; Перерисовываем кнопку
      System::Call user32::RedrawWindow(i$BUTTONx3,i0,i0,i0x0105)
      Sleep 100
    ${EndIf}
FunctionEnd

; Отрисовка пользовательского диалога
Function nsDialogsPage
        nsDialogs::Create 1018
        Pop $0
       
  ################### Элемент КНОПКА #####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 50u 50u 40u 10u "    Test 1    "
    Pop $BUTTONx1
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx1 Button_x1
       
    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 50u 50u 41u 11u ""
    Pop $Labelx2
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 49u 49u 41u 11u ""
    Pop $Labelx1
  ;#######################################################
 
  ################## Элемент КНОПКА 2 ####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 110u 50u 40u 10u "    Test 2    "
    Pop $BUTTONx2
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx2 Button_x2
       
    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 110u 50u 41u 11u ""
    Pop $Labelx4
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 109u 49u 41u 11u ""
    Pop $Labelx3
  ;#######################################################
 
  ################## Элемент КНОПКА 3 ####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 170u 50u 40u 10u "    Test 3    "
    Pop $BUTTONx3
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx3 Button_x3
       
    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 170u 50u 41u 11u ""
    Pop $Labelx6
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 169u 49u 41u 11u ""
    Pop $Labelx5
  ;#######################################################

        ${NSD_CreateTimer} MouseOver1 50
        ${NSD_CreateTimer} MouseOver2 50
        ${NSD_CreateTimer} MouseOver3 50
       
        ${WndSubclass_Subclass} $BUTTONx1 PressButton1 $PressButtonVar1 $PressButtonVar1
        ${WndSubclass_Subclass} $BUTTONx2 PressButton2 $PressButtonVar2 $PressButtonVar2
        ${WndSubclass_Subclass} $BUTTONx3 PressButton3 $PressButtonVar3 $PressButtonVar3
        nsDialogs::Show
FunctionEnd

; Функция обработки нажатия по кнопке 1
Function Button_x1
        MessageBox MB_OK "Вы нажали кнопку $\"Test 1$\"."
FunctionEnd

; Функция обработки нажатия по кнопке 2
Function Button_x2
        MessageBox MB_OK "Вы нажали кнопку $\"Test 2$\"."
FunctionEnd

; Функция обработки нажатия по кнопке 3
Function Button_x3
        MessageBox MB_OK "Вы нажали кнопку $\"Test 3$\"."
FunctionEnd

Section
SectionEnd


Не знаю, конечно, где такое может пригодиться, но вдруг у кого-то возникнет такая потребность (типа шутки - красная кнопка с надписью "Не нажимать!" :lol: ).

Во вложении файл сценария и его скомпилированный пример.

MKN 06-03-2014 10:27 2319822

Цитата:

Цитата Flix
Не знаю, конечно, где такое может пригодиться »

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

Flix 06-03-2014 15:12 2319920

Цитата:

Цитата MKN
Начали с того, что как бы раскрасить кнопку без плагинов, загрузки битмапов и вааще попроще, а закончили громоздской горожей из кода и плагина »

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

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

; Раскрашиваем кнопки

!include nsDialogs.nsh
!include LogicLib.nsh


Name "Color Buttons"
OutFile "Color Buttons II.exe"

XPStyle on

Page custom nsDialogsPage

Var BUTTONx1 ; элемент кнопка 1
Var Labelx1  ; окантовка кнопки 1 (светлый)
Var Labelx2  ; окантовка кнопки 1 (темный)
Var BUTTONx2 ; элемент кнопка 2
Var Labelx3  ; окантовка кнопки 2 (светлый)
Var Labelx4  ; окантовка кнопки 2 (темный)
Var BUTTONx3 ; элемент кнопка 3
Var Labelx5  ; окантовка кнопки 3 (светлый)
Var Labelx6  ; окантовка кнопки 3 (темный)


; Визуальная обработка кнопки 1 при наведении курсора
Function MouseOver1
  System::Alloc 1
  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 = $BUTTONx1
    ; Цвета элементов при наведении курсора мышки
    SetCtlColors $BUTTONx1 0x000000 0x1CCDFF  ; кнопка
    SetCtlColors $Labelx1 0xFFFFFF 0x005540 ; окантовка кнопки
    SetCtlColors $Labelx2 0xFFFFFF 0xB5EEFF ; окантовка кнопки
  ${Else}
    ; Обычные цвета элементов
    SetCtlColors $BUTTONx1 0x000000 0x0097FF  ; кнопка
    SetCtlColors $Labelx1 0xFFFFFF 0x005540 ; окантовка кнопки
    SetCtlColors $Labelx2 0xFFFFFF 0xB5EEFF ; окантовка кнопки
  ${EndIf}
  ; Перерисовка кнопки
  System::Call user32::RedrawWindow(i$BUTTONx1,i0,i0,i0x0105)
  ; Перерисовка окантовки
  System::Call user32::RedrawWindow(i$Labelx1,i0,i0,i0x0105)
  System::Call user32::RedrawWindow(i$Labelx2,i0,i0,i0x0105)
FunctionEnd

; Визуальная обработка кнопки 2 при наведении курсора
Function MouseOver2
  System::Alloc 1
  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 = $BUTTONx2
    ; Цвета элементов при наведении курсора мышки
    SetCtlColors $BUTTONx2 0x000000 0x88FF87  ; кнопка
    SetCtlColors $Labelx3 0xFFFFFF 0x007F0E ; окантовка кнопки
    SetCtlColors $Labelx4 0xFFFFFF 0xA5FF7F ; окантовка кнопки
  ${Else}
    ; Обычные цвета элементов
    SetCtlColors $BUTTONx2 0x000000 0x00FF11  ; кнопка
    SetCtlColors $Labelx3 0xFFFFFF 0x007F0E ; окантовка кнопки
    SetCtlColors $Labelx4 0xFFFFFF 0xA5FF7F ; окантовка кнопки
  ${EndIf}
  ; Перерисовка кнопки
  System::Call user32::RedrawWindow(i$BUTTONx2,i0,i0,i0x0105)
  ; Перерисовка окантовки
  System::Call user32::RedrawWindow(i$Labelx3,i0,i0,i0x0105)
  System::Call user32::RedrawWindow(i$Labelx4,i0,i0,i0x0105)
FunctionEnd

; Визуальная обработка кнопки 3 при наведении курсора
Function MouseOver3
  System::Alloc 1
  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 = $BUTTONx3
    ; Цвета элементов при наведении курсора мышки
    SetCtlColors $BUTTONx3 0x000000 0xFF4F66  ; кнопка
    SetCtlColors $Labelx5 0xFFFFFF 0x890012 ; окантовка кнопки
    SetCtlColors $Labelx6 0xFFFFFF 0xFFC6CE ; окантовка кнопки
  ${Else}
    ; Обычные цвета элементов
    SetCtlColors $BUTTONx3 0x000000 0xFF001F  ; кнопка
    SetCtlColors $Labelx5 0xFFFFFF 0x890012 ; окантовка кнопки
    SetCtlColors $Labelx6 0xFFFFFF 0xFFC6CE ; окантовка кнопки
  ${EndIf}
  ; Перерисовка кнопки
  System::Call user32::RedrawWindow(i$BUTTONx3,i0,i0,i0x0105)
  ; Перерисовка окантовки
  System::Call user32::RedrawWindow(i$Labelx5,i0,i0,i0x0105)
  System::Call user32::RedrawWindow(i$Labelx6,i0,i0,i0x0105)
FunctionEnd

; Отрисовка пользовательского диалога
Function nsDialogsPage
    nsDialogs::Create 1018
    Pop $0

  ################### Элемент КНОПКА #####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 50u 50u 40u 10u "    Test 1    "
    Pop $BUTTONx1
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx1 Button_x1

    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 50u 50u 41u 11u ""
    Pop $Labelx2
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 49u 49u 41u 11u ""
    Pop $Labelx1
  ;#######################################################

  ################## Элемент КНОПКА 2 ####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 110u 50u 40u 10u "    Test 2    "
    Pop $BUTTONx2
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx2 Button_x2

    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 110u 50u 41u 11u ""
    Pop $Labelx4
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 109u 49u 41u 11u ""
    Pop $Labelx3
  ;#######################################################

  ################## Элемент КНОПКА 3 ####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 170u 50u 40u 10u "    Test 3    "
    Pop $BUTTONx3
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx3 Button_x3
   
    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 170u 50u 41u 11u ""
    Pop $Labelx6
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 169u 49u 41u 11u ""
    Pop $Labelx5
  ;#######################################################

    ${NSD_CreateTimer} MouseOver1 50
    ${NSD_CreateTimer} MouseOver2 50
    ${NSD_CreateTimer} MouseOver3 50

    nsDialogs::Show
FunctionEnd

; Функция обработки нажатия по кнопке 1
Function Button_x1
      ; Изменяем цвет окантовки
      SetCtlColors $Labelx1 0xFFFFFF 0xB5EEFF
      SetCtlColors $Labelx2 0xFFFFFF 0x005540
      ; Перерисовываем элемент окантовки
      System::Call user32::RedrawWindow(i$Labelx1,i0,i0,i0x0105)
      System::Call user32::RedrawWindow(i$Labelx2,i0,i0,i0x0105)
      ; Изменяем цвет кнопки
      SetCtlColors $BUTTONx1 0xFFFFFF 0x0097FF
      ; Перерисовываем кнопку
      System::Call user32::RedrawWindow(i$BUTTONx1,i0,i0,i0x0105)
      Sleep 100

    MessageBox MB_OK "Вы нажали кнопку $\"Test 1$\"."
FunctionEnd

; Функция обработки нажатия по кнопке 2
Function Button_x2
      ; Изменяем цвет окантовки
      SetCtlColors $Labelx3 0xFFFFFF 0xA5FF7F
      SetCtlColors $Labelx4 0xFFFFFF 0x007F0E
      ; Перерисовываем элемент окантовки
      System::Call user32::RedrawWindow(i$Labelx3,i0,i0,i0x0105)
      System::Call user32::RedrawWindow(i$Labelx4,i0,i0,i0x0105)
      ; Изменяем цвет кнопки
      SetCtlColors $BUTTONx2 0xFFFFFF 0x34AF00
      ; Перерисовываем кнопку
      System::Call user32::RedrawWindow(i$BUTTONx2,i0,i0,i0x0105)
      Sleep 100

    MessageBox MB_OK "Вы нажали кнопку $\"Test 2$\"."
FunctionEnd

; Функция обработки нажатия по кнопке 3
Function Button_x3
      ; Изменяем цвет окантовки
      SetCtlColors $Labelx5 0xFFFFFF 0xFFC6CE
      SetCtlColors $Labelx6 0xFFFFFF 0x890012
      ; Перерисовываем элемент окантовки
      System::Call user32::RedrawWindow(i$Labelx5,i0,i0,i0x0105)
      System::Call user32::RedrawWindow(i$Labelx6,i0,i0,i0x0105)
      ; Изменяем цвет кнопки
      SetCtlColors $BUTTONx3 0xFFFFFF 0xCC001B
      ; Перерисовываем кнопку
      System::Call user32::RedrawWindow(i$BUTTONx3,i0,i0,i0x0105)
      Sleep 100

    MessageBox MB_OK "Вы нажали кнопку $\"Test 3$\"."
FunctionEnd

Section
SectionEnd


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

MKN 06-03-2014 17:03 2319945

Flix,
Всё это хорошо, но громоздко в коде + известные недостатки...

Кстати о плагинах. Как то совсем забыли про botva2.dll для InnoSetup...
Всего одна строчка кода (загрузка картинок не в счёт), и на тебе - кнопка... Лишь надо картинку раскрасить по вкусу..

System::Call "botva2::BtnCreate(ir0,i0,i0,i100,i30,t'$PLUGINSDIR\pict_button.bmp',i0,i0)i.R0"
Только неизвестно как там решить вопрос с калбэком при нажатии...

Flix 06-03-2014 17:35 2319961

Цитата:

Цитата MKN
но громоздко в коде + известные недостатки... »

Я с самого начала об этом говорил, но человек спросил без сторонних разработок, средствами самого NSIS. Главное дать идею, а дальше уж пускай развивает её сообразно имеющемуся опыту и знаниям. :)

wolkow70 11-03-2014 15:01 2322063

Не сложный макрос для проверки ключа реестра на наличие:

читать дальше »
!include "LogicLib.nsh"

!macro IfKeyExists ROOT MAIN_KEY KEY
Push $R0
Push $R1
Push $R2
StrCpy $R1 "0"
StrCpy $R2 "0"
${Do}
EnumRegKey $R0 ${ROOT} "${MAIN_KEY}" "$R1"
${If} $R0 == "${KEY}"
StrCpy $R2 "1" # found
${Break}
${EndIf}
IntOp $R1 $R1 + 1
${LoopWhile} $R0 != ""
ClearErrors
Exch 2
Pop $R0
Pop $R1
Exch $R2
!macroend

Пример использования :
!insertmacro IfKeyExists "HKCU" "Software\Classes" ".MP3"
Pop $R0
;
${If} $R0 == "1"
MessageBox MB_OK "Ключ существует"
${ElseIf} $R0 == "0"
MessageBox MB_OK "Ключ не существует"
${EndIf}

MKN 12-03-2014 10:46 2322446

Цитата:

Цитата wolkow70
Не сложный макрос для проверки ключа реестра на наличие: »

А разве классическая проверка не работает ? :
Код:

ClearErrors
EnumRegKey $0 HKCR "SOFTWARE\Test" 0
IfErrors 0 keyexist
  # key does not exist
keyexist:

или
Код:

ClearErrors
ReadRegStr $0 HKLM "SOFTWARE\Test" ""
${If} ${Errors}
; или , в зависимости от ситуации,  используем ${If} $0 == ""
  # key does not exist
${EndIf}

а для более "расширенных" случаев, лучше использовать Registry plug-in http://nsis.sourceforge.net/Registry_plug-in
Код:

KeyExists (check if registry key exists)
${registry::KeyExists} "[fullpath]" $var


MKN 13-03-2014 12:20 2322954

может кому пригодится - конвертация размера файла из KB в MB :
Код:

OutFile "Size_test.exe"
Var InSize
Var OutSize

Section
;задаём размер в KB, который надо конвертировать
;StrCpy $InSize 1024
StrCpy $InSize 2048
StrCpy $1 $InSize

IntCmp $1 1024 +3 +1 +3
StrCpy $1 "$1.0KB"
Goto +12
IntOp $1 $1 * 100
IntOp $1 $1 / 1024
StrCpy $2 $1 "" -1 
StrCpy $3 $1 1 -2 
StrCpy $1 $1 -2   
IntCmp $2 5 +1 +2 +1   
IntOp $3 $3 + 1
StrCmp $3 10 +1 +3
StrCpy $3 0
IntOp $1 $1 + 1
StrCpy $1 "$1.$3 MB"   

StrCpy $OutSize $1
MessageBox MB_ICONINFORMATION|MB_OK '$InSize KB  = $OutSize'
SectionEnd


MKN 14-03-2014 10:39 2323437

Пользовательские иконки из DLL - в MessageBox
Уже был макрос для этого , но можно использовать и такой вариант :

Код:

outfile MessageBoxIco_test.exe
!define MSGBOXPARAMS '(i, i, i, t, t, i, t, i, i, i) i'
!define ID_ICO 16

Section
System::Call 'Kernel32::LoadLibrary(t "Fileicons.dll") i .r1'
IntCmp $1 0 Err Err 0
System::Call '*${MSGBOXPARAMS}(40, $HWNDPARENT, r1, "Текст сообщения", "  Заголовок", 0x80|0x0, i ${ID_ICO}, 0, 0, 0) .r3'
System::Call 'User32::MessageBoxIndirect(i r3) v r4'
System::Call 'Kernel32::FreeLibrary(i r1) v r4'
System::Free $3
Err:
SectionEnd

; Кнопки и надписи действий на кнопках
; 0x0 - ОК
; 0x1 - ОК Отмена
; 0x2 - Прервать Повтор Пропустить
; 0x3 - Да Нет Отмена
; 0x4 - Да Нет
; 0x5 - Повтор Отмена
; 0x6 - Отмена Повторить Продолжить
; 0x4000 - ОК Справка

Fileicons.dll - это в примере, библиотека из TotalCommander_a. Ессно можно использовать любую DLL. ( Не забываем организовать путь к библиотеке. Из $PLUGINSDIR или как угодно )
Номер ID_ICO необходимой иконки из DLL - смотрим в любом редакторе ресурсов.

Kopejkin 16-03-2014 15:10 2324308

Есть такой плагин WPatch
Вместе с ним идет пример сценария.

Код:

; WPatch - Sample script

!system "rmdir /s /Q dir_to_patch"
!system "xcopy /E /Q /H dir1\* dir_to_patch\"


!ifdef TARGETDIR
!addplugindir "${TARGETDIR}"
!else
!addplugindir "..\..\bin"
!endif

Name "Sample WPatch"
OutFile Sample.exe
ShowInstDetails show
InstallDir $EXEDIR\dir_to_patch
Page directory
Page instfiles

Section
    InitPluginsDir
SectionEnd

!include WGenPatDir.nsh

Section
    IfErrors 0 +2
        MessageBox MB_OK "There has been some errors !"
SectionEnd

Вопрос по выделенным красным строках (для общего развития)

В примере также имеются папки с файлами dir1 и dir2. Соответственно, первая - с исходными файлами и папками, вторая - с измененными.
После запуске батника создается файл отличий *.pat и WGenPatDir.nsh, который в дальнейшем будет использоваться для пропатчивания.

Если я правильно понял вторую строку, то содержимое папки dir1 должно скопироваться в папку dir_to_patch во время компиляции сценария?
Созданный патч Sample.exe после запуска "натравливается" на содержимое этой папки dir_to_patch.

В реальности, папка dir_to_patch удаляется, а такая же, с исходным содержимым папки dir1, не появляется. В чем прикол?
В русскоязычном Руководстве о параметрах команды !system написано не очень много и не совсем по-русски.

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

kotkovets 17-03-2014 15:29 2324843

Цитата:

Цитата Kopejkin
!system написано не очень много и не совсем по-русски. »

! - с этого символа: это команды компилятора.
!system - компилятор задействует системные ресурсы (приложения)
Цитата:

!system "rmdir /s /Q dir_to_patch"
!system "xcopy /E /Q /H dir1\* dir_to_patch\"
1 перед компиляцией удаляется каталог dir_to_patch относительно скрипта
2 копируется содержимое каталога dir1 в каталог dir_to_patch
(этот каталог создается заново, для того, что бы не попали в проект файлы предыдущей компиляции)
Цитата:

Цитата Kopejkin
В реальности, папка dir_to_patch удаляется, а такая же, с исходным содержимым папки dir1, не появляется. В чем прикол? »

посмотрите ключи системной утилиты xcopy

Kopejkin 21-03-2014 15:42 2326693

Используя в сценарии этот код
Код:



  !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}_Localize"
  !define PRODUCT_UNINST_ROOT_KEY "HKLM"

  SetShellVarContext all
      CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" 
      CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить русификатор ${PRODUCT_NAME}.lnk" "$INSTDIR\unrus.exe"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}${PRODUCT_VERSION}. Удалить русификатор"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\unrus.exe"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "1.0"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "©Kopejkin, 03/2014"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\unrus.exe"
      WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "NoModify" 0x00000001

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

На Windows 8 я получаю ярлыки в Панели управления



и, как бы, в меню Пуск.



А ярлыков не видно ни здесь



ни здесь




На Win7 ярлык нормально отображается в меню Пуск. Как правильно написать и для Win 8?
Разрядность ОС - только х64

Flix 22-03-2014 02:54 2326940

Kopejkin, если во всем сценарии нет ошибок, то все ярлыки будут созданы согласно указанным командам. По крайней мере у себя я таких проблем не наблюдаю (пользуюсь NSIS v3.0a2). Вот проверил на виртуалке:

Kopejkin 22-03-2014 03:51 2326948

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

Flix 23-03-2014 01:05 2327299

Цитата:

Цитата Kopejkin
поделитесь этим тестовым сценарием »

Kopejkin, да делиться нечем. Загляните в папку "Examples" по месту установки NSIS. В частности, при тестировании я использовал сценарий WelcomeFinish.nsi из папки "Modern UI". Я только добавил команды создания ярлыков в секцию "Dummy Section":

CreateDirectory "$SMPROGRAMS\МОЯ ПРОГРАММА"
CreateShortCut "$SMPROGRAMS\МОЯ ПРОГРАММА\УДАЛИТЬ_ТЕСТ.lnk" "$INSTDIR\Uninstall.exe"

И в секцию "Uninstall" их удаление

Delete "$SMPROGRAMS\МОЯ ПРОГРАММА\УДАЛИТЬ_ТЕСТ.lnk"
RMDir "$SMPROGRAMS\МОЯ ПРОГРАММА"

Потом сделал копию файла WelcomeFinish.nsi, переименовал его в WelcomeFinish_rus.nsi (имитация русификатора) и соответственно изменил в нём название файла деинсталляции (Uninstall_rus.exe) и имя ярлыка (УДАЛИТЬ_RUS.lnk). На этом все.

Kopejkin 23-03-2014 14:35 2327424

Добиться отображения ярлыков и в Приложениях и в Установке/Удалении на Win8 мне не удается.
Отключаю блок Установка/Удаление - ярлык "Удалить русификатор..." отображается в Приложениях.
Включаю - ярлык "Удалить русификатор..." в папке с ярлыками программы присутствует, а Приложениях - не отображается.
Может я что-то упускаю, подскажите, пожалуйста.

Тренируюсь на этом сценарии:

Код:

########## ПРИМЕР ##############

!define PRODUCT_NAME "FolderSizes 7"
!define PRODUCT_VERSION ".0.56"
!define BRANDING "PUPKIN"

!include "MUI.nsh"

SetCompressor /SOLID lzma

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

!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

!insertmacro MUI_LANGUAGE "Russian"

Name "${PRODUCT_NAME}"
Caption "Установка русификатора ${PRODUCT_NAME}${PRODUCT_VERSION}"
UninstallCaption "Удаление русификатора ${PRODUCT_NAME}${PRODUCT_VERSION}"
OutFile "rus.${PRODUCT_NAME}${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES64\Key Metric Software\${PRODUCT_NAME}"
RequestExecutionLevel admin
ShowInstDetails show
ShowUninstDetails show
BrandingText "${BRANDING}"

Section "-MainSection"
  SetOutPath "$INSTDIR"
  File /r "D:\Example1\1.txt"
  WriteUninstaller "$INSTDIR\unrus.exe"
/*
  ; блок Установка/Удаление программм
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayName" "${PRODUCT_NAME}${PRODUCT_VERSION}. Удалить русификатор"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "UninstallString" "$INSTDIR\unrus.exe"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayVersion" "1.0"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "Publisher" "© Pupkin, 03/2014"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayIcon" "$INSTDIR\unrus.exe"
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "NoModify" 0x00000001
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "NoRepair" 0x00000001
*/
  SetShellVarContext all
  ; Ярлыки в меню Пуск - Программы
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  ; в Win8 этот ярлык виден в ПРИЛОЖЕНИЯХ в ЛЮБОМ случае
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Открыть 1.txt.lnk" "$INSTDIR\1.txt"
  ; в Win8 этот ярлык виден в ПРИЛОЖЕНИЯХ только при "ОТКЛЮЧЕНИИ" блока "Установка/Удаление"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить русификатор ${PRODUCT_NAME}.lnk" "$INSTDIR\unrus.exe"

  SetAutoClose false
SectionEnd

Section Uninstall
  Delete "$INSTDIR\1.txt"
  SetShellVarContext all
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Открыть 1.txt.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Удалить русификатор ${PRODUCT_NAME}.lnk"
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus"
  delete "$INSTDIR\unrus.exe"
  SetAutoClose false
SectionEnd


Flix 24-03-2014 01:00 2327688

Kopejkin, вы в своем сценарии не учли особенности систем 64-бит. Помимо раздельных каталогов для установки 32-бит и 64-бит приложений ("Program Files (x86)" и "Program Files" соответственно), 64-бит версии Windows поддерживают два разных представления реестра - 32-бит и 64-бит (для 32-бит приложений работает WOW64). Короче, в своем сценарии, установку деинсталлятора вы осуществляете в каталог для 64-бит приложений, а запись о деинсталляции выполняете в 32-бит ветку реестра. В итоге ярлык деинсталляции получается битый и Windows разумно полагает, что ему не место на экране Приложений, и не показывает его. По умолчанию NSIS создает инсталлятор для установки 32-бит приложений. Если требуется установка приложения с учетом 64-бит архитектуры, то в сценарии нужно предусмотреть эти моменты и дать соответствующие команды. В данном случае, при записи в реестр, нужно установить доступ к 64-бит ветке реестра. Делается это командой SetRegView (почитайте про неё в справке NSIS).

Поэтому, перед командами записи данных в реестр, укажите команду SetRegView 64. Аналогично и для секции деинсталляции, чтобы корректно удалить записанные ключи.
читать дальше »
Код:

########## ПРИМЕР ##############

!define PRODUCT_NAME "FolderSizes 7"
!define PRODUCT_VERSION ".0.56"
!define BRANDING "PUPKIN"

!include "MUI.nsh"

SetCompressor /SOLID lzma

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

!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

!insertmacro MUI_LANGUAGE "Russian"

Name "${PRODUCT_NAME}"
Caption "Установка русификатора ${PRODUCT_NAME}${PRODUCT_VERSION}"
UninstallCaption "Удаление русификатора ${PRODUCT_NAME}${PRODUCT_VERSION}"
OutFile "rus.${PRODUCT_NAME}${PRODUCT_VERSION}_with_reg.exe"

; Установка в каталог для 64-бит приложений!
InstallDir "$PROGRAMFILES64\Key Metric Software\${PRODUCT_NAME}"

RequestExecutionLevel admin
ShowInstDetails show
ShowUninstDetails show
BrandingText "${BRANDING}"

Section "-MainSection"
  SetOutPath "$INSTDIR"
  File /r "1.txt"
  WriteUninstaller "$INSTDIR\unrus.exe"

  ; Устанавливаем доступ к 64-бит ветке реестра
  SetRegView 64

  ; блок Установка/Удаление программм
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayName" "${PRODUCT_NAME}${PRODUCT_VERSION}. Удалить русификатор"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "UninstallString" "$INSTDIR\unrus.exe"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayVersion" "1.0"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "Publisher" "© Pupkin, 03/2014"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayIcon" "$INSTDIR\unrus.exe"
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "NoModify" 0x00000001
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "NoRepair" 0x00000001

  SetShellVarContext all
  ; Ярлыки в меню Пуск - Программы
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  ; в Win8 этот ярлык виден в ПРИЛОЖЕНИЯХ в ЛЮБОМ случае
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Открыть 1.txt.lnk" "$INSTDIR\1.txt"
  ; в Win8 этот ярлык виден в ПРИЛОЖЕНИЯХ только при "ОТКЛЮЧЕНИИ" блока "Установка/Удаление"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить русификатор ${PRODUCT_NAME}.lnk" "$INSTDIR\unrus.exe"

  SetAutoClose false
SectionEnd

Section Uninstall
  Delete "$INSTDIR\1.txt"
  SetShellVarContext all
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Открыть 1.txt.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Удалить русификатор ${PRODUCT_NAME}.lnk"

  ; Устанавливаем доступ к 64-бит ветке реестра
  SetRegView 64

  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus"
  Delete "$INSTDIR\unrus.exe"
  SetAutoClose false
SectionEnd


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

Kopejkin 24-03-2014 02:18 2327728

Flix, спасибо за ответ, но так... тоже не работает.
Если устанавливать в C:\Program Files (x86), все происходит точно также: ярлык деинсталлятора отображается в Приложениях только после "скрытия" блока Установки/Удаления. :blink:

Цитата Flix:
Еще подумайте..»
Как раз с этим проблем не было. K.A.V. подсказочку подарил, правда по другому поводу...
Код:

Function .OnInit
var /global IsWow64Process     
            System::Call kernel32::GetCurrentProcess()i.s
            System::Call kernel32::IsWow64Process(is,*i.s)
            Pop $IsWow64Process
            StrCmp $IsWow64Process "1" +3 0
  MessageBox MB_OK|MB_ICONSTOP "Только для х64!" IDOK
Quit
FunctionEnd


erd-zelen 24-03-2014 11:20 2327834

как в NSIS создать проект *.exe имея архив 7z, иконку, бантик, файл txt с настройками для sfx. Обычно делал до этого кнопкой (button), небольшие репаки прог и портабле.
Может есть какой то инструмент чтобы с нуля скрипт не писать (я этого делать не умею), а потом только вписать правельные название файлов, версия...

kotkovets 24-03-2014 11:29 2327835

Цитата:

Цитата erd-zelen
Может есть какой то инструмент чтобы с нуля скрипт не писать (я этого делать не умею) »

учитесь писать..
простенькое IDE встроен в nisedit2.0.3 проект давно не развивался, но простых задач сойдет.

erd-zelen 24-03-2014 11:35 2327838

Цитата:

Цитата kotkovets
простенькое IDE встроен в nisedit2.0.3 »

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

kotkovets 24-03-2014 11:50 2327842

Цитата:

Цитата erd-zelen
там не работает создание проекта мастером, локацию просит указать а курсор туда не переводится »

сделайте редактор по умолчанию --> F11, установите NSIS, если не установлен .. O_o

erd-zelen 24-03-2014 11:54 2327844

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

kotkovets 24-03-2014 12:01 2327848

Цитата:

Цитата erd-zelen
сделал, не помогло. ось хр стоит. не пойму как »

Справочник по NSIS русски в шапке темы - обязательно к чтению и изучению

Kopejkin 24-03-2014 12:02 2327850

erd-zelen, вам же говорят: сначала установите NSIS. Как вариант, после установки NSIS, попробуйте переустановить nisedit2.0.3 или сменить его версию на предыдущую.
На всякий случай: NSIS и nisedit2.0.3 - это не одно и то же ;)

erd-zelen 24-03-2014 12:33 2327864

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

alexfinik 24-03-2014 13:56 2327891

Друзья, взялся за свои инсталлятор после 5-тимесячного перерыва. Спасибо завсегдатаям за помощь огромное - он работает. Но хочу доработать, а всё забыл:)

Пока не разобрался с командой дико редко встречаемой (только у меня в комментариях???) ${OpenBox}

Команда из пакета Dialogs.nsh
Там есть стандартная программа,
Код:

!include "dialogs.nsh"

Name "OpenBox-1"
OutFile "OpenBox-1.exe"
XPStyle on
ShowInstDetails show

Function .onInit
# Params:
# 1) Title: "Search for a TEXT file"
# 2) Filter: "Text (*.txt)|*.txt||"
# 3) FilterIndex: 1
# 4) InitDir: $EXEDIR
# 5) Style: 3 (default style)
# 6) Return: $6
${OpenBox} "Search for a TEXT file" "Text (*.txt)|*.txt||" 1 "$EXEDIR" 3 ${VAR_6}
FunctionEnd

Section
# See if the user selects a file:
${if} $6 == "${NULL}"
DetailPrint "Operation was canceled!"
${else}
DetailPrint "You choose: $6"
${endif}
SectionEnd

Которая выдает ошибку при запуске

Код:

Processing script file: "D:\Desktop\examples\OpenBox-2.nsi"
!include: "C:\Program Files (x86)\NSIS\Unicode\Include\dialogs.nsh"
File 'C:\Program Files (x86)\NSIS\Unicode\Include\dialogs.nsh' has no BOM and does not validate as UTF-8.
!define: "DIALOGS_NSH"=""
!include: closed: "C:\Program Files (x86)\NSIS\Unicode\Include\dialogs.nsh"
Name: "OpenBox-2"
OutFile: "OpenBox-2.exe"
XPStyle: on
ShowInstDetails: show
Function: ".onInit"
Invalid command: dialogsEx::FileBox
Error in script "D:\Desktop\examples\OpenBox-2.nsi" on line 16 -- aborting creation process


Не понимаю что значит Invalid command: dialogsEx::FileBox
Интернет и форум молчит...

Спасибо.

Flix 24-03-2014 14:08 2327894

Цитата Kopejkin:
но так... тоже не работает »
Тогда сделайте вот так:
читать дальше »
Код:

########## ПРИМЕР ##############

!define PRODUCT_NAME "FolderSizes 7"
!define PRODUCT_VERSION ".0.56"
!define BRANDING "PUPKIN"

SetCompressor /SOLID lzma

!include MUI.nsh
!include x64.nsh      ; поддержка 64-бит систем
!include Logiclib.nsh  ; расширенная поддержка логики

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

!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

!insertmacro MUI_LANGUAGE "Russian"

Name "${PRODUCT_NAME}"
Caption "Установка русификатора ${PRODUCT_NAME}${PRODUCT_VERSION}"
UninstallCaption "Удаление русификатора ${PRODUCT_NAME}${PRODUCT_VERSION}"
OutFile "rus.${PRODUCT_NAME}${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES\Key Metric Software\${PRODUCT_NAME}\"
RequestExecutionLevel admin
ShowInstDetails show
ShowUninstDetails show
BrandingText "${BRANDING}"

Function .onInit
  ${If} ${RunningX64}
    SetRegView 64
    StrCpy $INSTDIR "$PROGRAMFILES64\Key Metric Software\${PRODUCT_NAME}\"
  ${Else}
    MessageBox MB_OK|MB_ICONSTOP "Только для систем х64!" IDOK
    Quit
  ${EndIf}
FunctionEnd

Function un.onInit
  ${If} ${RunningX64}
    SetRegView 64
  ${EndIf}
FunctionEnd

Section "-MainSection"

  SetOutPath "$INSTDIR"
  File /r "1.txt"
  WriteUninstaller "$INSTDIR\unrus.exe"
  ; блок Установка/Удаление программм
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayName" "${PRODUCT_NAME}${PRODUCT_VERSION}. Удалить русификатор"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "UninstallString" "$INSTDIR\unrus.exe"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayVersion" "1.0"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "Publisher" "© Pupkin, 03/2014"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayIcon" "$INSTDIR\unrus.exe"
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "NoModify" 0x00000001
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "NoRepair" 0x00000001

  SetShellVarContext all
  ; Ярлыки в меню Пуск - Программы
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  ; в Win8 этот ярлык виден в ПРИЛОЖЕНИЯХ в ЛЮБОМ случае
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Открыть 1.txt.lnk" "$INSTDIR\1.txt"
  ; в Win8 этот ярлык виден в ПРИЛОЖЕНИЯХ только при "ОТКЛЮЧЕНИИ" блока "Установка/Удаление"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить русификатор ${PRODUCT_NAME}.lnk" "$INSTDIR\unrus.exe"

  SetAutoClose false
SectionEnd

Section Uninstall
  Delete "$INSTDIR\1.txt"
  SetShellVarContext all
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Открыть 1.txt.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Удалить русификатор ${PRODUCT_NAME}.lnk"
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus"
  delete "$INSTDIR\unrus.exe"
  SetAutoClose false
SectionEnd


Соберите инсталлятор по этому примеру и проверьте. У меня на виртуальной оси Windows 8.1 ярлык деинсталлятора исправно создается. Проверить на реальной системе нет возможности, но думаю там также должен создаваться. Если у вас и после этого не будет работать, то тогда я не знаю, больше ничем помочь не могу, идеи все закончились. :)

Цитата:

Цитата alexfinik
Не понимаю что значит Invalid command: dialogsEx::FileBox »

Не установлен плагин DialogsEx

Kopejkin 24-03-2014 20:15 2328045

Flix, спасибо за терпение и советы.
Но.. не работает.
Тренируюсь тоже на виртуалке, причем специально установил 8.1 (до этого стояла 8).
Буду считать, что у других ярлык будет создаваться или откажусь от создания ярлыка в Установке/Удалении :sorry:

MKN 25-03-2014 15:05 2328378

Обновился AccessControl plug-in Version: 1.0.8.0 (24th March 2014)
http://nsis.sourceforge.net/AccessControl_plug-in

Flix 25-03-2014 16:08 2328404

Цитата:

Цитата Kopejkin
Но.. не работает. »

Kopejkin, озвученная вами проблема все таки имеет место на системах Windows 8/8.1. Установил на виртуалку второй системой Windows 8.1 64-бит. Запустил инсталлятор и... ярлыка деинсталляции на экране "Приложения" не обнаружил. Начал разбираться и выяснил вот что. Ярлык к файлу деинсталляции исправно создается, но Windows по неясным причинам, примерно через 10-15 секунд по завершении установки, в свойствах ярлыка самовольно меняет рабочий каталог файла деинсталляции. Первоначально там указан верный каталог, как и создал его инсталлятор (С:\Programs Files\...) но по истечении указанного промежутка времени путь волшебным образом меняется на С:\Programs Files (x86)\... В чем причина такого поведения системы - не знаю. Но побороть это можно установкой для файла ярлыка атрибута "только для чтения". Тогда Windows ничего не сможет сделать с ярлыком и он будет исправно отображаться на экране "Приложений". Вот сценарий, в котором добавлены соответствующие команды:
читать дальше »
Код:

########## ПРИМЕР ##############

!define PRODUCT_NAME "FolderSizes 7"
!define PRODUCT_VERSION ".0.56"
!define BRANDING "PUPKIN"

SetCompressor /SOLID lzma

!include MUI.nsh
!include x64.nsh      ; поддержка 64-бит систем
!include Logiclib.nsh  ; расширенная поддержка логики

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

!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

!insertmacro MUI_LANGUAGE "Russian"

Name "${PRODUCT_NAME}"
Caption "Установка русификатора ${PRODUCT_NAME}${PRODUCT_VERSION}"
UninstallCaption "Удаление русификатора ${PRODUCT_NAME}${PRODUCT_VERSION}"
OutFile "rus.${PRODUCT_NAME}${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES\Key Metric Software\${PRODUCT_NAME}\"
RequestExecutionLevel admin
ShowInstDetails show
ShowUninstDetails show
BrandingText "${BRANDING}"

Function .onInit
  ${If} ${RunningX64}
    SetRegView 64
    StrCpy $INSTDIR "$PROGRAMFILES64\Key Metric Software\${PRODUCT_NAME}\"
  ${Else}
    MessageBox MB_OK|MB_ICONSTOP "Только для х64!" IDOK
    Quit
  ${EndIf}
FunctionEnd

Function un.onInit
  ${If} ${RunningX64}
    SetRegView 64
  ${EndIf}
FunctionEnd

Section "-MainSection"

  SetOutPath "$INSTDIR"
  File /r "1.txt"
  WriteUninstaller "$INSTDIR\unrus.exe"
  ; блок Установка/Удаление программм
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayName" "${PRODUCT_NAME}${PRODUCT_VERSION}. Удалить русификатор"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "UninstallString" "$INSTDIR\unrus.exe"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayVersion" "1.0"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "Publisher" "© Pupkin, 03/2014"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "DisplayIcon" "$INSTDIR\unrus.exe"
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "NoModify" 0x00000001
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus" "NoRepair" 0x00000001

  SetShellVarContext all
  ; Ярлыки в меню Пуск - Программы
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  ; в Win8 этот ярлык виден в ПРИЛОЖЕНИЯХ в ЛЮБОМ случае
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Открыть 1.txt.lnk" "$INSTDIR\1.txt"
  ; в Win8 этот ярлык виден в ПРИЛОЖЕНИЯХ только при "ОТКЛЮЧЕНИИ" блока "Установка/Удаление"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить русификатор ${PRODUCT_NAME}.lnk" "$INSTDIR\unrus.exe"

  ; Устанавливаем для ярлыка атрибут "только для чтения"
  SetFileAttributes "$SMPROGRAMS\${PRODUCT_NAME}\Удалить русификатор ${PRODUCT_NAME}.lnk" READONLY

  SetAutoClose false
SectionEnd

Section Uninstall
  Delete "$INSTDIR\1.txt"

  ; Снимаем с файла ярлыка атрибут "только для чтения", чтобы его можно было удалить
  SetFileAttributes "$SMPROGRAMS\${PRODUCT_NAME}\Удалить русификатор ${PRODUCT_NAME}.lnk" NORMAL

  SetShellVarContext all
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Открыть 1.txt.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Удалить русификатор ${PRODUCT_NAME}.lnk"
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}rus"
  delete "$INSTDIR\unrus.exe"
  SetAutoClose false
SectionEnd


wolkow70 26-03-2014 09:45 2328704

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

MKN 26-03-2014 10:24 2328719

Цитата:

Цитата wolkow70
в NSIS создать ярлык сразу с правами администратора »

С помощью ShellLink plug-in http://nsis.sourceforge.net/ShellLink_plug-in
С помощью громозды из кода : http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag
С помощью правки HEX в самом ярлыке (придётся править заранее, т.к. внятного NSIS кода для этого, пока нет... )
С помощью изменения данных в реестре для запуска конкретной программы (это не оч корректно, но можно... )

wolkow70 26-03-2014 10:33 2328728

MKN,
Первые два варианта понравились. Работает.

MKN 28-03-2014 10:38 2329666

Определение у пользователя прав администратора :

Код:

OutFile "Admin_privileges.exe"
Section
  System::Call "kernel32::GetModuleHandle(t 'shell32.dll') i .s"
  System::Call "kernel32::GetProcAddress(i s, i 680) i .r0"
  System::Call "::$0() i .r0"
  IntCmp $0 1 +3
  MessageBox MB_OK "Требуются права администратора для запуска этой установки"
  Abort
SectionEnd


alexfinik 03-04-2014 17:57 2332659

Оффтоп, но http://nsis.sourceforge.net/ не пашет, да? У меня на всех устройствах белый экран. При том, что домен 2го уровня работает.

Kopejkin 04-04-2014 10:26 2332909

Цитата:

Цитата alexfinik
...не пашет »

А что вы там хотели открыть? Ссылка на страничку загрузки NSIS выглядит немного иначе.

kotkovets 04-04-2014 13:46 2332984

Цитата:

Цитата alexfinik
Оффтоп, но http://nsis.sourceforge.net/ не пашет, да? »

у меня вчера не работала ссылка, сейчас нормально

alexfinik 04-04-2014 18:15 2333114

Друзья, а какие-либо массивы работают в не unicode версии? Смотрю, что стандартные версии известных скриптов выдают ошибку. Можно, конечно, написать разработчику, только, сдается, через год он мне и ответит:).

Либо вопрос, какие zip плагины работают в unicode версии? zipdll у меня не заработал там в этот раз, когда я начал ковыряться в своём:( коде

точнее это не работает в Unicode
Код:

ZipDLL::extractall "$6" "$INSTDIR\distr"
Про массив, единственное, что не выдает ошибок при компиляции у меня - это http://myweb.tiscali.co.uk/imker/downloads/Array.zip

версия 2.46 Ansi

alexfinik 04-04-2014 19:20 2333143

Упс-упс-упс. Простите, установил 3.0, оказывается... Совсем сырая, видать. С установкой 2.46 проблемы исчезли.

MaGoth 05-04-2014 15:02 2333429

Привет народ... :)

Цитата:

Цитата Kopejkin
Подскажите, как в инсталляторе отобразить еще одну страничку, не обязательно после странички с лицензионным сообщением, в которой текст из rtf/txt файла будет отображен на том языке, который был выбран в начале установки, т.е. подобно странице лицензии? Создавать кастомную страницу или можно обойтись штатными средствами? »

Уже ранее ответили, но возможно кому пригодится и такой вариант решения:
http://forum.ru-board.com/topic.cgi?...5&start=900#19

Собственно мои вопросы, шарился по справке но что-то не нашел, или не там искал..
1. Как изменить дату создания файла (при компилировании этого файла после отработки программы), на нужную, т.е. автоматически назначаемую системную дату, изменить на требуемую.. Желательно с примерчиком.

2. Пока сижу на NSIS ANSI/UTF 2.46.5(с приблудами от Victor_VG), имеет ли смысл перебираться на тройку последней версии?!

Были ли решены где-либо извечные проблемы:
- исчезновение иконки и панели свойств файла по ПКМ(при достижении файлом размера свыше ~350 Мб);
- ограничение размерности файла инсталлятора на выходе в 2 ГБ.
?! :clever-ma

Спасибо.


Цитата:

Цитата alexfinik
.. установил 3.0, оказывается... Совсем сырая, видать. С установкой 2.46 проблемы исчезли. »

Сижу пока на 2.46.5, подумал было перебираться выше, но что-то уже мало радует сия софтинка...

Flix 05-04-2014 19:40 2333562

Цитата:

Цитата MaGoth
Как изменить дату создания файла »

Есть консольная утилита timestomp, которая позволяет изменять время и дату создания файла (см. WIKI).

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

Код:

// Изменение временных атрибутов файла инсталляции
// ${NSISDIR}\Bin\timestomp.exe - путь размещения и имя утилиты
// "%1" - вместо этой переменной будет поставлено имя файла инсталлятора
// -z - опция утилиты timestomp.exe (см. справку)
// "Saturday 10/08/2005 2:02:02 PM" - желаемая дата и время

!finalize '"${NSISDIR}\Bin\timestomp.exe" "%1" -z "Saturday 10/08/2005 2:02:02 PM"'

Изменения в версии 3.0 на сегодня по сравнению с декабрьским релизом (англ. язык):
читать дальше »
r6457
Store datablock optimizer statistics as UINT64 in case the same large file is added many times
---------------------
r6456
!system decodes child output as OEMCP if GetConsoleOutputCP() == GetOEMCP(), this should help bug #1092 (or fix it completely?)
---------------------
r6455
Adding the same file twice can push cur_datablock over the 2GB limit because datablock_optimize() happens too late. Try to find a dupe early.
---------------------
r6454
Clarify the difference between the LANGFILE and LANGFILE_EXT macros.
---------------------
r6453
CreateShortCut > CreateShortcut
---------------------
r6452
Added CreateShortcut /NoWorkingDir optional parameter
---------------------
r6451
Fix bug #1088 and try even harder by using substring if possible
---------------------
r6450
Don't store wide and narrow versions of the same error string
---------------------
r6449
Print error when ExeHeadStringList::find is unable to convert to narrow string
---------------------
r6448
lstrcpy is overkill there
---------------------
r6447
Make sure SYSSTRUCT pointer members are correctly aligned for x64
---------------------
r6446
Don't list /amd64-unicode in !addplugindir help (makensis win32)
---------------------
r6445
Added P<, P<=, P=, P<>, P>= and P> LogicLib ptrdiff_t tests
---------------------
r6444
Basic AMD64 System::Call support
---------------------
r6443
Fixed some warnings
---------------------
r6442
Prevent MSVC 14.00.40310 from generating a recursive call to memset
---------------------
r6441
Calculate ctlcolors64 offset correctly
---------------------
r6440
DistributeInclude for plugins even when not building ANSI plugins
---------------------
r6439
Basic Win64 support (MSVC)
---------------------
r6438
Added Int32/64/Ptr helper macros to Util.nsh
---------------------
r6437
Fix GCC zip2exe/zlib z_crc_t type mismatch warning
---------------------
r6436
more conversion warning fixes
---------------------
r6435
fix gcc warning
---------------------
r6434
avoid warnings about stdcall being ignored
---------------------
r6433
and fix vc build too now... meh
---------------------
r6432
fixed build with mingw on ubuntu 64-bit
---------------------
r6431
Incorrect NSIS version in welcome text and MUI is not new
---------------------
r6430
Fixed winchar tests
---------------------
r6429
arg name is s not str
---------------------
r6428
mstoolkit.py now supports MSVC_USE_SCRIPT=None to import VC and SDK paths from environment variables
---------------------
r6427
POSIX fixes for native and crossplatform utils
---------------------
r6426
those are not available on mingw for whatever reason...
---------------------

Судя по переписке разработчиков, в версии 3.0 присутствуют определенные проблемы, которые еще не решены. Они рекомендуют для ответственных проектов пользоваться версией 2.46.

MaGoth 05-04-2014 20:38 2333596

Цитата:

Цитата Flix
Есть консольная утилита timestomp, которая позволяет изменять время и дату создания файла (см. WIKI). »

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

Спасибо. :)

MaGoth 05-04-2014 22:25 2333650

Flix,

Об читался весь, об смотрелся и на тестился, не хотит эта сволочь фурычить, мысли какие есть ?!
запускал так:

Код:

...
  SetOutPath "$TEMP\${MOD_NAME_BASE} Installation"
  nsExec::Exec '"$TEMP\${MOD_NAME_BASE} Installation\timestomp.exe" "$INSTDIR\data\fonts.VDF" -z "Tuesday 13/02/2001 17:46:44 PM"'
  Pop $0
...

Пробовал прописывать тонну разных вариантов кавычек, как и запуск проги из того-же каталога где создается файл, также с разными кавычками и параметрами запуска... Ее окно видно что запускается и даже что-то там пишет.. но дата как стояла текущая системная так и стоит... :dont-know

Flix 06-04-2014 00:09 2333685

MaGoth, а как у вас с правами доступа к файлу? А может в это время данный файл занят другим процессом? У меня все работает. Вот смотрите простенький пример. Сделали пустой документ RTF (License.rtf). Сделали для него инсталлятор. После завершения установки изменяем его временную метку.
читать дальше »
Код:

Name "DataTimeStamp Change"
OutFile "DTSC.exe"
InstallDir "$PROGRAMFILES\TESSST"
XPStyle on

Section
SetOutPath $INSTDIR
File License.rtf
SectionEnd

Function .onInit
        InitPluginsDir
        SetOutPath $PLUGINSDIR
        # распаковываем утилиту timestomp.exe во временную папку плагинов
        File "${NSISDIR}\Bin\timestomp.exe"
FunctionEnd

Function .onInstSuccess
        # после успешной установки файлов, меняем времменную метку файла
        nsExec::ExecToStack '"$PLUGINSDIR\timestomp.exe" "$INSTDIR\License.rtf" -z "Saturday 10/08/2005 2:02:02 PM"'
FunctionEnd

Function .onGUIEnd
        # при закрытии инсталлятора удаляем утилиту из временной папки
        Delete "$PLUGINSDIR\timestomp.exe"
FunctionEnd


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

MaGoth 07-04-2014 13:33 2334200

Цитата:

Цитата Flix
MaGoth, а как у вас с правами доступа к файлу? А может в это время данный файл занят другим процессом? У меня все работает. Вот смотрите простенький пример. Сделали пустой документ RTF (License.rtf). Сделали для него инсталлятор. После завершения установки изменяем его временную метку.
читать дальше » »

Да, вроде все с правами админа, хотя, толком эту тему не ковырял ибо не доводилось использовать...
Может саму утилиту запускать с правами админа, вопрос только, как ?

Цитата:

Цитата Flix
Попробуйте свою задачу разбить на отдельные узлы. Отладьте каждый из узлов, удостоверьтесь, что он выполняет возложенную на него функцию. А потом сведите все в окончательный файл сценария. Возможно инсталлятор нужно запускать с правами Администратора или делегировать эти полномочия на файл утилиты timestomp.exe.[/post]

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

В логе постоянно выводятся ерроры по параметрам даты:
Error: When in the PM you must have an hour value between 1 and 12, inclusive.
Error: ParseDateTimeInput failed.

Вот и понять не могу, это в коде проги косяки, или происходит из-за использования Юникодного Нсис, может прогу как-то иначе запускать под ним нужно?
В справках и прочем ни какого толкового описания не нашел... :dont-know


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

nsExec::ExecToStack '"..\timestomp.exe" "..\Pupkin.txt" -z "Неделя мм/дд/гг ч:м:с PM"'

При этом:
- для значения месяца указывать только от 1 до 12 без нулей.
- для значения часа с параметром РМ, указывать только от 1 до 12

Потом еще массово за тестирую...

alexfinik 07-04-2014 15:48 2334275

kotkovets, http://www.markelov.net/articles.php?lng=ru&pg=39 ссылка нерабочая

Друзья, я нашёл кучу всего на форуме про кодировку, но что-то ничего не работает, что пробовал. Кто-то приводил пример наподобие MultiLanguage.nsi - у меня не заработал

Решил перейти на ANSI NSIS с UNICODE, ибо тут больше плагинов работает, чем там. Например авторизация с последующим скачиванием с ftp. Вот только не решил вопрос с русским языком, а в мануалах ничего подобного не нашел.

Киньте ссылку, если у кого-нибудь есть, пожалуйста!

MaGoth 07-04-2014 15:59 2334285

Цитата:

Цитата alexfinik
Друзья, я нашёл кучу всего на форуме про кодировку, но что-то ничего не работает, что пробовал. Кто-то приводил пример наподобие MultiLanguage.nsi - у меня не заработал »

Что именно делал что не работает? У меня все прекрасно работает... если нужно скину пример с используемыми языками...

Цитата:

Цитата alexfinik
Решил перейти на ANSI NSIS с UNICODE, ибо тут больше плагинов работает, чем там. Например авторизация с последующим скачиванием с ftp. Вот только не решил вопрос с русским языком, а в мануалах ничего подобного не нашел.
Киньте ссылку, если у кого-нибудь есть, пожалуйста! »

Что до кодировок, то если используешь языки со спец символами: немецкий - умлауты, испанский, польский чешский и румынский, то ни хрена из этого нормально отображаться в Анси коде не будет. Работает только в Юнике..
Авторизация тоже должна работать, если я правильно помню, а что за плагины юзал для фтп ?!

alexfinik 07-04-2014 17:01 2334321

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

Спасибо за отклик!!!
P.S. Мне только русский нужен

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

!include nsDialogs.nsh
!include LogicLib.nsh
!include zipdll.nsh
!include MUI2.nsh
!include NSISArray.nsh
!include defines.nsh
!include dialogs.nsh


alexfinik 07-04-2014 18:58 2334376

А код этот пробовал. Кажется он принадлежит kotkovets

Код:

!include "MUI2.nsh"
  Caption "MultiLanguage Modern UI Test"
  Name "MultiLanguage Test"
  OutFile "Test MultiLanguage.exe"
;--------------------------------
!define MUI_LANGDLL_ALLLANGUAGES
 !define MUI_WELCOMEPAGE_TITLE "$(WELCOMEPAGE_TITLE)"
 !define MUI_WELCOMEPAGE_TEXT "$(WELCOMEPAGE_TEXT)"
;--------------------------------
 !define MUI_FINISHPAGE_TITLE "$(FINISHPAGE_TITLE)"
 !define MUI_FINISHPAGE_TEXT "$(FINISHPAGE_TEXT)"
;--------------------------------
  !define MUI_COMPONENTSPAGE_SMALLDESC
;--------------------------------
  !insertmacro MUI_PAGE_WELCOME
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_PAGE_FINISH
;--------------------------------
  !insertmacro MUI_LANGUAGE "Russian" ;first language is the default language
  !insertmacro MUI_LANGUAGE "English"
  !insertmacro MUI_RESERVEFILE_LANGDLL
;--------------------------------
 Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
 FunctionEnd
;--------------------------------
 Section "$(NAME_SECTION)" SecDummy
    MessageBox MB_ICONINFORMATION|MB_OK "$(Text_MessageBox)"
 SectionEnd
 
;--------------------------------------------------------------------
;Текст описания странички приветствия
LangString WELCOMEPAGE_TITLE ${LANG_RUSSIAN} "ДОБРО ПОЖАЛОВАТЬ!"
LangString WELCOMEPAGE_TITLE ${LANG_ENGLISH} "WELCOME!"
LangString WELCOMEPAGE_TEXT ${LANG_RUSSIAN} "Это пример показывает как поместить свой текст описания в \
                                            зависимости от выбранного языка инсталлятора!$\r$\n$\r$\n$_CLICK"
LangString WELCOMEPAGE_TEXT ${LANG_ENGLISH} "This example shows how to put your text descriptions, \
                                            depending on the selected language installer!$\r$\n$\r$\n$_CLICK"
;--------------------------------------------------------------------
;Текст описания странички завершения
LangString FINISHPAGE_TITLE ${LANG_RUSSIAN} "ЭТО СТРАНИЦА ЗАВЕРШЕНИЯ!"
LangString FINISHPAGE_TITLE ${LANG_ENGLISH} "COMPLETION OF THIS PAGE!"
LangString FINISHPAGE_TEXT ${LANG_RUSSIAN} "Теперь вы знаете как поместить свой текст описания в \
                                            зависимости от выбранного языка установщика!$\r$\n$\r$\nНажмите кнопку $\"Готово$\" \
                                            для выхода из программы установки."
                                           
LangString FINISHPAGE_TEXT ${LANG_ENGLISH} "Now you know how to put your descriptive text depending on \
                                            the language of the installer!$\r$\n$\r$\nClick Finish to close this wizard."
;--------------------------------------------------------------------
;Текст сообщения
LangString TEXT_MESSAGEBOX ${LANG_RUSSIAN} "Выбран Русский язык установщика!$\r$\n ID языка: $LANGUAGE"
LangString TEXT_MESSAGEBOX ${LANG_ENGLISH} "The English language installer!$\r$\n ID language: $LANGUAGE"
;--------------------------------------------------------------------
;Текст названия(имя) секции
LangString SECTION ${LANG_RUSSIAN} "Русское описание секции"
LangString SECTION ${LANG_ENGLISH} "The English description of section"
;Текст описания секции
LangString NAME_SECTION ${LANG_RUSSIAN} "Это русское название секции"
LangString NAME_SECTION ${LANG_ENGLISH} "This is the english name of the section"
;Макрос, который показавает текст описания секции
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(SECTION)
!insertmacro MUI_FUNCTION_DESCRIPTION_END


MKN 09-04-2014 12:23 2335251

Цитата:

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

Наверняка можно API_шной функцией :
Код:

FileOpen $0 "$EXEDIR\file.exe" a
System::Call 'kernel32::SetFileTime(i, *l, *l, *l) i (r0, r1, r2, r3)'
FileClose $0

Только для этого, предварительно надо каким то образом создать стрктуру для даных времени... Может кто подскажет как ?
И ещё для этой задачи возможно подойдёт : http://nsis.sourceforge.net/Touch_File
если код подкорректировать не для текущей, а для назначаемой даты.

Mr.Evgen 09-04-2014 15:04 2335299

Всем привет. Не подскажите есть ли готовый скрипт инсталятор? Просто с нуля я врят ли напишу, а готовый я бы под себя переделал.

Kopejkin 09-04-2014 15:14 2335304

Цитата:

Цитата Mr.Evgen
есть ли готовый скрипт »

В Справочнике по NSIS - Статьи от hb860.

Flix 09-04-2014 17:25 2335362

Может кому-то будет интересно: NSIS 3.0 CVS 9.04.2014 Revision 6459

Обновился сегодня с сервера c исходниками NSIS и выполнил компиляцию с параметрами: NSIS_MAX_STRLEN=8192 и NSIS_CONFIG_LOG=yes.
Список обновлений по сравнению с декабрьским релизом я давал ранее (здесь).
Кто будет использовать, будьте внимательны, команда создания ярлыка CreateShortCut изменилась на CreateShortcut .

MKN 11-04-2014 15:15 2336280

Ещё раз об изменении/установки временных атрибутов файлов. Т.к. с чистым API не всё ясно, то при использовании плагина
http://nsis.sourceforge.net/Time_plug-in
всё предельно просто :
Код:

!include "Time.nsh"
OutFile "File_time_set_test.exe"

Section
; это для контроля :
${time::GetFileTime} "$EXEDIR\MyFile.exe" $0 $1 $2
MessageBox MB_OK 'Определяем дату GetFileTime$\n$$0={$0}$\n$$1={$1}$\n$$2={$2}'

MessageBox MB_OK 'Установим новую дату : $\nФайл Создан 01.10.2014 01:30:40$\nИзменён 02.11.2013 21:31:41$\nОткрыт 03.12.2012 22:32:49'
${time::SetFileTime} "$EXEDIR\MyFile.exe" "01.10.2014 01:30:40" "02.11.2013 21:31:41" "03.12.2012 22:32:49" $R0
SectionEnd


Mr.Evgen 13-04-2014 19:27 2337482

Здравствуйте. Я новичок. Нарисовал свою страницу в NSIS Form Designer, форма сохранилась в двух файлах. Как теперь показать её?

K.A.V. 13-04-2014 22:46 2337621

Цитата:

Цитата Mr.Evgen
NSIS Form Designer »

Совсем старенькая программка, как я понял - она помогает создавать INI файлы с параметрами страницы и элементов для использования с плагином InstallOptions

Цитата:

Цитата Mr.Evgen
Я новичок »

Справочнике по NSIS читали?
Вам сначала нужно выбрать, каким способом вы хотите создавать странички, в NSIS есть 2 разных плагина для этих целей.
1. Старый способ. InstallOptionsEx - чтобы создать страничку с использованием данного плагина вам необходимо сначала создать INI файл с параметрами странички и необходимыми элементами (что и делает ваша старенькая программка)

2. Новый способ. nsDialogs. Чтобы создать страничку с использованием данного плагина вам необходимо прописать команды на создание каждого элемента управления (текст, галочка и т.д.) в коде скрипта. В этом вам поможет NSIS Dialog Designer - NSIS

В справочнике есть примеры:
Обучение IO: собственные странички
Описания плагинов => nsDialogs: Создаем собственные страницы инсталлятора

Mr.Evgen 14-04-2014 12:53 2337820

K.A.V., Я сильно извиняюсь. Перепутал названия. Я начал использовать dialog designer. Справку читал. Я только не смог понять dialog designer создает два файла. Это их надо подключить к скрипту или нужно код который создает дизайнер скопировать в мой скрипт?

Спасибо с этим разобрался. Скопировал код из dialog designer в свой скрипт. Только почему-то к моей форме добавляется лишние кнопки снизу. Да и еще. Как можно моей форме задать размер?

alexfinik 16-04-2014 13:53 2338882

Друзья, может всё-таки кто-то знает почему данный код может не работать?

Вот сам программа

http://forum.oszone.net/post-2334376-1127.html

В логе компилятора смущают строки:
Код:

LangString: "WELCOMEPAGE_TITLE" 1049 "ДОБР*Рћ ПОЖАЛОВАТЬ!"
LangString: "WELCOMEPAGE_TITLE" 1033 "WELCOME!"
LangString: "WELCOMEPAGE_TEXT" 1049 "Р*то пример показывает как поместить СЃРІРѕР№ текст описания РІ зависимости РѕС‚ выбранного языка инсталлятора!

Весь лог компилятора такой:
Код:

MakeNSIS v2.46 - Copyright 1995-2009 Contributors
See the file COPYING for license details.
Credits can be found in the Users Manual.

Processing config:
Processing plugin dlls: "C:\Program Files (x86)\NSIS\Plugins\*.dll"
 - AdvSplash::show
 - Banner::destroy
 - Banner::getWindow
 - Banner::show
 - BgImage::AddImage
 - BgImage::AddText
 - BgImage::Clear
 - BgImage::Destroy
 - BgImage::Redraw
 - BgImage::SetBg
 - BgImage::SetReturn
 - BgImage::Sound
 - Dialer::AttemptConnect
 - Dialer::AutodialHangup
 - Dialer::AutodialOnline
 - Dialer::AutodialUnattended
 - Dialer::GetConnectedState
 - Dialogs::Author
 - Dialogs::Folder
 - Dialogs::InputBox
 - Dialogs::InputRegCode
 - Dialogs::Open
 - Dialogs::Save
 - Dialogs::Ver
 - InetLoad::load
 - InstallOptions::dialog
 - InstallOptions::initDialog
 - InstallOptions::show
 - LangDLL::LangDialog
 - Math::Script
 - NSISArray::ArrayCount
 - NSISArray::ArrayExists
 - NSISArray::Clear
 - NSISArray::Concat
 - NSISArray::Copy
 - NSISArray::Cut
 - NSISArray::Debug
 - NSISArray::Delete
 - NSISArray::ErrorStyle
 - NSISArray::Exists
 - NSISArray::ExistsI
 - NSISArray::FreeUnusedMem
 - NSISArray::Join
 - NSISArray::New
 - NSISArray::Pop
 - NSISArray::Push
 - NSISArray::Put
 - NSISArray::ReDim
 - NSISArray::Read
 - NSISArray::ReadToStack
 - NSISArray::Reverse
 - NSISArray::Search
 - NSISArray::SearchI
 - NSISArray::SetAutoReDim
 - NSISArray::SetSize
 - NSISArray::Shift
 - NSISArray::SizeOf
 - NSISArray::Sort
 - NSISArray::Splice
 - NSISArray::Subtract
 - NSISArray::Swap
 - NSISArray::Unshift
 - NSISArray::Write
 - NSISArray::WriteList
 - NSISArray::WriteListC
 - NSISList::Add
 - NSISList::All
 - NSISList::AllRev
 - NSISList::Append
 - NSISList::Clear
 - NSISList::Concat
 - NSISList::Copy
 - NSISList::Count
 - NSISList::Create
 - NSISList::Debug
 - NSISList::Delete
 - NSISList::Destroy
 - NSISList::Dim
 - NSISList::Exch
 - NSISList::First
 - NSISList::Get
 - NSISList::Index
 - NSISList::Insert
 - NSISList::Last
 - NSISList::Load
 - NSISList::Move
 - NSISList::Pop
 - NSISList::Reverse
 - NSISList::Save
 - NSISList::Set
 - NSISList::Sort
 - NSISList::Unload
 - NSISdl::download
 - NSISdl::download_quiet
 - Splash::show
 - StartMenu::Init
 - StartMenu::Select
 - StartMenu::Show
 - System::Alloc
 - System::Call
 - System::Copy
 - System::Free
 - System::Get
 - System::Int64Op
 - System::Store
 - TypeLib::GetLibVersion
 - TypeLib::Register
 - TypeLib::UnRegister
 - UserInfo::GetAccountType
 - UserInfo::GetName
 - UserInfo::GetOriginalAccountType
 - VPatch::GetFileCRC32
 - VPatch::GetFileMD5
 - VPatch::vpatchfile
 - ZipDLL::extractall
 - ZipDLL::extractfile
 - dialogsEx::FileBox
 - dialogsEx::FolderBox
 - dialogsEx::InputBox
 - dialogsEx::InputRegBox
 - inetc::get
 - inetc::head
 - inetc::post
 - inetc::put
 - nsArray::Clear
 - nsArray::Get
 - nsArray::Iterate
 - nsArray::Join
 - nsArray::Length
 - nsArray::Remove
 - nsArray::RemoveList
 - nsArray::Set
 - nsArray::SetList
 - nsArray::Sort
 - nsArray::Split
 - nsDialogs::Create
 - nsDialogs::CreateControl
 - nsDialogs::CreateItem
 - nsDialogs::CreateTimer
 - nsDialogs::GetUserData
 - nsDialogs::KillTimer
 - nsDialogs::OnBack
 - nsDialogs::OnChange
 - nsDialogs::OnClick
 - nsDialogs::OnNotify
 - nsDialogs::SelectFileDialog
 - nsDialogs::SelectFolderDialog
 - nsDialogs::SetRTL
 - nsDialogs::SetUserData
 - nsDialogs::Show
 - nsExec::Exec
 - nsExec::ExecToLog
 - nsExec::ExecToStack
 - nsResize::Add
 - nsResize::GetPos
 - nsResize::GetPosPx
 - nsResize::GetSize
 - nsResize::GetSizePx
 - nsResize::Set
 - nsResize::SetRTL
 - nsResize::Top

!define: "MUI_INSERT_NSISCONF"=""

Changing directory to: "D:\Desktop"

Processing script file: "D:\Desktop\testtest678.nsi"
!include: "C:\Program Files (x86)\NSIS\Include\MUI2.nsh"
!include: "C:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh"
NSIS Modern User Interface version 2.0 - Copyright 2002-2009 Joost Verburg (C:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh:8)
!define: "MUI_INCLUDED"=""
!define: "MUI_SYSVERSION"="2.0"
!define: "MUI_VERBOSE"="3"
!include: closed: "C:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh"
!include: closed: "C:\Program Files (x86)\NSIS\Include\MUI2.nsh"
Caption: "MultiLanguage Modern UI Test"
Name: "MultiLanguage Test"
OutFile: "Test MultiLanguage.exe"
!define: "MUI_LANGDLL_ALLLANGUAGES"=""
!define: "MUI_WELCOMEPAGE_TITLE"="$(WELCOMEPAGE_TITLE)"
!define: "MUI_WELCOMEPAGE_TEXT"="$(WELCOMEPAGE_TEXT)"
!define: "MUI_FINISHPAGE_TITLE"="$(FINISHPAGE_TITLE)"
!define: "MUI_FINISHPAGE_TEXT"="$(FINISHPAGE_TEXT)"
!define: "MUI_COMPONENTSPAGE_SMALLDESC"=""
!insertmacro: MUI_PAGE_WELCOME
!insertmacro: end of MUI_PAGE_WELCOME
!insertmacro: MUI_PAGE_COMPONENTS
!insertmacro: end of MUI_PAGE_COMPONENTS
!insertmacro: MUI_PAGE_INSTFILES
!insertmacro: end of MUI_PAGE_INSTFILES
!insertmacro: MUI_PAGE_FINISH
!insertmacro: end of MUI_PAGE_FINISH
!insertmacro: MUI_LANGUAGE
!insertmacro: end of MUI_LANGUAGE
!insertmacro: MUI_LANGUAGE
!insertmacro: end of MUI_LANGUAGE
!insertmacro: MUI_RESERVEFILE_LANGDLL
!insertmacro: end of MUI_RESERVEFILE_LANGDLL
Function: ".onInit"
!insertmacro: MUI_LANGDLL_DISPLAY
!insertmacro: end of MUI_LANGDLL_DISPLAY
FunctionEnd
Section: "$(NAME_SECTION)" ->(SecDummy)
MessageBox: 64: "$(Text_MessageBox)"
SectionEnd
LangString: "WELCOMEPAGE_TITLE" 1049 "ДОБР*Рћ ПОЖАЛОВАТЬ!"
LangString: "WELCOMEPAGE_TITLE" 1033 "WELCOME!"
LangString: "WELCOMEPAGE_TEXT" 1049 "Р*то пример показывает как поместить СЃРІРѕР№ текст описания РІ зависимости РѕС‚ выбранного языка инсталлятора!



$_CLICK"
LangString: "WELCOMEPAGE_TEXT" 1033 "This example shows how to put your text descriptions, depending on the selected language installer!



$_CLICK"
LangString: "FINISHPAGE_TITLE" 1049 "Р*РўРћ РЎРўР*РђРќР˜Р¦Рђ Р—РђР’Р•Р*РЁР•РќР˜РЇ!"
LangString: "FINISHPAGE_TITLE" 1033 "COMPLETION OF THIS PAGE!"
LangString: "FINISHPAGE_TEXT" 1049 "Теперь вы знаете как поместить свой текст описания в зависимости от выбранного языка установщика!



Нажмите кнопку "Готово" для выхода из программы установки."
LangString: "FINISHPAGE_TEXT" 1033 "Now you know how to put your descriptive text depending on the language of the installer!



Click Finish to close this wizard."
LangString: "TEXT_MESSAGEBOX" 1049 "Выбран Р*СѓСЃСЃРєРёР№ язык установщика!

 ID языка: $LANGUAGE"
LangString: "TEXT_MESSAGEBOX" 1033 "The English language installer!

 ID language: $LANGUAGE"
LangString: "SECTION" 1049 "Р*СѓСЃСЃРєРѕРµ описание секции"
LangString: "SECTION" 1033 "The English description of section"
LangString: "NAME_SECTION" 1049 "Р*то СЂСѓСЃСЃРєРѕРµ название секции"
LangString: "NAME_SECTION" 1033 "This is the english name of the section"
!insertmacro: MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro: end of MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro: MUI_DESCRIPTION_TEXT
!insertmacro: end of MUI_DESCRIPTION_TEXT
!insertmacro: MUI_FUNCTION_DESCRIPTION_END
!insertmacro: end of MUI_FUNCTION_DESCRIPTION_END

Processed 1 file, writing output:
Adding plug-ins initializing function... Done!
Processing pages... Done!
Removing unused resources... Done!
Generating language tables... Done!

Output: "D:\Desktop\Test MultiLanguage.exe"
Install: 5 pages (320 bytes), 1 section (1048 bytes), 437 instructions (12236 bytes), 228 strings (4882 bytes), 2 language tables (636 bytes).
Datablock optimizer saved 23884 bytes (~27.0%).

Using zlib compression.

EXE header size:              49664 / 35840 bytes
Install code:                  4522 / 19498 bytes
Install data:                  14812 / 125732 bytes
CRC (0x1B4C6D77):                  4 / 4 bytes

Total size:                    69002 / 181074 bytes (38.1%)


Kopejkin 16-04-2014 18:00 2339013

Цитата:

Цитата alexfinik
почему данный код может не работать? »

Почему может не работать - не знаю, потому что код работает. (NSIS 3.02)
А лог компилятора такой:

Код:

Command line:
"C:\Program Files (x86)\NSIS\makensis.exe"  "C:\Users\Vadim\Desktop\new_dialog\02.nsi"

Processing config: C:\Program Files (x86)\NSIS\nsisconf.nsh
Processing script file: "C:\Users\Vadim\Desktop\new_dialog\02.nsi" (ACP)

Processed 1 file, writing output (x86-ansi):

Output: "C:\Users\Vadim\Desktop\new_dialog\Test MultiLanguage.exe"
Install: 4 pages (256 bytes), 1 section (16408 bytes), 431 instructions (12068 bytes), 1 string (7143 bytes), 2 language tables (636 bytes).
Datablock optimizer saved 4112 bytes (~5.9%).

Using zlib compression.

EXE header size:              49664 / 35840 bytes
Install code:                  5251 / 28759 bytes
Install data:                  15028 / 84244 bytes
CRC (0x5DF849B3):                  4 / 4 bytes

Total size:                    69947 / 148847 bytes (46.9%)


4eshireCat 16-04-2014 18:40 2339031

Цитата:

Цитата alexfinik
почему данный код может не работать? »

Скомпилировал в NSIS Unicode - вместо русского языка кракозябры, а вот в ANSI все отлично!

Limonica 16-04-2014 22:49 2339146

Исходные данные:
TXT файл с одной числовой строкой.

Задача:
Проверить есть ли запись в этом тестовом файле, если нет, то крутится в цикле ожидая появления.

Решение:
Вот собственно с решением трудновато, сталкивался кто нибудь из форумчан, с проверкой записи в файле?

K.A.V. 16-04-2014 23:50 2339176

Цитата:

Цитата Mr.Evgen
Только почему-то к моей форме добавляется лишние кнопки снизу »

Вы про кнопки "Назад", "Далее" и "Отмена"? Делайте скриншоты, телепатов здесь нет.
Цитата:

Цитата Mr.Evgen
Как можно моей форме задать размер? »

Ваша страничка помещается в диалог инсталлятора, изменить размер самого диалога нельзя, если я вас правильно понял...

Цитата:

Цитата Limonica
Задача:
Проверить есть ли запись в этом тестовом файле, если нет, то крутится в цикле ожидая появления.
Решение:
Вот собственно с решением трудновато, сталкивался кто нибудь из форумчан, с проверкой записи в файле? »

Ещё одно подтверждение того, что нет смысла тратить своё время на обновление справочника, ну не хочет никто читать всю информацию в нём, чтобы повышать свои знания в NSIS, пока не ткнёшь носом - не прочитаете.
Перевод справки NSIS => LineRead: читаем содержимое строки по номеру

Limonica 17-04-2014 07:31 2339222

K.A.V., с лету не нашел, онлайн общение всегда приятней ;) спасибо.

Limonica 17-04-2014 09:45 2339255

Исходные данные:
TXT файл с одной изменяющейся числовой строкой.

Задача:
Проверить есть ли числовая строка в этом тестовом файле, если нет, то крутится в цикле ожидая появления.

Решение:
Читаем строку, заносим в переменную, ну а дальше как сравнить появилось число или нет?

Цитата:

!include "Logiclib.nsh"

OutFile "line.exe"
SilentInstall silent
RequestExecutionLevel user
Section
${LineRead} "id.log" "1" $1

${If} $1 == "ID=(пусто)"
MessageBox MB_OK "$1 error"
${ElseIf} $1 == "ID=(какое то число)"
MessageBox MB_OK "$1 susses"
${EndIf}
SectionEnd
Такой код само собой не работает, знатоки прошу помощи!

Содержимое id.log:

Цитата:

ID=

или

ID=какое то число

Kopejkin 17-04-2014 10:08 2339266

Цитата:

Цитата Limonica
...с лету не нашел »

Тогда хватит летать! Идите на посадку и не спеша начинайте читать:
Цитата:

Цитата K.A.V.
Перевод справки NSIS => LineRead: читаем содержимое строки по номеру »

Там же:
Справочник NSIS -> Примеры кодов -> Работа со строками;
Справочник NSIS -> Примеры кодов -> Замена строки в текстовом файле;
Попробуйте подогнать под свои цели. А не получится - неработающий код сюда.
По крайней мере, так будет более понятно, что вы хотели сделать.

K.A.V. 17-04-2014 10:12 2339269

Цитата:

Цитата Limonica
Такой код само собой не работает, знатоки прошу помощи! »

Ну, само собой...В переменную заносится значение всей строки целиком, это же не параметр в секции INI файла, чтобы сразу прочиталось то, что идёт после знака "="
Следовательно, вам нужно самому фильтровать строку и вытаскивать значение из строки.

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

Имеем: строку вида "ID=какое то число"
Вопрос: как получить значение, которое идёт после символа "="
Ответ: вспоминаем стандартную и простую команду StrCpy (описание есть в справочнике)
В нашем случае мы используем её для отсеивания первых трёх символов строки, чтобы получить значение "типа параметра ID"
Код:

${LineRead} "id.log" "1" $1
 StrCpy $1 "$1" "" 3

Пример функции, которая ждёт появления в значении вашей строки числа 687
Код:

Function LineReadFunc
start:
Sleep 1000
 ${LineRead} "id.log" "1" $1
 StrCpy $1 "$1" "" 3
 StrCmp $1 "" start 0
 StrCmp $1 "687" 0 start
 MessageBox MB_OK|MB_ICONINFORMATION "Число 687 появилось, конец функции"
FunctionEnd


Kopejkin 17-04-2014 10:26 2339281

Не в тему, но давно хотел спросить о работе текстового редактора форума.

Почему при редактировании сообщения слетает форматирование?

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

Отправляю такое:



Если хочу отредактировать, то в расширенном редакторе вижу уже такое :lamer:



K.A.V. 17-04-2014 10:33 2339290

Цитата:

Цитата Kopejkin
Не в тему »

Вам в раздел О сайте и форуме

Цитата:

Цитата Kopejkin
Почему при редактировании сообщения слетает форматирование? »

У меня проблем нет. Opera 12.16

kotompazb 18-04-2014 08:17 2339869

Здравствуйте.
Начал разбираться с NSIS и тут же уперся.
Банальная, думаю, задача.
Надо прочитать номер версии файла, поместить результат в name и в инсталлятор.

Делаю так:
Код:

!define PRODUCT_NAME "MyProg"
!define PRODUCT_PUBLISHER "MyCorp"
!define EXE_FULL_NAME "D:\4inst\prog.exe"
var PROD_VERSION

Name "${PRODUCT_NAME} v$PROD_VERSION"

...

VIProductVersion "1.0.0.0"
VIAddVersionKey "ProductName" "${PRODUCT_NAME}"
VIAddVersionKey "LegalCopyright" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "CompanyName" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "FileDescription" "${PRODUCT_NAME} ${PROD_VERSION}"
VIAddVersionKey "FileVersion" "1.0.0.0"

...

Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
  !include "FileFunc.nsh"
  ${GetFileVersion} "${EXE_FULL_NAME}" $R0
  StrCpy $PROD_VERSION $R0
FunctionEnd

Получаю очень неожиданный (для меня) результат: При установке все так как должно быть: "Вас приветствует мастер установки MyProg v1.0.0.0"... Однако, когда запускаешь деисталлятор, номер версии теряется: "Вы уверены в том, что желаете удалить MyProg v и все компоненты..."

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

K.A.V. 18-04-2014 08:44 2339876

Цитата:

Цитата kotompazb
Надо прочитать номер версии файла, поместить результат в name и в инсталлятор. »

Внешнего файла, не зависимого от пакета установки? И версию этого файла используете в инсталляторе/деинсталляторе как версию вашего устанавливаемого/удаляемого приложения?
Если да, то...зачем? Можно 1 раз указать версию файла в скрипте и потом использовать везде переменные
Код:

!define PRODUCT_VERSION "2.3.4.5"

VIProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey "ProductName" "${PRODUCT_NAME}"
VIAddVersionKey "LegalCopyright" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "CompanyName" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "FileDescription" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
VIAddVersionKey "FileVersion" "${PRODUCT_VERSION}"

Цитата:

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

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

kotompazb 18-04-2014 09:10 2339884

Цитата:

Цитата K.A.V.
Внешнего файла, не зависимого от пакета установки? И версию этого файла используете в инсталляторе/деинсталляторе как версию вашего устанавливаемого/удаляемого приложения?
Если да, то...зачем? Можно 1 раз указать версию файла в скрипте и потом использовать везде переменные »

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

Цитата K.A.V.
Всё правильно, функция .onInit используется только при инициализации программы установки, чтобы прописать команды в функцию инициализации программы удаления, используйте функцию un.onInit, т.е. в вашем случае вам нужно продублировать функцию .onInit и присвоить второй функции имя un.onInit »

Вот за это спасибо. Так и знал, что ошибка где-то на поверхности.

K.A.V. 18-04-2014 10:40 2339906

Цитата:

Цитата kotompazb
получится неизменный скрипт. »

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

Код, который вы прописали, будет срабатывать тогда, когда пользователь запустит ваш пакет инсталлятора, соответственно, исходя из вашего кода, ваш пакет инсталлятора при запуске будет читать версию файла по пути "D:\4inst\prog.exe", это есть изначальный баг вашего кода, т.к. данного файла у пользователя на компе просто напросто не будет. Если же вы распаковали указанный файл и потом проверяете его версию - другой разговор.
А судя по вашему текущему коду, у меня складывается такое впечатление, будто вы думаете, что в процессе создания EXE-файла пакета инсталлятора версия указанного файла "зашивается" в код вашего пакета инсталлятора и запоминается - это не так.

kotompazb 18-04-2014 11:10 2339914

Цитата:

Цитата K.A.V.
Код, который вы прописали, будет срабатывать тогда, когда пользователь запустит ваш пакет инсталлятора, соответственно, исходя из вашего кода, ваш пакет инсталлятора при запуске будет читать версию файла по пути "D:\4inst\prog.exe", это есть изначальный баг вашего кода, т.к. данного файла у пользователя на компе просто напросто не будет. »

Факт же. Вывод: ночью надо спать. А нет ли какого-то способа сохранить версию, в процессе создания инсталятора все-таки?

K.A.V. 18-04-2014 11:31 2339923

Цитата:

Цитата kotompazb
А нет ли какого-то способа сохранить версию, в процессе создания инсталятора все-таки? »

Можно вот так сделать:
Прописываем полный путь к файлу, у которого будет определяться версия
В константу PRODUCT_VERSION (в коде при необходимости использовать как ${PRODUCT_VERSION}) будет помещена версия файла в формате X.X.X.X
Также будет автоматически генерироваться имя выходного файла с версией в формате "setup_X.X.X.X.exe" и информация о версии файла инсталлятора (в коде выделено жирным)

Код:


!getdllversion "C:\Users\APTEM\Desktop\TEST.exe" expv_
!define PRODUCT_VERSION "${expv_1}.${expv_2}.${expv_3}.${expv_4}"



; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "Моя программа"
!define PRODUCT_PUBLISHER "Моя компания, LLC."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

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

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

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; 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 ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup_${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES\Моя программа"
ShowInstDetails show
ShowUnInstDetails show

VIProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey "ProductName" "${PRODUCT_NAME}"
VIAddVersionKey "LegalCopyright" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "CompanyName" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "FileDescription" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
VIAddVersionKey "FileVersion" "${PRODUCT_VERSION}"



Section "MainSection" SEC01
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\uninst.exe"


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


alexfinik 22-04-2014 17:54 2341632

Цитата:

Цитата 4eshireCat
Р*то РїСЂ »

может наоборот? У меня ровно наоборот.
У вас 32бита винда.Может у меня проблема из-за 64бита?

4eshireCat 22-04-2014 21:03 2341695

Цитата:

Цитата alexfinik
может наоборот? У меня ровно наоборот.
У вас 32бита винда.Может у меня проблема из-за 64бита? »

Винда у меня тоже 64. Работаю с NSIS 3.0a2, но перепроверил также на v.2.46 - все именно так, как я писал ранее. В ANSI компилируется нормально, в Unicode вместо русского - "иероглифы". Разрядность ОС тут не при чем - на х86 результат аналогичный. Так что в чем тут дело мне не известно... Возможно у вас что-то с кодировками в системе напутано, т.к. даже моя цитата в вашем сообщении выглядит весьма загадочно :)
Попробуйте скомпилить под виртуалкой или на другом компе.

wolkow70 25-04-2014 12:54 2342861

Товарищи, кто-нибудь знает как при выполнении функции замены фразы в текстовом файле (StrFunc.nsh) сделать так, что бы временный файл для обработки создавался не в папке с самим инсталлятором, а в другом месте, например во временной папке $TEMP?
Выполняются команды:
StrCpy $_FindInFile '' ; Заменяем строки в этом файле
StrCpy $_LineReplace '' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '' ; На что будем заменять
Call ReplaceLinesInFile

K.A.V. 25-04-2014 13:31 2342878

Цитата:

Цитата wolkow70
Товарищи, кто-нибудь знает как при выполнении функции замены фразы в текстовом файле (StrFunc.nsh) сделать так, что бы временный файл для обработки создавался не в папке с самим инсталлятором, а в другом месте, например во временной папке $TEMP? »

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

Код:


var /global _EXEDIR
StrCpy "$_EXEDIR" "$EXEDIR"
StrCpy "$EXEDIR" "$TEMP"


 StrCpy $_FindInFile '' ; Заменяем строки в этом файле
 StrCpy $_LineReplace '' ; Ищем и заменяем ЭТУ строку
 StrCpy $_LineToInsert '' ; На что будем заменять
 Call ReplaceLinesInFile

StrCpy "$EXEDIR" "$_EXEDIR"


wolkow70 25-04-2014 13:49 2342890

Цитата:

Цитата K.A.V.
Перед вызовом функции замены фразы подмените значение переменной $EXEDIR »

Да, работает. Хотя, странно, ведь в самом хедере StrFunc.nsh переменная $EXEDIR не встречается в функциях...

kotkovets 25-04-2014 14:47 2342905

Цитата:

Цитата wolkow70
$EXEDIR не встречается в функциях. »

Цитата:

Цитата K.A.V.
StrCpy "$EXEDIR" "$TEMP" »

StrFunc.nsh использует переменную $TEMP, перед началом значение "$EXEDIR" копируется в перемееную $TEMP
c ней то и работает StrFunc - а значение $TEMP уже подкорректировано.. перед использованием

Limonica 27-04-2014 14:59 2343757

Задача, проверить по какому интерфейсу раздаётся интернет и вывести MessageBox:

Цитата:

ethernet

wrisless

mobile
Как можно реализовать?

MKN 27-04-2014 17:04 2343797

Limonica,
Цитата:

Цитата Limonica
по какому интерфейсу раздаётся интернет »

http://nsis.sourceforge.net/IpConfig...orkAdapterType
http://nsis.sourceforge.net/IpConfig...erConnectionID
http://msdn.microsoft.com/en-us/library/aa394216.aspx

Limonica 28-04-2014 10:28 2344034

А как однозначно проверить входит ПК в домен или нет, и вывести MessageBox:

Цитата:

ПК состоит в домене Domain.

ПК не состоит в домене.

MKN 28-04-2014 11:19 2344054

Цитата:

Цитата Limonica
А как однозначно проверить входит ПК в домен или нет, и вывести MessageBox: »

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

outfile GetComputerNameEx_test.exe
; http://msdn.microsoft.com/en-us/library/ms724301.aspx
Section
System::Call 'kernel32.dll::GetComputerNameExA(i 4, t .r0,*i ${NSIS_MAX_STRLEN} r1)i.r2'
MessageBox MB_OK "$0"

;will get you in $0 the ComputerNamePhysicalNetBIOS. Or just follow the enumeration:

; ComputerNameNetBIOS 0
; ComputerNameDnsHostname 1
; ComputerNameDnsDomain 2
; ComputerNameDnsFullyQualified 3
; ComputerNamePhysicalNetBIOS 4
; ComputerNamePhysicalDnsHostname 5
; ComputerNamePhysicalDnsDomain 6
; ComputerNamePhysicalDnsFullyQualified 7
SectionEnd

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

ps Ранее я ещё приводил пример :

Функция NetWkstaGetInfo возвращает информацию о конфигурации рабочей станции (имени домена, локального компьютера, информацию о OC)
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Код:

Outfile "NetWkstaGetInfo_test.exe"

Section
System::Call  "netapi32::NetWkstaGetInfo(i0, i100, *i r0 r0) i.r6"
System::Call  "*$0(i.r1, w.r2, w.r3, i.r4, i.r5)"
MessageBox MB_OK "$2 $3 domain (platform_id $1 - ver $4.$5) "
System::Call  "netapi32::NetApiBufferFree(*i r0) i.r6"
; 500 - The Windows NT platform *  http://msdn.microsoft.com/en-us/library/windows/desktop/aa371402(v=vs.85).aspx
SectionEnd


silione 28-04-2014 12:17 2344071

Давно не следил за темой и извиняюсь заранее если такой вопрос уже обсуждался.

После выхода новой версии появилась ли возможность создавать пакеты размером больше 2Gb или NSIS все еще на это не способна?

MKN 28-04-2014 12:37 2344086

Цитата:

Цитата silione
появилась ли возможность создавать пакеты размером больше 2Gb »

судя по последним обсуждениям этого вопроса - нет... http://forums.winamp.com/showthread.php?t=376132
Хотя в то же время в анонсе : Installers can be as large as 2GB http://www.filehorse.com/download-nsis/
Только, по моему, создавать такие огромные NSIS инсталляторы - верх извращения. Почему бы не манипулировать из скрипта , отдельным архивом любого типа и размера ? И практично и удобно...

MKN 30-04-2014 13:14 2345175

Иногда после запуска-закрытия приложения, остаётся висеть его процесс или даже появляются несколько его одинаковых дублей-процессов ( после нескольких запусков-закрытий ).
Причины такого размножения в данном моменте не столь существенны, но надо закрыть-убить ВСЕ эти возникшие процессы, количество которых заранее не известно и не предсказуемо. Каким образом это лучше сделать в NSIS ?
Например, вижу в диспетчере задач - 10 процессов App.exe. Хочу запустить скрипт, убивающий на раз всю эту ораву клонов...

Begin2Fly 30-04-2014 13:41 2345188

Цитата:

Цитата MKN
Иногда после запуска-закрытия приложения, остаётся висеть его процесс или даже появляются несколько его одинаковых дублей-процессов ( после нескольких запусков-закрытий ).
Причины такого размножения в данном моменте не столь существенны, но надо закрыть-убить ВСЕ эти возникшие процессы, количество которых заранее не известно и не предсказуемо. Каким образом это лучше сделать в NSIS ?
Например, вижу в диспетчере задач - 10 процессов App.exe. Хочу запустить скрипт, убивающий на раз всю эту ораву клонов... »

PHP код:

!include "nsProcess.nsh"

loop:
${
nsProcess::FindProcess"App.exe" $R0
StrCmp $R0 0 0 
+4
${nsProcess::KillProcess"App.exe" $R0
Sleep 100
Goto loop 

Циклом?

MKN 30-04-2014 16:25 2345233

Цитата:

Цитата Begin2Fly
Циклом? »

Цикл напрашивается само собой... Только в ситуации, когда при запущенном App.exe , погасив один процессс возникает тут же следующий - сработает ли цикл ? Надо проверить...
(В моём случае, прога постоянно запускает процесс модуля соединения с интернетом, при его отсутствии - не успеваю закрывать процессы. Потому и нужен технологический скрипт "убийства" этого безобразия )

K.A.V. 30-04-2014 16:34 2345236

MKN, тебя как-будто подменили, ей богу, сначала о вопросе, который есть в справочнике (Примеры кодов => Работа с процессами), а теперь ещё и это :)

Цитата:

Цитата MKN
при запущенном App.exe, который в свою очередь генерит бесконечно дубли, сработает ли цикл ? »

В чем проблема в oninit прописать самопроверку? По процессу/мютексу (уже обсуждалось) и просто прекращать запуск...С NSIS ты вроде не первый день работаешь, думаю код набросаешь сам ;)

MKN 30-04-2014 16:52 2345243

Цитата:

Цитата K.A.V.
По процессу/мютексу (уже обсуждалось) и просто прекращать запуск... »

Вот не пришло в голову и всё... :)
Цитата:

Цитата K.A.V.
С NSIS ты вроде не первый день работаешь »

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

BuZzOFF 06-05-2014 09:57 2347653

Цитата:

Цитата kotkovets
подправил winver2.nsh»

Как скачать? Пишет: "Nothing found".

Begin2Fly 06-05-2014 10:19 2347664

BuZzOFF, http://rghost.ru/54979826

kotkovets 06-05-2014 15:21 2347789

Добавил в шапку: Определение всех ОС WINDOWS (winver2.nsh) >> Расширение функциональности

Limonica 07-05-2014 21:25 2348523

Задача, вывести MessageBox "WinName" - "WinType" или "WinServerName" если эта серверная ОС, в примере неправильный вывод, где то нарушена логика, прошу совета.

Цитата:

!include "WinVer2.nsh"
OutFile "WinGetVerInfo.exe"
Caption WinGetVerInfo

Function .OnInit
${WinName} $3
${WinType} $4
StrCmp $4 "" 0 +3
MessageBox MB_OK "$4"
${WinServerName} $4

MessageBox MB_OK "Win = $3 $4"
Quit
FunctionEnd

Section
SectionEnd

K.A.V. 07-05-2014 22:00 2348532

Цитата:

Цитата Limonica
Задача, вывести MessageBox "WinName" - "WinType" или "WinServerName" если эта серверная ОС »

Код:

Function .OnInit
 ${WinName} $3
 ${WinType} $4
 ${WinServerName} $5
 StrCmp $5 "" +2 0
 MessageBox MB_OK|MB_ICONINFORMATION "Серверная ОС: $5" idok +2
 MessageBox MB_OK "Win = $3 ($4)"
 Quit
FunctionEnd


Limonica 08-05-2014 13:41 2348828

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

!include "WinVer2.nsh"
OutFile "WinGetVerInfo.exe"
Caption WinGetVerInfo

Function .OnInit

nsExec::exec 'calc.exe'

  ${WinName} $3
  ${WinType} $4
  ${WinServerName} $5

MessageBox MB_OK "$3 $4$5"

FunctionEnd

Section
SectionEnd

В вывод добавляется 0, можно как то это дело исправить?

Код:

---------------------------
WinGetVerInfo
---------------------------
WinXP Professional0
---------------------------
OK 
---------------------------

Код:

---------------------------
WinGetVerInfo
---------------------------
Server 2012 R2 0Server Standard
---------------------------
ОК 
---------------------------


K.A.V. 08-05-2014 13:56 2348836

Цитата:

Цитата Limonica
В вывод добавляется 0, можно как то это дело исправить? »

Так удалите с конца 1 символ в строке командой StrCpy (описание есть в справочнике) :)

Либо просто определяйте ОС до выполнения команды с плагином, на переменные вы не жадный же? ;)
Код:

Function .OnInit
  ${WinName} $3
  ${WinType} $4
  ${WinServerName} $5
 
nsExec::exec 'calc.exe'

MessageBox MB_OK "$3 $4$5"

FunctionEnd


kotkovets 08-05-2014 16:32 2348914

Цитата:

Цитата Limonica
Спасибо за пример, при дальнейшем копании выяснилось, что winver2.nsh конфликтует с nsExec плагином »

НЕ конфликтует, плагин оставляет после себя в стеке код возврата, поэтому нужно извлекать код и "очищать"
в доках пишут то так:
Код:

nsExec::exec 'calc.exe'
pop $0


Flix 12-05-2014 12:41 2350333

NSIS v3.0 перешла из стадии альфа в стадию бета. Новости здесь. Загрузить релиз можно с оффсайта. Отчеты об ошибках сообщаем на форум NSIS.

K.A.V. 12-05-2014 13:23 2350347

Цитата:

Цитата Flix
NSIS v3.0 перешла из стадии альфа в стадию бета »

Отлично, значит проект реально проснулся, как и наш справочник :)

Поставил, будем обкатывать, пока что после первых компиляций заметил уменьшение размера всех выходных файлов по сравнению с 3.0a1
В Release notes как-то мало инфы по мелким изменениям даже, как-будто ничего не делали

MKN 17-05-2014 11:57 2352411

Расшарить папку и задать права доступа можно с помощью такого кода :

Код:

;создать общий ресурс с полным доступом для всех

outfile "NetShareAdd.exe"
!include "LogicLib.nsh"

# Definitions and user flags
  !define STYPE_DISKTREE                  0
  !define ACCESS_READ                    0x01
  !define ACCESS_WRITE                    0x02
  !define ACCESS_CREATE                  0x04
  !define ACCESS_EXEC                    0x08
  !define ACCESS_DELETE                  0x10
  !define ACCESS_ATRIB                    0x20
  !define ACCESS_PERM                    0x40
  !define ACCESS_ALL                      0x7F

# Permissions
  !define GENERIC_READ                    0x80000000
  !define GENERIC_WRITE                  0x40000000
  !define GENERIC_EXECUTE                0x20000000
  !define GENERIC_ALL                    0x10000000
  !define NO_INHERITANCE                  0x0
  !define SECURITY_DESCRIPTOR_REVISION    1

# ACCESS_MODE values
  !define NOT_USED_ACCESS                      0
  !define GRANT_ACCESS                          1
  !define SET_ACCESS                            2
  !define DENY_ACCESS                          3
  !define REVOKE_ACCESS                        4
  !define SET_AUDIT_SUCCESS                    5
  !define SET_AUDIT_FAILURE                    6

# MULTIPLE_TRUSTEE_OPERATION values
  !define NO_MULTIPLE_TRUSTEE                  0
  !define TRUSTEE_IS_IMPERSONATE                1

# TRUSTEE_FORM values
  !define TRUSTEE_IS_SID                        0
  !define TRUSTEE_IS_NAME                      1
  !define TRUSTEE_BAD_FORM                      2
  !define TRUSTEE_IS_OBJECTS_AND_SID            3
  !define TRUSTEE_IS_OBJECTS_AND_NAME          4

# TRUSTEE_TYPE values
  !define TRUSTEE_IS_UNKNOWN                    0
  !define TRUSTEE_IS_USER                      1
  !define TRUSTEE_IS_GROUP                      2
  !define TRUSTEE_IS_DOMAIN                    3
  !define TRUSTEE_IS_ALIAS                      4
  !define TRUSTEE_IS_WELL_KNOWN_GROUP          5
  !define TRUSTEE_IS_DELETED                    6
  !define TRUSTEE_IS_INVALID                    7
  !define TRUSTEE_IS_COMPUTER                  8

# Structure Definitions
  !define strSHARE_INFO_2 '(w,i,w,i,i,i,w,w)i'  ;This can be done with the above code by using the SHARE_INFO_2 structure.
  !define strSHARE_INFO_502 '(w,i,w,i,i,i,w,w,i,i)i'
  !define strEXPLICIT_ACCESS '(i,i,i,i,i,i,i,i)i'

!macro CreateNewFullShare SHARENAME SHARE_TYPE SHARE_COMMENT SHARE_PERMISSIONS MAX_USERS CURRENT_USES SHARE_PATH SHARE_PASS
  System::Call /NOUNLOAD '*${strSHARE_INFO_2}("${SHARENAME}",${SHARE_TYPE},"${SHARE_COMMENT}",${SHARE_PERMISSIONS},${MAX_USERS},${CURRENT_USES},"${SHARE_PATH}","${SHARE_PASS}")i.R0'
  System::Call /NOUNLOAD 'netapi32::NetShareAdd(, i 2, i R0, *i .R1) i .r1'
  ${If} $1 <> 0
  MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST 'There was an error creating the share!'
  ${EndIf}
  System::Free $R0
!macroend

Section
;!insertmacro CreateNewFullShare "Share Name" ${STYPE_DISKTREE} "Share Description" 0 -1 0 "X:\<folder_to_share>" ""
!insertmacro CreateNewFullShare "Temp" ${STYPE_DISKTREE} "Share Description" 0 -1 0 "C:\Temp" ""
SectionEnd

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

Удалить шару :

Код:

outfile "NetShareDel.exe"
!include "LogicLib.nsh"

!macro RemoveShare SHARENAME
  System::Call /NOUNLOAD 'netapi32::NetShareDel(, w "${SHARENAME}",i 0) i .r1'
  ${If} $1 <> 0
    MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST 'There was an error removing the share!"'
  ${EndIf}
!macroend

Section
;!insertmacro RemoveShare "ShareName"
!insertmacro RemoveShare "Temp"
SectionEnd

Работает на Win XP и Win 7 (на 8 не проверял)

Awral 21-05-2014 00:42 2353821

Как запустить ExecWait в режиме SILENT?

kotkovets 21-05-2014 01:04 2353824

Цитата:

Цитата Awral
Как запустить ExecWait в режиме SILENT? »

в этом плаге, режим зависит от самого приложения... есть через апи код (если нужно, пороюсь выложу)
есть плаги:
http://nsis.sourceforge.net/ExecCmd_plug-in
http://nsis.sourceforge.net/ExecDos_plug-in

MKN 21-05-2014 11:31 2353923

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

Код:

OutfFle "NetGetJoinInformation.exe"

;http://msdn.microsoft.com/en-us/library/windows/desktop/aa370423(v=vs.85).aspx

Section
System::Call 'Netapi32::NetGetJoinInformation(w "", *i.r0,*i.r1)i.r2'
System::Call '*$0(&w1024.r3)'
System::Call 'Netapi32::NetApiBufferFree(ir0)'
Messagebox MB_OK "NETSETUP_JOIN_STATUS=$1 Name=$3"

;NETSETUP_JOIN_STATUS=(NetSetupUnknownStatus,NetSetupUnjoined,NetSetupWorkgroupName,NetSetupDomainName);

;NetSetupUnknownStatus = 0 - The status is unknown  * Статус не определён
;NetSetupUnjoined = 1 - The computer is not joined  *  Отсутствует соединение компьютера
;NetSetupWorkgroupName = 2 - The computer is joined to a workgroup * Компьютер присоединен к рабочей группе
;NetSetupDomainName = 3 - The computer is joined to a domain * Компьютер присоединен к домену
SectionEnd


Awral 21-05-2014 20:20 2354104

Цитата:

Цитата kotkovets
в этом плаге, режим зависит от самого приложения... есть через апи код (если нужно, пороюсь выложу) »

Мне нужно запустить .bat файл в тихом (silent) режиме. Когда-то это делал, но сейчас забыл как. Вроде указывал /SILENT. Но строчка ниже не работает - окна всё равно видны.
Код:

ExecWait '"$INSTDIR\batch.bat" /SILENT'

K.A.V. 21-05-2014 21:30 2354128

Цитата:

Цитата Awral
Но строчка ниже не работает - окна всё равно видны. »

Так читать нужно Справочник по NSIS

Вам же выше ответили...
Цитата:

Цитата kotkovets

Либо можете воспользоваться плагином nsExec, его описание есть в нашем справочнике:
Описание плагинов => nsExec: запуск консольных утилит

Код:

nsExec::Exec '"$INSTDIR\batch.bat"'
Pop $0


MKN 22-05-2014 16:09 2354414

Цитата:

Цитата kotkovets
есть через апи код »

Наверное это такой код ? :

Запуск (в данном примере, батника) с скрытым окном консоли
Код:

outfile WinExec_test.exe

Section
System::Call 'kernel32.dll::WinExec(t "$EXEDIR\My.bat", i 0) i.r0'
SectionEnd

( циферка в функции i 0 - указывает на стиль отображения/поведения окна. В нашем случае - SW_HIDE = 0
Ессно указываем стиль, необходимый для конкретной задачи)

То, что запуск скрытый и работает, можно легко проверить, использовав, к примеру, My.bat с содержанием
@echo off > TEST_file.txt
После запуска скрипта, по-тихому будет создан файл TEST_file.txt

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

System::Call 'shell32::ShellExecuteA(i 0, t "Open", t "My.bat", i 0, t "$EXEDIR", i 0) i r1'

Otlanta 27-05-2014 22:03 2356489

MKN, а этот способ:
Код:

System::Call 'kernel32.dll::WinExec(t "$EXEDIR\My.bat", i 0) i.r0'
Запуск с ожиданием завершения или нет?

Задача №2: проверить домен на доступность.
Реализация: ?

MKN 28-05-2014 10:58 2356709

Цитата:

Цитата Otlanta
Запуск с ожиданием завершения или нет? »

Нет, ожидание в этой функции (в чистом виде) не предусмотрено...

Про проверку доступности домена , не знаю... Что конкретно ("технически") предполагается проверять ?

Otlanta 29-05-2014 10:09 2357151

А какое отличие ansi проекта от unicode?

Otlanta 29-05-2014 11:10 2357175

kotkovets, в Unicode проекте не правильно работает WinVer2.nsh как минимум на Windows XP, nsis 3.0b0

AlekseyPopovv 10-06-2014 11:49 2362398

Как привязать реестр к выбору языка?

!include "MUI.nsh"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "English"

WriteRegStr HKCU "Software\QWERTY" "Language" "Russian"
WriteRegStr HKCU "Software\QWERTY" "Language" "Ukrainian"

MKN 10-06-2014 13:12 2362429

Цитата:

Цитата AlekseyPopovv
Как привязать реестр к выбору языка? »

А что именно привязать ? Обычно делают типа такого :
Код:

;Remember the installer language
!define MUI_LANGDLL_REGISTRY_ROOT HKLM
!define MUI_LANGDLL_REGISTRY_KEY "Software\App\Option"
!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallerLanguage"
;!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"
 
ReadRegStr $R0 HKLM "Software\App\Option" "InstallerLanguage"
StrCmp $R0 "1049" RussianLanguage
StrCmp $R0 "1033" EnglishLanguage


AlekseyPopovv 10-06-2014 14:24 2362461

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

MKN 10-06-2014 15:11 2362484

Цитата:

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

Тогда вообще просто, если выбран язык такой то - делаем то то (пишем в реестр и т.д.). Наводка в коде : http://nsis.sourceforge.net/Examples/languages.nsi
или со своим сообщением
http://stackoverflow.com/questions/1...in-oninit-mui2
или делаем свою страничку с выбором языка и последующей логикой

K.A.V. 10-06-2014 15:28 2362493

Цитата:

Цитата AlekseyPopovv
Мне нужно что бы при запуске программы вылазило окошко с выбором языка интерфейса »

Пишите сразу, что у вас уже есть в коде, чего нет, чтобы у вас не переспрашивали и не писали лишнюю инфу

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

!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "English"

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

  !insertmacro MUI_LANGDLL_DISPLAY
Цитата:

Цитата AlekseyPopovv
Какой язык пользователь выберет »

ID выбранного языка (обратите внимание, ID, а не имя языка) хранится в переменной $Language

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

\Program Files\NSIS\contrib\Language files\Russian.nlf
В начале файла увидите примерно такое содержимое:
Цитата:

# Header, don't edit
NLF v6
# Language ID
1049

# Font and size - dash (-) means default
-
-
Можно завести отдельную переменную и вручную назначить имя языка в зависимости от ID, пример:
Код:

Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
MessageBox MB_OK|MB_ICONINFORMATION "Выбран язык (ID): $Language"
Var /global Lang
StrCmp $Language "1049" 0 +2
 StrCpy $Lang "Russian"
StrCmp $Language "1033" 0 +2
 StrCpy $Lang "English"
MessageBox MB_OK|MB_ICONINFORMATION "Выбран язык: $Lang"
quit
FunctionEnd

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

Код:

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "Моя программа"
!define PRODUCT_PUBLISHER "Моя компания, LLC."

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

; MUI Settings
!define MUI_ABORTWARNING

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
!insertmacro MUI_PAGE_INSTFILES

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

; MUI end ------

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

Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
MessageBox MB_OK|MB_ICONINFORMATION "Выбран язык (ID): $Language"
Var /global Lang
StrCmp $Language "1049" 0 +2
 StrCpy $Lang "Russian"
StrCmp $Language "1033" 0 +2
 StrCpy $Lang "English"
MessageBox MB_OK|MB_ICONINFORMATION "Выбран язык: $Lang"
quit
FunctionEnd



Section "MainSection" SEC01
SectionEnd


AlekseyPopovv 10-06-2014 16:39 2362530

K.A.V., вот что получилось:
Прога не запустилась. Что ещё необходимо? Ваш код вставил полностью.

MKN 10-06-2014 16:43 2362531

AlekseyPopovv,
Попробуй предельно упрощённый код :
Код:

OutFile "Select LANG_ID.exe"
!include MUI2.nsh
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"

Function .onInit
 !insertmacro MUI_LANGDLL_DISPLAY
 StrCpy $R9 $language
 MessageBox MB_OK "ID выбранного языка : $R9"
FunctionEnd

Section
SectionEnd


AlekseyPopovv 10-06-2014 16:53 2362534

MKN, тоже самое почти, но программа уже запустилась.
Надо создать как то эту страничку, а как понятия не имею.

K.A.V. 10-06-2014 17:13 2362545

Цитата:

Цитата AlekseyPopovv
Прога не запустилась. Что ещё необходимо? Ваш код вставил полностью. »

Прочитать Справочник по NSIS необходимо, вам за вас писать тут ничего не будет, если сами не имеете желания познавать NSIS
Когда будете понимать значение команд и что в них написано (как в моём примере команда закрытия инсталлятора, т.к. это всего-лишь пример)
А что вам ещё необходимо от этого примера? Я дал вам пример кода и предоставил вам информацию, по аналогии которой можете сделать связь других языков с их ID...

Код:

Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
MessageBox MB_OK|MB_ICONINFORMATION "Выбран язык (ID): $Language"
Var /global Lang
StrCmp $Language "1049" 0 +2
 StrCpy $Lang "Russian"
StrCmp $Language "1033" 0 +2
 StrCpy $Lang "English"
MessageBox MB_OK|MB_ICONINFORMATION "Выбран язык: $Lang"
quit
FunctionEnd

quit - команда закрытия инсталлятора
может, так всегда новичков проверять, читали они справочник перед заходом в эту тему или нет? :biggrin:

тогда и перестаните писать подобные предложения
Цитата:

Цитата AlekseyPopovv
Прога не запустилась »


MKN 13-06-2014 17:00 2363678

Озадачился вроде как простым вопросом - как на кастомной странице изменить цвет текста в поле чекбокса ?
(${NSD_CreateCheckbox} 25u 80u 150u 10u "цвет текста")
Через SetCtlColors меняется почему то только цвет фона, на котором находится текст... И с прозрачностью пробовал играться... Без результата.
(Можно конечно рядом с чекбоксом просто поместить цветную Label-надпись, но это как то не правильно...)
Или я что то не так делаю ?

K.A.V. 14-06-2014 18:12 2364048

Цитата:

Цитата MKN
Или я что то не так делаю ? »

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

Даже в инсталле моего SFX Creator уже давно сделано так, как ты написал...
Цитата:

Цитата MKN
рядом с чекбоксом просто поместить цветную Label-надпись »

Может, можно как-то с WinAPI поиграться, dll и т.д., но...делать это вряд ли опять же кто-то захочет, разве что истинный программер на api набросает код :)

Flix 15-06-2014 01:23 2364168

Цитата:

Цитата MKN
Озадачился вроде как простым вопросом - как на кастомной странице изменить цвет текста в поле чекбокса ? ... Или я что то не так делаю ?»

Самый простой вариант - это отключить в сценарии поддержку стилей ХР: XPStyle off
Тогда для чекбокса сможете указывать командой SetCtlColors какой угодно цвет текста. :)

_ck 15-06-2014 12:16 2364223

Доброго времени суток! Подскажите,пожалуйста,почему в "Установке и удалении программ" (xp) или в "Программах и компонентах " (7) не отображается размер установленной программы? Имя,сайт,комментарий и т.д всё отображается,а размер нет.Просто пустое поле.Что нужно сделать?

K.A.V. 15-06-2014 12:42 2364229

Цитата:

Цитата _ck
Доброго времени суток! Подскажите,пожалуйста,почему в "Установке и удалении программ" (xp) или в "Программах и компонентах " (7) не отображается размер установленной программы? Имя,сайт,комментарий и т.д всё отображается,а размер нет.Просто пустое поле »

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Management\ARPCache\Имя_Раздела_в_Uninstall
где Имя_Раздела_в_Uninstall, имя вашего раздела в
Код:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Однако на Win7 почему-то не подхватывается данный параметр, поэтому для Windows 7 и выше помогает создание REG_DWORD параметра с именем EstimatedSize, значение данному параметру необходимо установить как размер установленной программы в килобайтах, например:

Код:

WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Имя_Раздела_в_Uninstall" "EstimatedSize" "900000"
где 900000 - размер программы в килобайтах

_ck 15-06-2014 13:50 2364238

Спасибо! Помогло! Теперь в и ХР и в 7 размер отображается корректно!

Скажите,а можно в элементе "text" разрешить ввод только латинских символов? Я знаю,есть флаг "OnlyNumbers",а нужно,чтобы можно было писать цифрами и английскими буквами.

K.A.V. 15-06-2014 14:36 2364252

Цитата:

Цитата _ck
Скажите,а можно в элементе "text" разрешить ввод только латинских символов? »

Можно написать код проверки с использованием команды StrFilter (описание есть в справочнике)
Если бы все подробно читали описание команд и знали их возможности, то таких бы вопросов не возникало :(

Код:

${StrFilter} "Артем 123 TEST" "2rus" "" "" $0
StrCmp $0 "" +3 0
MessageBox MB_OK|MB_ICONSTOP "'$0'$\nЕсть русские буквы"
abort

Артем 123 TEST
Строка, которую проверяем на наличие русских букв

2rus
Указываем команде, что нужно оставить только русские буквы в строке, если они есть, то в переменную $0 будут помещены только русские буквы, так мы проверим, есть ли в строке русские буквы

$0
Переменная, в которую поместятся русские буквы, если они есть в строке

После этого командой StrCmp (описание опять же, есть в справочнике) проверяем значение переменной, если в переменной пусто - русских символов нет в строке

_ck 15-06-2014 15:32 2364272

Ох спасибо огромное! Всё здорово работает! :up Русские буквы вычисляет как надо! :)

MKN 17-06-2014 11:42 2365087

Цитата:

Цитата Flix
отключить в сценарии поддержку стилей ХР: XPStyle off »

Действительно, так цвет текста работает, но только в классическом случае... А у меня фоном кастомной страницы - bmp изображение и этот номер не проходит...
При установке для фона текста - transparent - фон устанавливается стандартного цвета... Что можно сделать ?

Также интересует вопрос - как перетаскивать окно без заголовка ( с использованием плагина MoveAnywhere.dll ), если фон страницы - bmp изображение ? С таким фоном перетаскивание не работает...

4eshireCat 17-06-2014 12:46 2365119

Вложений: 1
Цитата:

Цитата MKN
Также интересует вопрос - как перетаскивать окно без заголовка ( с использованием плагина MoveAnywhere.dll ), если фон страницы - bmp изображение ? »

Вот накидал кое-что, попробуй (см. прикрепленный архив)
PS Закрытие окна Alt+F4

MKN 17-06-2014 12:53 2365124

4eshireCat,
Фон у меня почему то отсутствует. И перетаскивается только это :



ps разобрался, надо так :
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s'

А без interface.exe никак нельзя обойтись ?

4eshireCat 17-06-2014 13:08 2365129

Цитата:

Цитата MKN
А без interface.exe никак нельзя обойтись ? »

Обойтись можно, но выглядит коряво. Если покопаться и как-то настроить, может что-то и получится, но у меня сейчас со временем напряг. Пробуй! =)) А потом поделись тем, что получилось.

А мой скомпилированный экзешник работает?

MKN 17-06-2014 13:13 2365132

Цитата:

Цитата 4eshireCat
А мой скомпилированный экзешник работает? »

Да. Только фон появляется , если в скрипте изменить так :
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s'

зы без interface.exe можно, если :
nsDialogs::Create /NOUNLOAD 1044

4eshireCat 17-06-2014 13:19 2365136

Цитата:

Цитата MKN
Да. Только фон появляется , если в скрипте изменить так :
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s' »

Сорри, торопился, возможно в спешке что-то не вполне корректно указал, хотя у меня и с моим вариантом все прекрасно работает.
Однако главное, что в конце-концов все получилось!

Цитата:

Цитата MKN
зы без interface.exe можно, если :
nsDialogs::Create /NOUNLOAD 1044 »

Действительно. Спасибо, возьму на заметку!

Flix 17-06-2014 14:28 2365183

Вложений: 1
Цитата:

Цитата MKN
При установке для фона текста - transparent - фон устанавливается стандартного цвета... Что можно сделать ? »

Использовать плагин от Graphical Installer (см. вложение). Пример:
Код:

    ; ------------------- Checkbox 1 -----------------------
    ${NSD_CreateCheckbox} 25u 10u 70u 10u "Text Red Color"
    Pop $1
    # Устанавливаем цвет текста - красный, а цвет фона - прозрачный.
    SetCtlColors $1 0xFF0000 transparent
    # Задаем элементу дополнительные атрибуты стиля (прозрачность и поверх всех элементов)
    ${NSD_AddExStyle} $1 ${WS_EX_TRANSPARENT}|${WS_EX_TOPMOST}
    # При включенной поддержке стилей ХР, чтобы элемент принял заданные параметры,
    # для его обновления необходимо использовать метод SubclassCheckBox (используем плагин).
    GraphicalInstaller::SubclassCheckBox /NOUNLOAD $1

Аналогично для элемента RadioButton. Данная проблема связана с ограничениями библиотеки стилей Windows и средствами NSIS её не решить, по крайней мере простыми методами. Необходимо элементу Checkbox (RadioButton) назначить дополнительные атрибуты и перевести его в группу подкласса, отвязав от остальных элементов окна. После чего нарисовать его новой (сообщением WM_PRINT или нечто подобным). В общем это задача для тех, кто хочет попробовать свои силы в кодинге средствами WinAPI на движке NSIS. Для остальных - пользуемся готовыми решениями.

Otlanta 18-06-2014 12:03 2365617

Здравствуйте, нужно получить имя группы администраторов, как это правильно сделать?
Код:

System::Call 'netapi32::NetLocalGroupAddMembers

MKN 18-06-2014 13:03 2365655

Цитата:

Цитата Otlanta
нужно получить имя группы администраторов »

Можно командно, как рассказано здесь : http://forum.oszone.net/thread-136097.html
или, зная SID - Administrators S-1-5-32-544 , получить имя с помощью API (LookupAccountSid + ещё куча всего), а лучше с помощью http://nsis.sourceforge.net/UserMgr_plug-in
или переконвертировать SID с помощью vbs :
http://www.thescriptlibrary.com/Defa...ID+to+Username

Если кто захочет заморочиться с API, то код приблизительно такой и хорошо бы его "причесать" и под конкретику и для универсальности :
Код:

# allocate SID_IDENTIFIER_AUTHORITY
System::Call "*(&i1 0, &i4 0, &i1 5) i.r0"
# allocate SID  http://msdn.microsoft.com/en-us/library/windows/desktop/aa375213(v=vs.85).aspx
System::Call "advapi32::AllocateAndInitializeSid(i r0, i 1, i 20 , i 0, i 0, i 0, i 0, i 0, i 0, i 0, *i .r1)"
;System::Call "advapi32::AllocateAndInitializeSid(i r0, i 2, i 32, i 545, i 0, i 0, i 0, i 0, i 0, i 0, *i .r1)"
# free SID_IDENTIFIER_AUTHORITY
System::Free $0
# debug, see that the right SID was created
System::Call advapi32::ConvertSidToStringSid(ir1,*t.R0)
DetailPrint $R0
DetailPrint $2
# use SID to look-up account name  *  LookupAccountSid получает имя пользователя (группы) по заданному SID, а так же тип SID
 /*SidTypeUser = 1; // SID пользователя
 SidTypeGroup = 2; // группы
 SidTypeDomain = 3; // домена
 SidTypeAlias = 4; // встроенной группы
 SidTypeWellKnownGroup = 5; // стандартной группы
 SidTypeDeletedAccount = 6; // удаленной записи
 SidTypeInvalid = 7; // неверный SID
 SidTypeUnknown = 8; // неизвестный SID
 SidTypeComputer = 9; // SID компьютера
 SidTypeLabel = 10; // Обязательный SID ярлыка целостности*/

StrCpy $R0 ${NSIS_MAX_STRLEN}
System::Call "advapi32::LookupAccountSid(i 0, i r1, t .r0, *i R0, t .r2, *i R0, *i .r3)"
# free SID
System::Call "advapi32::FreeSid(i r1)"
# print result
DetailPrint $0
DetailPrint $2
DetailPrint $R1


Otlanta 18-06-2014 19:02 2365825

MKN, как получить имя группы S-1-5-32-544 с помощью LookupAccountSid, нужен пример кода...

Узнать имя группы администраторов и вывести в MessageBox


UserMgr плагин тоже не оперирует SID идетификаторами

MKN 19-06-2014 10:51 2366056

Otlanta,
Пример ведь дан. Используй в функции AllocateAndInitializeSid нужный SID, для твоего случая :
System::Call "advapi32::AllocateAndInitializeSid(i r0, i 2, i 32, i 544, i 0, i 0, i 0, i 0, i 0, i 0, *i .r1)"

MKN 20-06-2014 11:18 2366473

Оказывается есть интересный приём для перемещения окна за любую точку (без плагина)
Используется идея отслеживания нажатия ЛКМ и посыла соответствующего сообщения окну - ${WM_SYSCOMMAND} с похоже, что, не документированным параметром SC_MOVE 0xF011
( на http://msdn.microsoft.com/ru-RU/libr...(v=vs.85).aspx такого нет... )
Код:

!include MUI2.nsh
!insertmacro MUI_LANGUAGE "English"
Page custom nsDialogsPage
OutFile "MoveWindows.exe"

Function OnTimer
System::Call user32::GetKeyState(i1)i.r4
${If} $4 < 0
SendMessage $HWNDPARENT ${WM_SYSCOMMAND} 0xF011 0
${EndIf}
FunctionEnd

Function nsDialogsPage
nsDialogs::Create 1018
Pop $0
${NSD_CreateTimer} OnTimer 10
nsDialogs::Show
FunctionEnd

Section
SectionEnd


Otlanta 21-06-2014 18:21 2366938

winver2.nsh определяет редакцию Windows 8 Single Language:
Код:

Windows 8 Single Language
поправьте пожалуйста чтоб обрезало Windows 8




Так же не определяет редакцию Home Premium французкой Windows 7 64-bit, пустое значение.
Ещё просьба сохранять winver2.nsh в UTF-8. Спасибо за плагин

K.A.V. 23-06-2014 13:27 2367437

Цитата:

Цитата Otlanta
winver2.nsh определяет редакцию Windows 8 Single Language: »

Так и должно быть

Цитата:

Цитата Otlanta
поправьте пожалуйста чтоб обрезало Windows 8 »

Зачем? Чтобы реализовать хидер конкретно для вас? А если кому-то нужно будет, чтобы данная редакция определялась как положено, что, мы будем снова править хидер и так постоянно?

Что мешает вам добавить в ваш скрипт небольшой код, который будет сам обрезать строку после определения ОС?
Код:

${WinType} $1
StrCmp $1 "Windows 8 N" 0 +2
 StrCpy $1 "Windows 8"
StrCmp $1 "Windows 8 China" 0 +2
 StrCpy $1 "Windows 8"
StrCmp $1 "Windows 8 Single Language" 0 +2
 StrCpy $1 "Windows 8"

Цитата:

Цитата Otlanta
Так же не определяет редакцию Home Premium французкой Windows 7 64-bit, пустое значение. »

Насчет этого ничего не скажу, в хидере определение Home Premium версии прописано

Цитата:

Цитата Otlanta
Ещё просьба сохранять winver2.nsh в UTF-8 »

Аналогично с "Зачем? Чтобы реализовать хидер конкретно для вас?"
С текущим количеством текстовых редакторых с их возможностями, которые есть сейчас - думаю не проблема сохранить текстовый файл в другой кодировке

MKN 24-06-2014 15:42 2367918

COMPONENTSPAGE и PAGE_DIRECTORY на одной стандартной странице.

Такое сочетание более практично и удобно, чем раздельное листание страниц (хотя лучше это делать с помощью nsDialogs )

Код:

!AddPluginDir .
!include "MUI2.nsh"
!define SHACF_FILESYSTEM      0x00000001
!define EN_CHANGE            0x0300

Name "COMPONENTS_PAGE_DIRECTORY"
OutFile "COMPONENTS_PAGE_DIRECTORY.exe"
InstallDir $TEMP
ShowInstDetails show

!define MUI_COMPONENTSPAGE_NODESC
; correct modern_nodesc.exe
!define MUI_UI_COMPONENTSPAGE_NODESC myui.exe

!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirPageShow
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW HideBack
!insertmacro MUI_PAGE_LICENSE ${__FILE__} 
!define MUI_COMPONENTSPAGE_TEXT_INSTTYPE $(^DirBrowseText)
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ComPageShow
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Function DirPageShow
        FindWindow $1 "#32770" "" $HWNDPARENT
        System::Call User32::GetWindowLong(ir1,i4)i.R0
        SendMessage $HWNDPARENT 0x408 1 0
FunctionEnd

Function HideBack
        GetDlgItem $0 $HWNDPARENT 3
        ShowWindow $0 ${SW_HIDE}
FunctionEnd

Function ComPageShow
        FindWindow $1 "#32770" "" $HWNDPARENT
        GetFunctionAddress $0 onComPageCallback
    WndProc::onCallback /r=1 $1 $0
          GetDlgItem $0 $1 1001
        SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^BrowseBtn)"
        GetDlgItem $0 $1 1007
        SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^DirText)"
        GetDlgItem $0 $1 1020
        SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^DirSubText)"
        GetDlgItem $0 $1 1019
        SendMessage $0 ${WM_SETTEXT} 0 "STR:$INSTDIR"
        System::Call `shlwapi::SHAutoComplete(ir0,i${SHACF_FILESYSTEM})`
FunctionEnd

Function onComPageCallback
    ${If} $2 = ${WM_COMMAND}
    IntOp $5 $3 & 0x0000FFFF
    IntOp $6 $3 >> 16
    IntOp $6 $6 & 0x0000FFFF
    ${If} $6 = ${EN_CHANGE}
    ${AndIf} $5 = 1019
    System::Call User32::GetDlgItemText(ir1,i1019,t.d,i${NSIS_MAX_STRLEN})
    ${EndIf}
    System::Call User32::CallWindowProc(iR0,ir1,ir2,ir3,ir4)
        ${EndIf}
FunctionEnd

Section "Components" Main
SectionIn RO
SectionEnd

Section /o "Component1" Sec01
DetailPrint "Component 1"
SectionEnd

Section "Component 2" Sec02
DetailPrint "Component 2"
SectionEnd

myui.exe - подкорректированный modern_nodesc.exe
WndProc.dll - плагин

комплект во вложении :

MKN 25-06-2014 13:38 2368306

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

Функция SHFileOperation копирует, перемещает, переименовывает или удаляет объект в файловой системе.
Функция имеет единственный аргумент - структуру типа TSHFileOpStruct, в которой и передаются все необходимые данные.
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

В зависимости от установленных флагов, производятся нужные операции с файлами. К примеру :

переместить файлы из папки A в папку B и, если в папке B были одноимённые, файлы создать их копии в папке B

Код:

System::Call "*(i $HWNDPARENT, i 0x0001, t 'C:\A\*.*',t 'C:\B', i 0x0008|0x0400, i0,i0,i0,&t${NSIS_MAX_STRLEN} r0,&t1 0)i .r0"
    System::Call "shell32::SHFileOperation(i r0)i .r1"
    System::Free $0

FO_MOVE = 0x0001 Перемеcтить файлы
Для копирования установить флаг FO_COPY = 0x0002 Копировать файлы
FOF_RENAMEONCOLLISION = 0x0008 В случае, если файл с данным именем уже существует, создается файл с именем "Copy #N of..."

Наиболее известно применение этой функции для удаления пустых каталогов. Но бывает полезен и такой момент - удаление файлов в корзину.
Например, при деинсталляции приложения, бывает необходимо сохранить пользовательские данные-файлы (проекты, шаблоны, INI, xml-файлы настроек и т.д.)
И , даже если в Uninstaller_е предусмотрено соответсвующее сообщение, можно случайно пропустить его и удалить нужные файлы.. Тогда беда (для рядового пользователя,точно...)
Поэтому, есть смысл, удалять ответственные файлы в корзину, с помощью SHFileOperation.

Код:

    System::Call "*(i $HWNDPARENT, i 0x0003, t 'C:\A\*.*',t , i 0x0040|0x0010|0x0400, i0,i0,i0,&t${NSIS_MAX_STRLEN} r0,&t1 0)i .r0"
    System::Call "shell32::SHFileOperation(i r0)i .r1"
    System::Free $0

Здесь флаги :
FO_DELETE = 0x0003 - Удалить файлы
FOF_ALLOWUNDO = 0x0040 Удалить файлы в корзину.
FOF_NOERRORUI = 0x0400 - Не показывать сообщения об ошибках, которые могут возникнуть в течение процесса.
FOF_NOCONFIRMATION = 0x0010 Отвечает "yes to all" на все запросы в ходе операции, т.е. не спрашивать у пользователя подтверждения удаления.
если сообщение всё же желательно - этот флаг ессно не применяем

( Если надо удалить файлы вместе с папкой - не используем *.* )

MKN 26-06-2014 13:21 2368742

Интересен код использования функции BitBlt. Можно рисовать рядом с окном инсталлятора (или в любом другом месте экрана) изображения, например, для наглядной демонстрации, при выборе компонентов или выборе скинов , тем, шаблонов и т.д.
Код:

outfile BitBlt_test.exe

!define LR_LOADFROMFILE    0x0010
!define IMAGE_BITMAP        0
!define LR_CREATEDIBSECTION    0x00002000
Var hBitmap
Var hDC
Var hDCMem
Var oldObject
; Функция  BitBlt выполняет передачу битовых блоков данных о цвете, соответствующих прямоугольнику пикселей из заданного исходного контекста устройства
; в целевой контекст устройства.
; Растровая операция SRCCOPY 00CC0020  копирует исходный прямоугольник непосредственно в целевой прямоугольник
Section
StrCpy $0 $EXEDIR\vinni.bmp
  System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s'
Pop $hBitmap
  System::Call "user32::GetDC(i R1) i.s" 
Pop $hDC
  System::Call "gdi32::CreateCompatibleDC(i $hDC) i.s" 
Pop $hDCMem
  System::Call "gdi32::SelectObject(i $hDCMem, i $hBitmap) i.s"
Pop $oldObject
System::Call "gdi32::BitBlt(i $hDC, i 50, i 50, i 185, i 255, i $hDCMem, i 0, i 0, i 0x00CC0020) i.s"
 
System::Call "gdi32::BitBlt(i $hDC, i 50, i 450, i 185, i 255, i $hDCMem, i 0, i 0, i 0x00CC0020) i.s"
SectionEnd

Function .onGUIEnd
System::Call `gdi32::DeleteObject(i s)` $hBitmap
FunctionEnd

i 50, i 450, i 185, i 255 - координаты и размер BMP рисунка
Есть правда досадный момент - изображение почему то не разрушается при закрытии инсталлятора (хотя DeleteObject предусмотрен в .onGUIEnd )
И изображение можно разрушить любым помещённым на него объектом...
Может кто подскажет, как это устранить ?
Пример во вложении :

K.A.V. 26-06-2014 13:40 2368749

Цитата:

Цитата MKN
Есть правда досадный момент - изображение почему то не разрушается при закрытии инсталлятора (хотя DeleteObject предусмотрен в .onGUIEnd )
И изображение можно разрушить любым помещённым на него объектом...
Может кто подскажет, как это устранить ? »

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

Насчет разрушения не могу точно сказать, т.к. изображения сами разрушаются, но в описании DeleteObject сказано, что нужно передавать функции
Цитата:

A handle to a logical pen, brush, font, bitmap, region, or palette.
т.е. хэндл изображения, как я понимаю...
Код:

System::Call `gdi32::DeleteObject(i $hBitmap)`

MKN 26-06-2014 15:15 2368776

Цитата:

Цитата K.A.V.
так и должно быть? »

Вряд ли... Идея интересная, но уж больно тёмная реализация...

MKN 27-06-2014 11:50 2369085

Иногда желательно обратить внимание пользователя на какое-либо сообщение программы. Сделать это можно сопроводив сообщение звуковым сигналом встроенного PC speaker_а (Beeper_a)
и функций winmm или kernel32

Код:

OutFile "Beep_test.exe"
Section
System::Call 'winmm::PlaySound(i0x2A53,i,i0x110001)'
Sleep 1000
; В траве сидел кузнечик
System::Call 'kernel32::Beep(i 440,i 300) l'
System::Call 'kernel32::Beep(i 329,i 300) l'
System::Call 'kernel32::Beep(i 440,i 300) l'
System::Call 'kernel32::Beep(i 329,i 300) l'
System::Call 'kernel32::Beep(i 440,i 300) l'
System::Call 'kernel32::Beep(i 415,i 300) l'
System::Call 'kernel32::Beep(i 0,i 100) l'
System::Call 'kernel32::Beep(i 415,i 300) l'
SectionEnd

мелодию можно набрать любую из частот и длительностей нот

ps Ессно бипер должен физически присутствовать в ПК и быть включен в :

[HKEY_CURRENT_USER\Control Panel\Sound]
"Beep"="yes"

и в "Non Plug and Play Drivers"

MKN 01-07-2014 12:38 2370621

Есть полезный код, перечисляющий все дисковые устройства и их тип :

Код:

outfile GetLogicalDrives_GetDriveType.exe
!include LogicLib.nsh
ShowInstDetails show

Section
System::Call 'kernel32::GetLogicalDrives()i.r0'
StrCpy $2 0
StrCpy $4 65 ; 'A'
loop:
    IntOp $3 $0 & 1
    ${If} $3 <> 0
        IntFmt $3 "%c:\" $4
        System::Call 'kernel32::GetDriveType(tr3)i.r5'
DetailPrint "$3=$5"
        ${EndIf}
    IntOp $4 $4 + 1
    IntOp $0 $0 >> 1
StrCmp $0 0 "" loop
SectionEnd

Вопрос : каким образом занести в одну (или несколько) переменную - ВСЕ полученные в цикле, данные ? Ведь количество дисков не предсказуемо...

K.A.V. 01-07-2014 13:03 2370634

Цитата:

Цитата MKN
Вопрос : каким образом занести в одну (или несколько) переменную - ВСЕ полученные в цикле, данные ? »

Ты снова меня удивляешь простыми вопросами :)

Код:

Function .onInit

 call test
 MessageBox MB_OK|MB_ICONINFORMATION "$R0"

quit
FunctionEnd




Function test
StrCpy $R0 ""
System::Call 'kernel32::GetLogicalDrives()i.r0'
StrCpy $2 0
StrCpy $4 65 ; 'A'
loop:
    IntOp $3 $0 & 1
    ${If} $3 <> 0
        IntFmt $3 "%c:\" $4
        System::Call 'kernel32::GetDriveType(tr3)i.r5'
DetailPrint "$3=$5"
StrCpy $R0 "$R0 $3"
        ${EndIf}
    IntOp $4 $4 + 1
    IntOp $0 $0 >> 1
StrCmp $0 0 "" loop
FunctionEnd


MKN 01-07-2014 15:15 2370694

Цитата:

Цитата K.A.V.
удивляешь простыми вопросами »

Сам удивился... :) Делал почти то же самое, но досадно ошибся... Благодарствую.

Otlanta 11-07-2014 15:23 2375224

Всем привет, как определить дату модификации файла с помощью NSIS?

MKN 11-07-2014 15:44 2375238

Цитата:

Цитата Otlanta
как определить дату модификации файла с помощью NSIS? »

Можно с помощью http://nsis.sourceforge.net/Time_plug-in
или с помощью GetTime :
http://nsis.sourceforge.net/Docs/AppendixE.html#E.1.6

natasha_82 14-07-2014 20:48 2376502

Доброго времени суток
Прошу не судить строго, NSIS занимаюсь не очень давно.
Не могу найти ответ (хотя перечитала многое), на такой вопрос:
Можно ли на NSIS сделать инсталляцию (тихую), которая во время установки будет считывать данные с другого файла (т.е. exe одна, а в файле можно, например, изменить путь (или/и другие параметры) и при тихой инсталляции новый путь (параметры) будет учитываться (без пересборки exe))?
Нашла варианты считывания с .ini - но не подходит, т.к. считывает в момент сборки, и нет реакции если внести изменения((

profcom 14-07-2014 20:59 2376516

natasha_82, конечно можно и кстати с ini файлами как раз будет работать, просто не надо этот ini файл подключать в инсталятор, а считывать например из рядом лежащего файла:
Код:

ReadINIStr $0 "$EXEDIR\file.ini" "Section" "Param"
StrCpy $INSTDIR "$0"


K.A.V. 14-07-2014 21:05 2376518

natasha_82, больше конкретики, что имеем, какой формат файла, что нужно сделать (читать значение определённой строки в файле или читать значение параметра в INI файле), либо читать из ключа в реестре? Пишите конкретней, чтобы мы не давали вам размытые ответы, вроде вот этого :)

Справочник по NSIS читали, надеюсь?

Изменить путь установки можно в любом месте кода, достаточно присвоить перменной $INSTDIR нужный путь
Если меняете путь установки в silent архиве (тихая установка), то лучше всего менять путь установки в .onInit функции, например чтением из файла формата INI

Пример установки нового путя чтением из INI файла в момент запуска вашего установщика:
Код:

ReadINIStr $INSTDIR "$EXEDIR\settings.ini" "TEST" "InstDir"
MessageBox MB_OK "Новая директория установки: $INSTDIR"

Также могу сказать про то, что можно изменить путь установки, выполнив запуск вашего инсталлятора с ключем /D
Код:

installer.exe /D=C:\Program Files\Моя папка

Otlanta 15-07-2014 20:38 2376962

Всем привет, как перевести HeX значение в string?

K.A.V. 15-07-2014 21:14 2376985

Otlanta, с помощью плагина Registry?

Otlanta 15-07-2014 23:45 2377037

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

K.A.V. 16-07-2014 00:05 2377045

Цитата:

Цитата Otlanta
K.A.V., неа, почему то отображает не весь текст а лишь первое слово »

Я не знаю, что там у вас обрезается, в моём примере всё корректно отрабатывает

Попробуйте у себя проверить вот этот код:
Код:

${registry::HexToStr} "c5f1ebe820e2fb20f7e8f2e0e5f2e520fdf2eef220f2e5eaf1f22c20e7ede0f7e8f220e2fb20ebe3f3ed20e820e220e2e0f8e5ec20eaeee4e520e4eeeff3f9e5ede020eef8e8e1eae02120cff0e8e2e5f220eef2204b2e412e562e2c20f320eaeef2eef0eee3ee20e2f1b820f0e0e1eef2e0e5f220eff0e5eaf0e0f1edee203b29" $1
 MessageBox MB_OK|MB_ICONINFORMATION "$1"


MKN 16-07-2014 10:14 2377141

Цитата:

Цитата Otlanta
значение хекс достаточно длинное, есть ли альтернатива? »

http://nsis.sourceforge.net/Special_Builds
( nsis-2.46-strlen_8192 или nsis-3.0b0-strlen_8192 )

diakov 16-07-2014 17:09 2377278

Уважаемые, возможно ли сделать так что бы установщик переименовал сам себя? Например был файл скомпилированный в nsis file.exe после запуска он в той же директории переименовал себя в file1.exe и продолжал выполнять постановленные задачи?
Ну или как реализовать альтернативный вариант (более закрученый): установщик запущенный из одной директории, путь его расположения помещается в переменную, установщик копирует себя в папку скажем темп, по старому пути удаляется и продолжает выполнять задания по пути из переменной.
С первым пунктом можно сделать установщик в установщике, но хотелось бы проще.

K.A.V. 16-07-2014 21:40 2377345

Цитата:

Цитата diakov
Уважаемые, возможно ли сделать так что бы установщик переименовал сам себя? Например был файл скомпилированный в nsis file.exe после запуска он в той же директории переименовал себя в file1.exe и продолжал выполнять постановленные задачи?
Ну или как реализовать альтернативный вариант (более закрученый): установщик запущенный из одной директории, путь его расположения помещается в переменную, установщик копирует себя в папку скажем темп, по старому пути удаляется и продолжает выполнять задания по пути из переменной. »

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

1. Переименовать файл активного процесса нельзя
Соответственно, нам нужен внешний EXE, который этим займётся
Создаём простой EXE, данный файл будет распаковываться в вашем основном инсталляторе, ваш инсталлятор передаст свой полный путь и при запуске EXE считает его через параметры, затем переименует файл и перезапустит инсталлятор (зачем вам вообще такие извращения?).
Код, который нужно добавить в код основного кода пакета инсталлятора:
читать дальше »

Код:

!include "FileFunc.nsh"

Name "test"
OutFile "setup.exe"
InstallDir "$TEMP"


Function .onInit
 call InstallerRenameFunc
FunctionEnd


Function InstallerRenameFunc
var /global CommandLine
 ${GetExeName} $R0
 ${GetParameters} $CommandLine
 ${GetOptions} "$CommandLine" "/renamed" $0
iferrors 0 noRename
 File "/oname=$TEMP\rename.exe" "rename.exe"
 exec '"$TEMP\rename.exe" /fullpath=$R0'
quit
noRename:
FunctionEnd


Section
SectionEnd



Код файла, который будет переименовывать основной файл пакета инсталлятора:
читать дальше »
Код:

!include "FileFunc.nsh"

Name "test"
OutFile "rename.exe"
InstallDir "$TEMP"

Function .onInit
 call RenameFunc
FunctionEnd


Function RenameFunc
var /global CommandLine
 ${GetParameters} $CommandLine
 ${GetOptions} "$CommandLine" "/fullpath=" $0
IfFileExists "$0" 0 noRename
${GetParent} "$0" $R0
 Rename "$0" "$R0\Новое имя файла.exe"
 sleep 1000
 exec '"$R0\Новое имя файла.exe" /renamed'
noRename:
quit
FunctionEnd

Section
SectionEnd



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

!include "FileFunc.nsh"

Name "test"
OutFile "!test.exe"
InstallDir "$TEMP"

Function .onInit
 call CopyInstaller
FunctionEnd


Function CopyInstaller
var /global CommandLine
 ${GetExeName} $R0
 ${GetParameters} $CommandLine
 ${GetOptions} "$CommandLine" "/copydone" $0
iferrors 0 noCopy
 CopyFiles /silent "$R0" "$TEMP\$EXEFILE"
 exec '"$TEMP\$EXEFILE" /copydone /fullpath=$R0'
quit
noCopy:
 ${GetOptions} "$CommandLine" "/fullpath=" $0
 Delete "$0"
 IfFileExists "$0" -1 0
FunctionEnd




Section
SectionEnd


MKN 17-07-2014 11:34 2377482

Цитата:

Цитата K.A.V.
Переименовать файл активного процесса нельзя »

Но ведь этот файл можно скопировать , а потом скопированный файл переименовать и далее его запускать, закрыв исходный файл.
И можно обойтись без внешнего EXE...
Вот так у меня работает :
Код:

OutFile "file.exe"
!include "LogicLib.nsh"

Function .onInit
${If} ${FileExists} "$EXEDIR\file1.exe"
Call RunFile1
${Else}
CopyFiles "$EXEDIR\file.exe" "$EXEDIR\file1.exe"
${EndIf}
FunctionEnd

Function RunFile1
MessageBox MB_OK "Выполняется file1"
; здесь код действий установки
FunctionEnd

Function .onInstSuccess
Sleep 300
Delete "$EXEDIR\file.exe"
nsRestart::FindProcess "file1.exe"
Pop "$1"
${If} $1 == 0
nsRestart::KillProcess "file1.exe"
${Else}
Sleep 300
Exec "$EXEDIR\file1.exe"
${EndIf}
FunctionEnd

Section
SetAutoClose true
SectionEnd

Установочное хозяйство помещаем в Function RunFile1

K.A.V. 17-07-2014 18:20 2377638

Цитата:

Цитата MKN
Но ведь этот файл можно скопировать »

Вопрос был про переименование, я ответил про переименование
Ниже мой пример идёт уже по копированию инсталлера

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

natasha_82 18-07-2014 12:54 2377936

profcom, K.A.V.,
Спасибо ограмное - я не много запуталась с ini файлом, уже справилась.
K.A.V., /D - для меня не подходить((, т.к. в момент инсталляции указывается 2 не зависимые директории
зато теперь мучаюсь с UAC

Otlanta 24-07-2014 11:01 2380641

Как сгенерировать рандомное значение по типу:

D-346-3464-4364-3466

MKN 24-07-2014 12:35 2380683

Цитата:

Цитата Otlanta
Как сгенерировать рандомное значение по типу:
D-346-3464-4364-3466 »

Генеришь рандомное значение (многоциферок одной строкой, как - уже было в теме )
Извлекаешь из рандомной строки и заносишь в переменные (например в $1 $2 $3 $4 $5 ) - сначала первый символ из рандомного значения, в следующую - со второго по четвёртый символ (или как надо) и т.д.
Затем всю эту компанию помещаешь в "конечную" переменную StrCpy $R0 "$1-$2-$3-$4-$5"

Otlanta 26-07-2014 00:16 2381407

Возникла проблема, WriteRegBin не работает с переменными. Бинарное значение большое более 2000 символов, берем http://nsis.sourceforge.net/Special_...#Large_strings, далее берем плагин Registry:
Код:

${registry::Write} "HKEY_CURRENT_USER\Software\Test" "ID" "3765685853358583585583" "REG_BINARY" $7
В итоге, значение создается не полностью, записываются лишь 1024 символа. Пробуем тоже самое с RegistryFunc.nsh:

Код:

${WriteRegBin} "HKCU\Software\Test" "ID" 5383358853855868358558538
IfErrors 0 +2
MessageBox MB_ICONSTOP|MB_OK "error" IDOK

Ошибка, параметр не создаётся.

Для полноты картины по пробовали и плагин RegBin тоже ошибка. Проверка версии показывает:
Код:

---------------------------
Size Max_StrLen
---------------------------
NSIS_MAX_STRLEN = 8192
---------------------------
OK 
---------------------------

Вроде всё, ок, корректно записывает такой длинный параметр только стандартный WriteRegBin, но он не работает с переменными, а значение получается именно от туда. Какие пути решения задачи имеются?

Тестировалось на Windows XP.

UPDATE: Команда:
Код:

nsExec::exec 'reg add "HKEY_CURRENT_USER\Test" /f /v "ID" /t REG_BINARY /d "447454574574574545"'
Оставляет ещё меньше символов 860 :(

K.A.V. 26-07-2014 08:11 2381445

Вложений: 1
Otlanta, c большинством плагинов идут исходники, много плагинов давно не обновлялись и в исходниках у них жестко прописано ограничение в 1024 символа, в данном случае нужно взять исходники плагина Registry, установить Visual C++ 6.0 и поменять всего одно значение в исходниках, и "новый" плагин без ограничения в 1024 символа строки готов

Держите готовый Registry.dll, выставил ограничение строки в 8192 символа

vosya 28-07-2014 14:08 2382202

Цитата:

Данная команда выводит окошко с заданным текстом.

MessageBox [тип сообщения] [текст сообщения] [/SD return] [return jumpto] [return2 jumpto_2]
а есть способ переноса строк в сообщениях?

Begin2Fly 28-07-2014 14:11 2382204

Цитата:

Цитата vosya
а есть способ переноса строк в сообщениях? »

Есть: http://nsis.sourceforge.net/Docs/Chapter4.html#4.2.4

MaGoth 04-08-2014 22:49 2385228

Привет народ, :)

alexfinik,
Цитата:

MaGoth, да, пример был бы очень неплох. У меня многомодульный инсталлятор, поэтому наверное, лучше пример от тебя - и тебе легче, чтобы не копаться с моим кодом, и мне, наверное. »
Отсутствовал некоторое время, потому не помню и не в курсе, проблема решена уже и нужен ли еще файл?

Цитата:

Друзья, может всё-таки кто-то знает почему данный код может не работать? »
Скорее проблема у тебя на стороне, у меня скрипт прекрасно скомпилился и все отображается как надо (NSIS-2.46.5 UNICODE).


AlekseyPopovv,
Цитата:

Как привязать реестр к выбору языка? »
У себя скриптах на юникоде, я делаю примерно так:
читать дальше »
Код:

...
InstallDir "$PROGRAMFILES\"
!define PROG_UNINST_KEY "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PROG_NAME_TEXT}"
!define PROG_UNINST_ROOT_KEY "HKLM"
!define PROG_RKEY "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PROG_NAME_TEXT}"
InstallDirRegKey HKLM "${PROG_RKEY}" "InstallLocation"
AllowRootDirInstall true
...

Далее, после кастомных функций или команды RequestExecutionLevel admin, прописываем:
Код:

!define MUI_LANGDLL_REGISTRY_ROOT "${PROG_UNINST_ROOT_KEY}" "HKCU"
!define MUI_LANGDLL_REGISTRY_KEY "${PROG_UNINST_KEY}" "Software\Modern UI Test"
!define MUI_LANGDLL_REGISTRY_VALUENAME "${PROG_NAME_FILE}: Language"

После строки кода !insertmacro MUI_PAGE_WELCOME прописываем:
Код:

LicenseData $(mylicense)
!insertmacro MUI_PAGE_LICENSE $(mylicense)
Если лицензия будет нужна.

После строки кода !insertmacro MUI_UNPAGE_FINISH прописываем используемые языки, например:
Код:

!insertmacro MUI_LANGUAGE "ENGLISH"
!insertmacro MUI_LANGUAGE "ROMANIAN"
!insertmacro MUI_LANGUAGE "GERMAN"
!insertmacro MUI_LANGUAGE "RUSSIAN"
!insertmacro MUI_LANGUAGE "ITALIAN"
!insertmacro MUI_LANGUAGE "CZECH"
!insertmacro MUI_LANGUAGE "POLISH"
!insertmacro MUI_LANGUAGE "SPANISH"

Здесь же, указываем расположение файлов на разных языках и в разных папках, если требуется:
Код:

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"

Либо все файлы в одной папке:
Код:

LicenseLangString mylicense ${LANG_ENGLISH} ".\licens\licence_en.rtf"
При этом, изменяем название файлов соответственно: licence_en.rtf, licence_ro.rtf и т.д.
И прописываем эту строку для каждого языка отдельно, все аналогично как и в примере выше.

И следом, прописываем:
!insertmacro MUI_RESERVEFILE_LANGDLL

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

LangString TextWelcomePage ${LANG_ENGLISH} "The Setup Wizard will guide you through the installation process of $(^Name).\r\n\r\nIt is strongly recommended to close all other applications before continuing the installation procedure.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_ROMANIAN} "Vei fi ghidat in procesul de instalare al $(^Name).\r\n\r\nEste recomandat sa inchideti celelalte aplicatii pornite inainte sa continuati instalarea.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_GERMAN} "Dieser Assistent führt Sie durch die Installation von $(^Name).\r\n\r\nEs wird empfohlen, vor der Installation alle anderen Programme zu schließen.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_RUSSIAN} "Этот мастер проведёт Вас через процесс инсталляции $(^Name).\r\n\r\nРекомендуется закрыть перед инсталляцией все другие программы.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_ITALIAN} "Il Setup Wizard ti guiderà attraverso il processo d'installazione di $(^Name).\r\n\r\nÈ fortemente raccomandato di chiudere tutte le altre applicazioni attive prima di proseguire con l'installazione.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_CZECH} "Setup Wizard vás provede procesem instalace $(^Name).\r\n\r\nJe silně doporučeno zavřít všechny ostatní aplikace, než budete pokračovat v instalaci.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_POLISH} "Kreator instalacji poprowadzi cię przez proces instalacji $(^Name).\r\n\r\nZdecydowanie zaleca się zamknięcie wszystkich innych aplikacji przed kontynuacją instalacji.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_SPANISH} "El asistente de instalación le guiará a través del proceso de instalación de $(^Name).\r\n\r\nIt es muy recomendable cerrar todas las aplicaciones antes de continuar con el procedimiento de instalación.\r\n\r\n$_CLICK"

В конце кода, прописываем:
Код:

в функцию .onInit
  !insertmacro MUI_LANGDLL_DISPLAY

в функцию un.onInit
  !insertmacro MUI_UNGETLANGUAGE

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



Мои вопросы:
- обойден ли лимит в 2ГБ?
- исправлен ли косяк с иконкой и свойствами файла, при размере инсталлера больше ~350 МБ?


Спасибо.. ,)

MaGoth 05-08-2014 02:10 2385274

K.A.V.

Попробовал твой пример "Проигрывание WAV-файлов" у себя, ничего не вышло..

Загнал его в .onInit
Код:

...
!define SND_ASYNC 1
!define SND_FILENAME 0x20000
!define SND_LOOP 8
!define SND_NAME "InstallTheme.wav"

  ReserveFile "${NSISDIR}\Plugins\system.dll"
  SetOutPath "$TEMP\${MOD_NAME_BASE} Installation2\bgi_ground"
  ReserveFile "${SND_NAME}"
  File "${SND_NAME}" 

System::Call 'Winmm::PlaySound(t"$TEMP\${MOD_NAME_BASE} Installation2\bgi_ground\${SND_NAME}", i0, i${SND_FILENAME}|${SND_ASYNC}|${SND_LOOP})'
...

Под юникодом и из другой директории, оно работает вообще ?!

K.A.V. 05-08-2014 17:55 2385416

Цитата:

Цитата MaGoth
Попробовал твой пример "Проигрывание WAV-файлов" у себя, ничего не вышло.. »

Win2000
WinXP 32-bit
Win7 32/64-bit
Win8 32-bit

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

MaGoth 05-08-2014 21:53 2385511

K.A.V.

Цитата:

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

Цитата:

Может, в пути у вас ошибка или формат WAV файла не тот?
Путь 100% рабочий, другое дело годится ли все это для данной функции в Юнике ?!

Как пример, для Юникода и файлов *.mp3 и их воспроизведения, я использую такой код:

Код:

Function .onInit
  Push $R0
  SetCurInstType 0
  !insertmacro MUI_LANGDLL_DISPLAY
  !insertmacro MUI_INSTALLOPTIONS_EXTRACT "setup.ini"
  StrCpy $1 ${SecMod}
;--------------------------------
  !define APP_NAME "mci.sound"
  !define SND_NAME "InstallTheme.mp3"
;--------------------------------
  ReserveFile "${NSISDIR}\Plugins\system.dll"
  SetOutPath "$TEMP\${MOD_NAME_BASE} Installation2\bgi_ground"
  ReserveFile "${SND_NAME}"
  File "${SND_NAME}" 
  System::Call 'msvfw32.dll::MCIWndCreateW(i 0, i 0,i 0x0070, t "$TEMP\${MOD_NAME_BASE} Installation2\bgi_ground\${SND_NAME}") i .r0'
  StrCpy $hmci $0
  SendMessage $hmci 0x0490 0 0 $0
  IntCmp $0 0 Keine_Musik
  ShowWindow $hmci SW_HIDE
  SendMessage $hmci 0x806 0 "STR:play repeat" 
  Keine_Musik:
...
FunctionEnd

И все работает, единственная проблема зацикливание под Юникодом не срабатывает, до сих пор не нашел способа как побороть...

А что с форматом, и каким он должен быть?
В справке ничего не указано на этот счет, я использую "DVI IMA ADPCM", а нужен "RAW PCM", или еще какой ?! :unsure:

habib2302 06-08-2014 13:51 2385707

Доброе время суток. Можно ли как нибудь узнать какие команды который прописаны в инсталляторе. например регистрация DLL?

MKN 06-08-2014 17:56 2385807

Цитата:

Цитата habib2302
Можно ли как нибудь узнать какие команды который прописаны в инсталляторе. например регистрация DLL? »

Имеется ввиду код скрипта ? - Нет. Предпринимаются правда попытки... Например, http://nsis.sourceforge.net/NullsoftDecompiler

K.A.V. 06-08-2014 17:57 2385810

Вложений: 1
Цитата:

Цитата MaGoth
Под юникодом »

Вызывайте PlaySoundW,а не PlaySound

Насчет формата файла точно не скажу, уже не помню, тестировал я или нет, но данной командой пользуюсь в SFX Creator для проигрывания звуков
Пример моего WAV файла во вложении, попробуйте его проверить.
Система без проблем у вас? Драйвера все установлены? Потому как я указал, тестировал на виртуалке во многих системах и нигде проблем не возникло

Цитата:

Цитата habib2302
Доброе время суток. Можно ли как нибудь узнать какие команды который прописаны в инсталляторе. например регистрация DLL? »

Шапку читаем

habib2302 06-08-2014 19:41 2385852

Цитата:

Цитата K.A.V.
Шапку читаем »

конкретней

MaGoth 06-08-2014 22:21 2385908

habib2302,

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



K.A.V.,

Цитата:

Система без проблем у вас? Драйвера все установлены? Потому как я указал, тестировал на виртуалке во многих системах и нигде проблем не возникло.
Естественно, не чайник же...

Цитата:

Насчет формата файла точно не скажу, уже не помню, тестировал я или нет, но данной командой пользуюсь в SFX Creator для проигрывания звуков
Пример моего WAV файла во вложении, попробуйте его проверить.
Архив со звуком сравнил, у меня аналогичный формат саунда что и у вас, - "DVI IMA ADPCM", но скорее всего проиграется любой вав..

Цитата:

Вызывайте PlaySoundW,а не PlaySound
С ним и вызывал под юником, - но не работало, пока не поменял кавычки местами, одинарные внутрь.
И.. музыка играет.., :yahoo: но не долго..! :angry2:

Пока исполнение когда не дойдет до закрытия сплеша:
Код:

        newadvsplash::show 3500 1500 1500 ffffff "$TEMP\${MOD_NAME_BASE} Installation2\bgi_ground\Splash.bmp"
После выполнения этого коды вместе с ним вырубается и музыка ?! :o
Соответственно вопрос, есть ли какой другой метод/способ кроме спуска функции воспроизведения звука, ниже кода этого сплеша? Или может какой аналогичный сплеш по-новее есть, но без подобных глюков ? :sorry:

Спасибо.. ,)

K.A.V. 07-08-2014 21:12 2386331

Цитата:

Цитата MaGoth
Соответственно вопрос, есть ли какой другой метод/способ кроме спуска функции воспроизведения звука, ниже кода этого сплеша? Или может какой аналогичный сплеш по-новее есть, но без подобных глюков ? »

Как вариант можно заюзать внешнее консольное приложение для проигрывания аудио, например sounder.exe (30 Кб), сам не тестил, т.к. лень и хочется спать
В своё время для сборки контры я использовал mpg123.exe для проигрывания mp3 файла сразу после запуска установщика, но там вес файла был ~350 Кб

MKN 08-08-2014 10:56 2386492

Цитата:

Цитата K.A.V.
Как вариант »

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

MaGoth 08-08-2014 17:26 2386687

Цитата:

Цитата K.A.V.
Как вариант можно заюзать внешнее консольное приложение для проигрывания аудио, например sounder.exe (30 Кб), сам не тестил, т.к. лень и хочется спать
В своё время для сборки контры я использовал mpg123.exe для проигрывания mp3 файла сразу после запуска установщика, но там вес файла был ~350 Кб »

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


Цитата:

Цитата MKN
Если речь о звуке, то можно попробовать bass.dll. По моему, это самый лучший вариант для воспр. звука в NSIS »

Косяков в работе с Юникодом нет? Цикличность и прочее по воспроизведению держит, мультиформатна для треков, или только один какой поддерживает?

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

Otlanta 09-08-2014 13:54 2386978

Приветствую, подскажите решение, в скрипте nsi всего одна секция, но она разрослась, используются все стандартные переменные начиная от $0 и до $R9, и накладываются друг на друга, стала появлятся ошибка, каким образом лучше всего можно оптимизировать эту структуру?

K.A.V. 09-08-2014 17:27 2387045

Цитата:

Цитата Otlanta
Приветствую, подскажите решение, в скрипте nsi всего одна секция, но она разрослась, используются все стандартные переменные начиная от $0 и до $R9, и накладываются друг на друга, стала появлятся ошибка, каким образом лучше всего можно оптимизировать эту структуру? »

Странный вопрос...

Секция сама разрослась? Нет возможности добавить в код дополнительных переменных? Нет возможности раскидать код по функциям? Ошибка? Какая? Каким образом? Какую структуру?
Вы с такими вопросами лучше к гадалке сходите, которая ещё и в NSIS при этом шарит, она сразу и вашу всю секцию увидит, и вашу "структуру" и посоветует, как лучше код оптимизировать

Otlanta 09-08-2014 17:55 2387062

а как завершить процесс с помощью плагина System?

где можно найти ProcessFunc работающий с 3 версией NSIS'a?

K.A.V. 09-08-2014 18:58 2387095

Цитата:

Цитата Otlanta
а как завершить процесс с помощью »

Можно использовать KillProc plug-in

Цитата:

Цитата Otlanta
где можно найти ProcessFunc работающий с 3 версией NSIS'a? »

У Вячеслава (он ведь автор), он не обновил хидер к выходу справочника, хотя я ему писал насчет этого, так что вопросы по этому поводу к нему :not-me:

Otlanta 09-08-2014 19:21 2387106

Не хотелось бы использовать плагины для этой задачи, можно же наверно средствами WinApi...

K.A.V. 09-08-2014 19:37 2387121

Цитата:

Цитата Otlanta
можно же наверно средствами WinApi... »

Код:

System::Call "kernel32::OpenProcess(i0x0001, i0, i1160)i.r0"
System::Call "kernel32::TerminateProcess(ir0, i1)i.r1"

где 1160 - PID процесса

Otlanta 10-08-2014 00:01 2387190

K.A.V., а по имени процесса можно?

K.A.V. 10-08-2014 16:25 2387341

Цитата:

Цитата Otlanta
K.A.V., а по имени процесса можно? »

Насколько я понимаю, нужно писать функцию перечисления процессов, как в вышеупомянутом ProcessFunc

Blok 11-08-2014 18:57 2387848

Всем привет!
Цитата:

Цитата MKN
Если речь о звуке, то можно попробовать bass.dll. По моему, это самый лучший вариант для воспр. звука в NSIS »

А вы можете привести пример сценария с использованием этой библиотеки? Например, чтобы звучала фоновая музыка. У меня не получается создать рабочий код. Вот как делаю я (пример):

Код:

XPStyle on
Name "Test"
OutFile "TestBass.exe"
Caption "Test Bass"
BrandingText 'Test'


!include "MUI2.nsh"
InstallDir "$EXEDIR"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

Section "OGG"
SectionEnd

Function .onInit
InitPluginsDir
File /oname=$PLUGINSDIR\BASS.dll BASS.dll
File /oname=$PLUGINSDIR\mymusic.ogg mymusic.ogg
StrCpy $R5 "$PLUGINSDIR\mymusic.ogg"

; Инициализация
System::Call '$PLUGINSDIR\BASS::BASS_Init(i -1,i 44100,i 0,i 0,i 0)'

; Создание файлового потока
System::Call '$PLUGINSDIR\BASS::BASS_StreamCreateFile(i 0,t R5,i 0,i 0,i 4)'

; Воспроизведение канала
System::Call '$PLUGINSDIR\BASS::BASS_ChannelPlay(i 0, i 0)'
FunctionEnd

Function .onGUIEnd
System::Call '$PLUGINSDIR\BASS::BASS_ChannelStop()'
System::Call '$PLUGINSDIR\BASS::BASS_StreamFree()'
System::Call '$PLUGINSDIR\BASS::BASS_Free()'
FunctionEnd

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

Спасибо.

MKN 11-08-2014 19:10 2387854

Цитата:

Цитата Blok
А вы можете привести пример сценария с использованием этой библиотеки? »

Уже было (Пост 872 стр 88 ) Bass.dll лучше скачать последнюю версию (та что во вложении глючная) с сайта разработчика http://www.un4seen.com/
Там же доки (полезные тем, кто разбирается в программировании)
На русском : http://www.tiflocomp.ru/games/design...games/bass.php
Применимо к NSIS много полезного в известном хидере Bass.nsh by Diego Pedroso (под рукой сейчас нет, но в сети навалом)
PS вот пример : https://yadi.sk/d/gzFnjE_JZSNEw
Цитата:

Цитата Blok
как правильно надо использовать вызовы из сторонних DLL в NSIS »

Согласно докам к System плагину. Кое что есть в справочнике. Правда изложение доков оставляет желать лучшего и специфика использования весьма мутная... Так что вопросы лучше адресовать гуру, например Вячеславу kotkovets, (думаю не нахмурится за "перевод стрелок" :) )

Blok 11-08-2014 22:05 2387929

Спасибо, буду пытаться разобраться. Но сравнив код, который наваял я, и который показан в примере MKN, у меня возникает множество вопросов. Ясный перец с наскоку здесь не разберешься, особенно если в программировании полный ноль. Справку к плагину System я смотрел, но через переводчик гугл. Только понял, что для передачи в функции целых значений надо использовать литеру "i", для строки - "t", а если это логическое значение, то тогда как? Потом очень неясный вопрос с параметром HWND. Откуда его брать? В общем пока тупик. Понимаете, не хотелось бы тупо копировать часть кода, т.к. нет маневра. Изменяешь условия примера и ничего не работает. Ладно, не буду вас отвлекать.

Blok 12-08-2014 13:59 2388207

Возвращаясь к библиотеке bass.dll. Просидел всю ночь за мануалами и выявил следующие недостатки при использовании её в NSIS:

- при включении в сценарии параметра поддержки стилей XP (XPStyle on) > воспроизведение не работает;
- при включении в сценарии параметра компиляции юникодной версии (Unicode true) > воспроизведение не работает;
- при использовании в сценарии графической оболочки MUI или MUI2 (директива !include "MUI.nsh" (!include "MUI2.nsh")) > воспроизведение не работает.

При тестировании использовалась последняя версия bass.dll и NSIS v3.0b с официальных сайтов разработчика.

Вот немного переделанный рабочий сценарий, предложенный MKN (Пост 872 стр 88 ):

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

; Простой GUI - версия ANSI - при отключенной поддержки стилей ХР

; Unicode true ; если включить, то воспроизведение не работает

!include "LogicLib.nsh"

!define BASS_DLL "bass.dll"
!define BASS_LOC "$PLUGINSDIR\${BASS_DLL}"
!define MP3 "mymusic.ogg"
!define MP3_LOC "$PLUGINSDIR\mymusic.ogg"

OutFile "Bass_SimpleGUI.exe"
ShowInstDetails show

; XPStyle on ; если включить, то воспроизведение не работает

Page license
Page components
Page directory
Page instfiles

Section "Ogg"
SectionEnd

Function .onInit
  InitPluginsDir
  File "/oname=${MP3_LOC}" "${MP3}"
  File "/oname=${BASS_LOC}" "${BASS_DLL}"

  ; Выполняем инициализацию аудио устройства
  System::Call '${BASS_LOC}::BASS_Init(i -1,i 44100,i 0,i 0,i n) b.r0'

  ; Создаем файловый поток для воспроизведения
  System::Call '${BASS_LOC}::BASS_StreamCreateFile(b 0,t "${MP3_LOC}",i 0,i 0,i 0) i.r1'

    ; Если файловый поток успешно создан (не равен 0), то
    ${If} $1 != "0"
      StrCpy $R5 "Initialization OK."

      ; Устанавливаем для канала флаг зацикливания при воспроизведении
      System::Call '${BASS_LOC}::BASS_ChannelFlags(i r1, i 4, i 4) i.R0'
 
      ; Запускаем воспроизведение канала
      System::Call '${BASS_LOC}::BASS_ChannelPlay(i r1, b 0) i.R4'
     
      ; Получаем номер ошибки
      System::Call '${BASS_LOC}::BASS_ErrorGetCode(i) i.R1'
    ${Else}
      ; Закрываем все существующие каналы воспроизведения и освобождаем системные ресурсы
      System::Call '${BASS_LOC}::BASS_Free()'
      StrCpy $R5 "Initialization failed."
    ${EndIf}

  ; Выводим сообщение о параметрах воспроизведения (для отладки)
  MessageBox MB_ICONINFORMATION|MB_OK "HSTREAM handler = $1. $\r$\n\
                                      $R5 $\r$\n\
                                      BASS_ChannelFlags returned - $R0. $\r$\n\
                                      BASS_ChannelPlay returned - $R4. $\r$\n\
                                      BASS_ErrorGetCode - $R1."
FunctionEnd


Function .onGUIEnd
  ; Останавливаем воспроизведение канала
  System::Call '${BASS_LOC}::BASS_ChannelStop(i r1)'
  ; Освобождаем системные ресурсы
  System::Call '${BASS_LOC}::BASS_StreamFree(i r1)'
  ; Закрываем все существующие каналы воспроизведения и освобождаем системные ресурсы
  System::Call '${BASS_LOC}::BASS_Free()'
FunctionEnd


При передаче в функцию строки с именем файла, который необходимо воспроизвести, согласно документации System, можно указывать тип строки: t - TCHAR text, ANSI string или w - WCHAR text, Unicode string. То есть, если я правильно понял, то при компиляции юникодной версии инсталлятора команду

PHP код:

System::Call '${BASS_LOC}::BASS_StreamCreateFile(b 0,t "${MP3_LOC}",i 0,i 0,i 0) i.r1' 

надо изменить на

PHP код:

System::Call '${BASS_LOC}::BASS_StreamCreateFile(b 0,w "${MP3_LOC}",i 0,i 0,i 0) i.r1' 

Но это не помогает - воспроизведение не работает.

Еще в функции BASS_StreamCreateFile есть флаг BASS_UNICODE, который указывает, что имя файла задано в кодировке Unicode. Но установка этого флага не дает положительного результата

PHP код:

!define BASS_UNICODE 0x80000000
System
::Call '${BASS_LOC}::BASS_StreamCreateFile(b 0,w "${MP3_LOC}",i 0,i 0,i ${BASS_UNICODE}) i.r1' 

- воспроизведение не работает.

Это проблемы библиотеки bass.dll или NSIS? Можно ли как-то решить все эти вопросы? Или может быть я что-то делаю неправильно?

MKN 12-08-2014 16:32 2388285

Цитата:

Цитата Blok
- при включении в сценарии параметра поддержки стилей XP (XPStyle on) > воспроизведение не работает;
- при использовании в сценарии графической оболочки MUI или MUI2 (директива !include "MUI.nsh" (!include "MUI2.nsh")) > воспроизведение не работает. »

Откуда такие сведения ? У меня воспроизведение работает и при XPStyle on и при !include "MUI2.nsh". Какая тут вообще может быть связь ?
В каком месте играть музыке, выбираешь сам.
Про Unicode не знаю, нет в нём надобности. Но скорее всего будет работать, т.к. библиотека эта в каком только ПО не применяется...

Blok 12-08-2014 17:53 2388337

Цитата:

Цитата MKN
Откуда такие сведения ? »

Сидел пробовал так и сяк - у меня не работает. А вот когда я взял старую версию библиотеки bass v2.3.0.3, то воспроизведение запускается при любых комбинациях параметров XPStyle, Unicode, MUI и MUI2 в тексте сценария. Почему не работает bass v2.4.10.0 - я не знаю. Перепробовал все версии библиотеки bass от 2.4.0.0 до текущей - нема дела. И только с bass v2.3.0.3 без проблем заработало. Возможно причина действительно только на моей системе.

Что мешает проверить работу библиотеки bass v2.4.10.0 в юникодной версии инсталлятора? То что Вам нет надобности использовать использовать юникодную версию не значит, что эта надобность не возникнет у другого пользователя, например, MaGoth (сообщение 1263) интересовался этим вопросом. ;)

Добавлено:
Все ребята, отбой. Проблема была в моей системе (спасибо MKN за наводку). Переустановил. Теперь все путем - все воспроизводится. Прошу прощения за причиненные неудобства.

K.A.V. 12-08-2014 18:44 2388353

Цитата:

Цитата Blok
Что мешает проверить работу библиотеки bass v2.4.10.0 в юникодной версии инсталлятора? »

А вам что мешает?

Цитата:

Цитата Blok
То что Вам нет надобности использовать использовать юникодную версию не значит, что эта надобность не возникнет у другого пользователя »

Если у кого-то есть надобность использовать юникодную версию, это не значит, что я должен заранее сам это протестировать за кого-то и сказать ему о результате
Кому надо - сам пусть для себя и проверяет, в чем вопрос то? Как будто здесь кто-то кому-то обязан...Руки есть, интернет есть, качайте что нужно и тестируйте сами

Цитата:

Цитата Blok
MaGoth (сообщение 1263) интересовался этим вопросом »

Не поверите, но в интернете все равны, у всех одинаковые возможности

Я, например, ни разу ничего не тестировал в уникодной версии NSIS даже будучи автором справочника, т.к.
Цитата:

Цитата MKN
нет в нём надобности »

Если взялись за изучение NSIS, то учитесь делать/тестировать сами то, что вам нужно, а мы подскажем, насколько есть знаний и опыта

MKN 12-08-2014 18:44 2388354

Blok,
То что библиотека работает и в UNICODE - 100%
Но, в доке : "в структуре BASS_DEVICEINFO значение по умолчанию ANSI"
Т.е. надо это дело подружить с NSIS. Каким образом, надо думать...

Blok 12-08-2014 19:17 2388363

Цитата:

Цитата MKN
То что библиотека работает и в UNICODE - 100% »

Да работает, уже удостоверился в этом. Всем спасибо. ;)

kotkovets 13-08-2014 01:27 2388497

Цитата:

Цитата K.A.V.
где можно найти ProcessFunc работающий с 3 версией NSIS'a? »

будет время обновлю

MaGoth 13-08-2014 18:51 2388865

Цитата:

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

Ну, равны или не равны, суть то точно не в этом, а вот то что в справке мало Юнику уделяется внимание, это упущение лично на мой взгляд. И дело здесь даже не в том, пользует ли его кто, или нет. Просто там действительно могут быть существенные различия.
Если в справке будет развиваться это направление, то возможно смогу чем-то помочь... :)

MKN 14-08-2014 16:43 2389267

Определение SID пользователя
( в справочнике немного по другому)
Код:

OutFile "sid-Test.exe"
;SID –  Security ID-SID -  идентификатор безопасности текущего пользователя
; http://subscribe.ru/archive/comp.soft.prog.delphint/200207/29175902.html
; http://winadm.wordpress.com/2012/07/23/sid-security-identifier/
Section
System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2"
System::Call 'netapi32.dll::NetUserGetInfo(w n, w "$0", i 23, *i .R8)i.r4'
System::Call '*$R8(w .R1, w .R2, w .R3, i .R4, i .R9)'
System::Call advapi32::ConvertSidToStringSid(iR9,*t.R0)
DetailPrint "The SID is $R0"
System::Free $R8
SectionEnd


kotkovets 16-08-2014 18:55 2390157

Адаптировал ProcessFunc.nsh под 3 версию NSIS
---
как пользоваться читаем внимательно в справочнике по NSIS (ссылка на справочник в шапке темы)

MKN 17-08-2014 12:16 2390344

kotkovets,

Согласно справочника
Цитата:

Ожидание завершения запущенного процесса заданное время
Данный макрос заставит установщик ждать завершение запущенного процесса или ждать заданное время, не ожидая завершения процесса.
Будет ли работать ожидание окончания процесса , если основной контролируемый процесс создал ещё несколько дочерних процессов ? Т.е. нужно дождаться окончания всех возникших процессов.


И возвращаясь к перечислению дисковых устройств с занесением их всех в переменную :

Код:

Function .onInit
System::Call 'kernel32::GetLogicalDrives()i.r0'
StrCpy $2 0
StrCpy $4 65 ; 'A'
loop:
    IntOp $3 $0 & 1
    ${If} $3 <> 0
        IntFmt $3 "%c:\" $4
        System::Call 'kernel32::GetDriveType(tr3)i.r5'
DetailPrint "$3=$5"
StrCpy $R0 "$R0 $3$5"
        ${EndIf}
    IntOp $4 $4 + 1
    IntOp $0 $0 >> 1
StrCmp $0 0 "" loop
FunctionEnd

Возможно ли занести каждое найденное устройство в свою отдельную переменную ? Т.е. сколько устройств (кол-во их, заранее ессно не известно) - столько и переменных.

K.A.V. 17-08-2014 12:47 2390350

Цитата:

Цитата MKN
Будет ли работать ожидание , когда основной контролируемый процесс создал ещё несколько дочерних процессов ? »

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

Цитата:

Цитата MKN
Возможно ли занести каждое найденное устройство в свою отдельную переменную ? Т.е. сколько устройств - столько и переменных. »

Ну, переменными мы ограничены в NSIS, ты бы сразу тоже указал, в какие переменные ты хочешь заносить данные? В стандартные или в свои созданные?
Либо, как я предлагал здесь давныыым давно (не помню уже для чего, но вроде бы тебе тоже код предлагал), хранить несколько значений в одной переменной и считывать данные из "подпеременных" командой ${GetOptions}
Хотел, кстати, добавить небольшую статью-пример с хранением нескольких значений в одной переменной в справочник, да что-то передумал, идея вдруг показалась бредовой :blush2:

MKN 17-08-2014 12:51 2390351

Цитата:

Цитата K.A.V.
в какие переменные ты хочешь заносить данные? В стандартные или в свои созданные? »

Лучше в собственные...

K.A.V. 17-08-2014 13:01 2390357

раз поправил сообщение, дополню

Цитата:

Цитата MKN
Т.е. нужно дождаться окончания всех возникших процессов. »

В таком случае нет, функция дождётся завершения указанного процесса, завершения дочерних процессов функция ждать не будет

Цитата:

Цитата MKN
Возможно ли занести каждое найденное устройство в свою отдельную переменную ? Т.е. сколько устройств (кол-во их, заранее ессно не известно) - столько и переменных. »

Для твоего кода необходимо именно отдельные переменные, или можно сделать что-то типа массива?
Если делать отдельными переменными, то там просто заносить данные не совсем удобно (если на каждую букву диска делать сравнение), так не пойдёт?

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

!include "logiclib.nsh"
!include "FileFunc.nsh"

var var_Sum
var var_Drives


Name "test"
OutFile "!test.exe"
InstallDir "$TEMP"


Function .onInit

call GetDrivesFunc


StrCpy $0 0
GetList:
IntOp $0 $0 + 1
${GetOptions} "$var_Drives" "/$0=" $1
${GetOptions} "$var_Drives" "/$0_type=" $2
  MessageBox MB_OK|MB_ICONINFORMATION "Всего устройств: $var_Sum$\n$1 = $2"
StrCmp $0 "$var_Sum" 0 GetList
 
 
 MessageBox MB_OK|MB_ICONINFORMATION "готово$\n$\n$var_Drives"
 
quit
FunctionEnd





Function GetDrivesFunc
StrCpy $var_Sum 0
 StrCpy $var_Drives ""


System::Call 'kernel32::GetLogicalDrives()i.r0'
StrCpy $2 0
StrCpy $4 65 ; 'A'
loop:
    IntOp $3 $0 & 1
    ${If} $3 <> 0
        IntFmt $3 "%c:\" $4
        System::Call 'kernel32::GetDriveType(tr3)i.r5'
DetailPrint "$3=$5"

IntOp $var_Sum $var_Sum + 1
 StrCpy $var_Drives "$var_Drives /$var_Sum=$3 /$var_Sum_type=$5"
; плюсуем значение переменной, в которой хранится общее количество найденных устройств
; заносим данные о букве диске и о его типе в подпеременные


StrCpy $R0 "$R0 $3$5"
        ${EndIf}
    IntOp $4 $4 + 1
    IntOp $0 $0 >> 1
StrCmp $0 0 "" loop
FunctionEnd

Section
SectionEnd


В итоге, в одной переменной $var_Drives будет хранится инфа о всех найденных устройствах и их типы, а в переменной $var_Sum общее количество найденных устройств
Формат данных будет такой:
Код:

/1=C:\ /1_type=2 /2=D:\ /2_type=4
Вытащить данных не сложно, достаточно обратиться командой ${GetOptions} с указанием порядкового номера:
Код:

${GetOptions} "$var_Drives" "/1=" $1
${GetOptions} "$var_Drives" "/1_type=" $2

в переменной $1 - буква диска
в переменной $2 - тип устройства

kotkovets 18-08-2014 02:15 2390565

Цитата:

Цитата MKN
Будет ли работать ожидание окончания процесса , если основной контролируемый процесс создал ещё несколько дочерних процессов ? Т.е. нужно дождаться окончания всех возникших процессов. »

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

Dodakaedr 18-08-2014 17:52 2390874

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

K.A.V. 18-08-2014 19:37 2390894

Цитата:

Цитата Dodakaedr
Подкиньте, пожалуйста, примерчик как с помощью nsis создать портативную версию программы. Спасибо! »

А что, там в скрипте должно быть что-то сложное, чтобы давать пример?

1. Распаковка файлов (если требуется)
2. Если программа требует лицензию, вносим информацию в реестр (если просто файл ключа, то, соответственно, пропускаем пункт)
3. Запуск приложения с ожиданием
4. Удаление следов после использования приложения (временные файлы, настройки приложения в app/local app папках и т.д., записи в реестре)

Dodakaedr 18-08-2014 21:10 2390931

Цитата:

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

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

Otlanta 19-08-2014 01:23 2391033

Как узнать группу администратров и внести название в переменную?

K.A.V. 19-08-2014 17:12 2391352

Цитата:

Цитата Dodakaedr
Раз там ничего сложного то что мешает привести пример? »

Отсутствие времени

Цитата:

Цитата Dodakaedr
Как создать портабл »

Начнём с того, что для каждого приложения запускаемый EXE будет с разными командами (думаю, что вы это понимаете), затем нужно узнать, где программа хранит свои настройки и информацию о регистрации (если таковая имеется), в общем собрать всю необходимую информацию. Разбираться в софте, который в архиве только ради примера - у меня нет желания
Затем продумаем последовательность команд, которые должны будут выполнены, вы знаете, какие команды хотите видеть в скрипте?
У нас есть Справочник по NSIS, раз с NSIS не работали - для начала качайте и читайте "от корки до корки"

Небольшой пример скрипта запускаемого файла (все описания команд есть в справочнике):
читать дальше »
Код:


Name "test"
OutFile "test.exe"
; имя выходного файла

InstallDir "$TEMP\MyPortableApp"
; Каталог установки






Function .onInit ; самая первая функция в скрипте NSIS, которая выполняется при запуске установщика
 SetOutPath "$INSTDIR"
 ; Установить распаковку всех последующих файлов в папку установки

 File /r "MyApp"
 ; упаковываем в тело EXE файла папку "MyApp" (папка с нашей программой), которая находится на одном уровне с файлом скрипта
 ; при исполнении скрипта на этом этапе будет происходить распаковка файлов

 execwait '$windir\regedit.exe /s "$INSTDIR\settings.reg"'
 ; при необходимости импортируем настройки программы в реестр из файла, который лежит в папке "MyApp"

 execwait '$INSTDIR\MyApplication.exe'
 ; запускаем наше приложение с ожиданием завершения

 DeleteRegKey HKCU "Software\MyKey\bla bla bla"
 ; удаляем ветку программы в реестре, подчищаем за собой при необходимости

quit
; прекращаем исполнение нашего установщика, завершая процесс
FunctionEnd





Section
SectionEnd


Dodakaedr 19-08-2014 18:26 2391389

Цитата:

Цитата K.A.V.
Разбираться в софте, который в архиве только ради примера »

Это не только для примера но и для дальнейшего изучения метода создания портабл с помощью nsis. Самое что есть интересное это как указать папку куда сохраняются настройки программы и чтобы программа обращалась к ней в течение использования и как прописать регистрационные данные в reg файл и чтобы программа обращалась именно к нему, а не к реестру системы?

K.A.V. 19-08-2014 18:45 2391398

Цитата:

Цитата Dodakaedr
Это не только для примера но »

Чтобы вам самому не разбираться?

Цитата:

Цитата Dodakaedr
для дальнейшего изучения метода создания портабл с помощью nsis »

Лично мне данная тема не интересна. Нужен особый функционал? Не знаете как продумать логику для написания функции? - Здесь я могу помочь, а в чем-то разбираться, как всё устроено - пусть это делает тот, кому это нужно и кому это интересно.

Здесь тема помощи по скриптам NSIS, а не по изучению чего-либо, не связанного с NSIS
Вы приходите в эту тему задать вопрос по языку NSIS, а не для того, чтобы вас чему-то научили за рамками скриптов NSIS

Цитата:

Цитата Dodakaedr
Самое что есть интересное это как указать папку куда сохраняются настройки программы »

Начнём с того, что каждое приложение, которое хотят сделать "портабельным" - не портабельное, приложение хранит свои данные в большинстве случаев в реестре, некоторые программы хранят данные либо в своей папке, либо в папке данных текущего пользователя
Соответственно, вам необходимо сначала настроить программу, затем найти ветку в реестре, куда она сохраняет свои настройки (Process Monitor в помощь), затем экспортировать эту ветку реестра в REG-файл и при запуске вашего portable EXE импортировать REG-файл в реестр, чтобы ваша программа после этого подцепила все настройки, которые вы сами выставили.

Цитата:

Цитата Dodakaedr
и как прописать регистрационные данные в reg файл и чтобы программа обращалась именно к нему, а не к реестру системы? »

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

Я не занимался созданием portable приложений и не интересовался этим вопросом, возможно, это всё делается как-то иначе (скажу больше, мне даже лень гуглить по этому вопросу, т.к. 0% интереса)

Dodakaedr 19-08-2014 21:32 2391475

Цитата:

Цитата K.A.V.
не связанного с NSIS »

Здесь как раз прямая связь, все делается скриптингом nsis.
Цитата:

Цитата K.A.V.
чтобы вас чему-то научили »

Учить не обязательно, я самоучка, но если есть пример.
Цитата:

Цитата K.A.V.
при запуске вашего portable EXE импортировать REG-файл в реестр »

Это уже не портабл будет.
Цитата:

Цитата K.A.V.
Выше ответил. Если программа хранит данные о регистрации в реестре, то перед запуском программы импортируете данные о лицензии в реестр, ждёте, пока пользователь завершит работу с программой и затем удаляете данные из реестра, чтобы не оставлять следов
Я не занимался созданием portable приложений и не интересовался этим вопросом, возможно, это всё делается как-то иначе (скажу больше, мне даже лень гуглить по этому вопросу, т.к. 0% интереса) »

Вы правы, там все по другому делается, только вот как?! Ну и на этом спасибо!

K.A.V. 20-08-2014 03:48 2391549

Цитата:

Цитата Dodakaedr
Здесь как раз прямая связь, все делается скриптингом nsis. »

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

Цитата:

Цитата Dodakaedr
Это уже не портабл будет. »

Цитата:

Цитата Dodakaedr
Вы правы, там все по другому делается, только вот как?! Ну и на этом спасибо! »

Откуда у вас такая уверенность, что это делается "по другому", если вы сами не знаете, как именно делаются portable приложения?

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

MKN 20-08-2014 10:22 2391609

Цитата:

Цитата Dodakaedr
изучения метода создания портабл с помощью nsis »

Создавать портабл ПО (вернее - псевдопортабл) с помощью NSIS - идея крайне не удачная. Для этого есть конкретное специальное ПО, с помощью которого портабл делается гораздо быстрее и заведомо правильнее.

А если уж рассматривать методику создания псевдопортабла в NSIS, то
вариант, когда приложение после запуска сначала распаковывает файлы куда надо, затем пишет ключи в реестр, далее регистрирует, если надо DLL и т.д. , а после закрытия приложения удаляются все следы установки - это ведь по сути всё равно что запустить обыкновенный классический NSIS инсталлятор, а после окончания работы приложения - запустить обыкновенный Uninstaller для удаления следов установки + всё это в псевдопортабле надо контролировать для автоудаления после завершения работы приложения. Короче получается - дурь полная, а не портабл.

Во-первых, вышеописанное - это просто обыкновенный запуск, установка, работа и удаление приложения (установи, поработай и удали - в чём проблема ? ), а это к портаблу вообще не имеет отношения.
(разве что за исключением, что всю эту канитель ещё надо ещё контролировать для автоудаления хвостов после закрытия). Т.е. смысла - ноль.

Во-вторых, распаковка файлов после запуска приложения - это уже лажа. В нормальном портабле, находящимся в папке на любом носителе, всё уже готово для работы и ничего распаковывать не надо ! Просто запустил исполняемый файл (или загрузчик) - и сразу работай на здоровье. Никаких следов в ОС и реестре не при запуске, не при закрытии, ессно не будет. Об этом заботятся средства виртуализации спец ПО, с помощью которого портабл был создан.

Про второй вариант псевдопортабла c помощью NSIS. Это когда ПО не требует установки и все файлы программы находятся в одной папке где угодно, откуда и запускается программа. Повторяю - ничего никуда после запуска не распаковывается и не устанавливается ! Пачкается при запуске только реестр, ну и иногда добавляются в "пользовательские места" некоторые данные (файлы настроек и пр), которые после закрытия программы и чистятся. Организовать в скрипте это не сложно. Собственно про такой псевдопортабл и можно говорить. Всё остальное - лажа, не имеющая смысла.

Serg866 29-08-2014 02:27 2395588

Здравствуйте.
Подскажите, пожалуйста, как в NSIS 3b0 создать лог-файл установки?
Пример из справки не компилириутся из-за ошибки:
!define: "LVM_GETITEMCOUNT" already defined!

K.A.V. 29-08-2014 20:53 2395954

Цитата:

Цитата Serg866
Подскажите, пожалуйста, как в NSIS 3b0 создать лог-файл установки?
Пример из справки не компилириутся из-за ошибки:
!define: "LVM_GETITEMCOUNT" already defined! »

Удалите из кода строку

Код:

!define LVM_GETITEMCOUNT 0x1004
Всё дело в том, что на момент написания примера кода, данных констант не было в хидерах NSIS той версии, а сейчас есть, соответственно и выползает ошибка, т.к. данная константа уже существует

Serg866 30-08-2014 10:42 2396086

K.A.V., спасибо за ответ!
После удаления строки скрипт скомпилировался без ошибок.


Также у меня возник вопрос по другому примеру из справки: "Кликабельный BrandingText".
Возможно что-то неправильно делаю, но сделать брендинг-текст в виде ссылки у меня не получается, ресурс интерфейса подправил как указано в примере. Возможно плагин Linker не работает с 3-й версией NSIS? Если Вас не затруднит, проверьте, пожалуйста работоспособность кода из примера на NSIS 3b0.

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

Flix 04-09-2014 23:35 2398540

Цитата:

Цитата Serg866
Если Вас не затруднит, проверьте, пожалуйста работоспособность кода из примера на NSIS 3b0. »

Все прекрасно работает, проблем нет. Проверил как ANSI версию, так и UNICODE. Скорее всего, вы что-то делаете (или сделали) неправильно.

Serg866 05-09-2014 15:41 2398763

Flix, спасибо. Не могли бы в таком случае выложить ваш правленный modern.exe?

diakov 06-09-2014 10:42 2399104

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

MKN 06-09-2014 19:18 2399308

Цитата:

Цитата diakov
как на финишной странице создать произвольное количество run чекбоксов »

В дополнение к FINISHPAGE_RUN (можно и вообще без него ) добавить CUSTOMFUNCTION_SHOW ( и CUSTOMFUNCTION_LEAVE ) перед MUI_PAGE_FINISH и создать n-чекбоксов :
Код:

outfile "test_FINISHPAGE.exe"
!include MUI2.nsh
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_TEXT " RunFunction"
!define MUI_FINISHPAGE_RUN_FUNCTION "RunFunction"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW CustomFinish
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE FinishLeave
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

var Checkbox
var Checkbox2
var Checkbox3

Function CustomFinish
${NSD_CreateCheckbox} 120u 110u 100% 10u " Доп чекбокс"
Pop $Checkbox
SetCtlColors $Checkbox "" "ffffff"

${NSD_CreateCheckbox} 120u 130u 100% 10u " Доп чекбокс2"
Pop $Checkbox2
SetCtlColors $Checkbox2 "" "ffffff"

${NSD_CreateCheckbox} 120u 150u 100% 10u " Доп чекбокс3"
Pop $Checkbox3
SetCtlColors $Checkbox3 "" "ffffff"
FunctionEnd

Function FinishLeave
${NSD_GetState} $Checkbox $0
${If} $0 <> 0
MessageBox mb_ok "Доп чекбокс отмечен"
${EndIf}

${NSD_GetState} $Checkbox2 $0
${If} $0 <> 0
MessageBox mb_ok "Доп чекбокс2 отмечен"
${EndIf}

${NSD_GetState} $Checkbox3 $0
${If} $0 <> 0
MessageBox mb_ok "Доп чекбокс3 отмечен"
${EndIf}
FunctionEnd

Function RunFunction
MessageBox mb_ok "Чего то запустили"
FunctionEnd

Section
SectionEnd


MKN 17-09-2014 15:24 2403975

WimImage plug-in

Цитата:

This plugin is designed to remove the current 2GB limit in NSIS by creating and extracting images contained in .wim files that are separate to the installer.
http://nsis.sourceforge.net/WimImage_plug-in

natasha_82 18-09-2014 19:18 2404546

Добрый день.
Подскажите, как можно сделать такое:
в момент установки 121.ехе, ехе запускается от пользователя и от администратора, соответственно активны два процесса с одинаковыми именами.
Как можно проверить и запретить запуск 3-го процесса с таким же именем?

Если запущен один процесс и не запускать второй - это знаю, не подходит(((

Flix 23-09-2014 19:32 2406242

Вложений: 1
Цитата:

Цитата Serg866
Не могли бы в таком случае выложить ваш правленный modern.exe? »

Serg866, прикрепил архив к этому сообщению.

K.A.V. 24-09-2014 16:56 2406599

Цитата:

Цитата natasha_82
активны два процесса с одинаковыми именами.
Как можно проверить и запретить запуск 3-го процесса с таким же именем? »

1. Определить наличие процессов с указанным образом, сохранив PID первых двух найденных процессов в переменные
2. При проверке убивать все процессы, PID которых отличается от сохранённых ранее

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

MKN 26-09-2014 17:27 2407352

Давно интересует такой вопрос - каким образом удалять/устанавливать файлы (в частности DLL) "занятые" ShellExtension не перезагружая explorer ( или подобное ПО, типа TotalCommander и т.п. )?

К примеру, установили ПО из собственного NSIS инсталлятора , в котором при участии какой то DLL , в контекстное меню добавились какие то пункты. Если удалять это ПО, при запущенном explorer_e , то как только процесс доходит до удаления этой DLL - получаем предупреждение, что файл(ы) уже используется.
Ессно, если закрыть explorer, то удаление произойдёт нормально. Но это совершенно не интересно.

В то же время штатный анинсталлер этого ПО, спокойно удаляет эти же файлы при запущенном explorer_e ! Как это он делает ?
Возможно ли решить такую задачу в NSIS ?

Есть предположение, что используется функция System::Call 'Ole32::CoFreeUnusedLibraries() v'

vahe-91 29-09-2014 16:15 2408392

Цитата:

Цитата MKN
Давно интересует такой вопрос - каким образом удалять/устанавливать файлы (в частности DLL) "занятые" ShellExtension не перезагружая explorer ( или подобное ПО, типа TotalCommander и т.п. )? »

сначала удаляешь записи реестра ShellExtension, потом ${RefreshShellIcons}, потом удаляешь dll-ки самой ShellExtension

MKN 29-09-2014 21:37 2408540

Цитата:

Цитата vahe-91
сначала удаляешь записи реестра ShellExtension, потом ${RefreshShellIcons}, потом удаляешь dll-ки самой ShellExtension »

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

Serg866 30-09-2014 05:27 2408655

Цитата:

Цитата Flix
Serg866, прикрепил архив к этому сообщению. »

Всё равно не получается брендинг-текст кликабельным. Может быть ещё кто-нибудь протестирует на 3 версии?

UPD
В общем сработало только при таком варианте кода:
Код:

Function myGuiInit
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $HWNDPARENT 1028
EnableWindow $0 1
Linker::link /NOUNLOAD $0 "http://www.forum.oszone.net/ "
FunctionEnd

Function .onGUIEnd
Linker::unload
FunctionEnd


Flix 30-09-2014 21:44 2409097

Цитата:

Цитата Serg866
Всё равно не получается брендинг-текст кликабельным. »

Что у вас опять не получается? Вот держите пример сценария:
PHP код:

NSIS v3.0b Modern User Interface (MUI2)
Пример создания кликабельной фирменной надписи при помощи плагина Linker v1.2

#--------------------------------
# Заголовочные файлы

  
Подключаем тип интерфейса Modern UI
  
!include "MUI2.nsh"

#--------------------------------
# Параметры инсталлятора

  
Название
  Name 
"$\"Кликабельная надпись$\""
  
Имя файла
  OutFile 
"CBL-MUI.exe"
  
Каталог установки по умолчанию
  InstallDir 
"$LOCALAPPDATA\Modern UI Test"
  
Уровень привилегий инсталлятора для Windows Vista
  RequestExecutionLevel user
  
  
Фирменная надпись
  BrandingText 
"Моя фирменная надпись" 

#--------------------------------
# Параметры интерфейса
  
  
Подтверждать отмену установки
  
!define MUI_ABORTWARNING
  
Трехстрочная надпись в заголовке диалога приветствия
  
!define MUI_WELCOMEPAGE_TITLE_3LINES

#--------------------------------
# Диалоги инсталлятора

  
Выполняем подключение плагина для создания кликабельной надписи
  
при инициализации графической оболочки инсталлятора
  
!define MUI_CUSTOMFUNCTION_GUIINIT BrandLink
  
  
ИНСТАЛЛЯЦИЯ
  
!insertmacro MUI_PAGE_WELCOME
  
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
  
!insertmacro MUI_PAGE_COMPONENTS
  
!insertmacro MUI_PAGE_DIRECTORY
  
!insertmacro MUI_PAGE_INSTFILES
  
!insertmacro MUI_PAGE_FINISH
  
  
Устанавливаем файл GUIв котором для элемента управления ID=1028
  
; (фирменная надписьудалено свойство WS_DISABLED (отключен)
  
ChangeUI all "${NSISDIR}\Contrib\UIs\modern_modl.exe"

#--------------------------------
# Язык инсталлятора

  
!insertmacro MUI_LANGUAGE "Russian"
  
#--------------------------------
# Секции инсталлятора

Section "Dummy Section" SecDummy

SectionEnd

#--------------------------------
# Описание секций

  
Строка с текстом описания
  LangString DESC_SecDummy 
${LANG_RUSSIAN"Тестовая секция."

  
Выводим строку в поле описания секции
  
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
    
!insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)
  !
insertmacro MUI_FUNCTION_DESCRIPTION_END
  
# ===============================
# ФУНКЦИИ ИНСТАЛЛЯТОРА
# ===============================

Function .onInit
  
Инициализация каталога плагинов
  InitPluginsDir
  SetOutPath $PLUGINSDIR
FunctionEnd

# Функция инициализации графической оболочки инсталлятора
Function BrandLink
  GetDlgItem 
$0 $HWNDPARENT 1028
  
Вызов библиотеки Linker для создания кликабельной URL-ссылки
  Linker
::link /NOUNLOAD $"http://forum.oszone.net/thread-248731-132.html"
FunctionEnd

# Функция выгрузки графической оболочки инсталлятора
Function .onGUIEnd
  Linker
::unload
FunctionEnd
# =============================== 

Скомпилируйте и проверьте. При необходимости сделайте в сценарии изменения под свою программу.
P.S. На офсайте для ANSI версии плагина Linker v1.2 ошибочно выложена Unicode версия. Поэтому используйте плагин из моего архива (см. сообщение 1309).

MKN 03-10-2014 12:11 2410506

Определить версию ( VerifyOSVersion ) новой Windows 10 (как и предыдущие версии ОС ) можно с помощью StdUtils
автор LoRd_MuldeR
http://sourceforge.net/projects/muld...3.zip/download

MaGoth 04-10-2014 06:35 2410821

kotkovets,
Не выходило случаем еще обновок для winver2.nsh, по части определения версий для Win 8/8.1/9/10 ?!

kotkovets 05-10-2014 20:53 2411434

Цитата:

Цитата MaGoth
Не выходило случаем еще обновок для winver2.nsh, по части определения версий для Win 8/8.1/9/10 ?! »

а че телится сразу к Win 8-100 сделаю ))

Flix 08-10-2014 01:57 2412445

Встречаем NSIS v3.0b1. :yahoo:
Что нового (изменилось, добавлено) - читаем здесь. Загрузить релиз можно с оффсайта. Отчеты об ошибках сообщаем на форум NSIS.

Serg866 08-10-2014 02:34 2412449

Flix, благодарю за готовый скрипт.
Однако, есть баг: Если нажать на ссылку, а потом перейти обратно к окошку инсталлятора, то ссылку "колбасит". На картинке видно что с ней происходит)
У меня WinXP


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

Может быть подскажете возможно ли просто ссылку сделать кликабельной в тексте на страницах установщика?

Например текст:
Рекомендуем посетить сайт ввв.мояпрога.ру и чтобы текст ввв.мояпрога.ру был кликабелен?
Не могу никак с этим плагином разобраться(
А сам НСИС текст ссылок в линки не преобразовывает. В справочнике тоже нет инфы о том как ссылки добавлять в текст. Вроде НСИСу уже лет 10, а таких элементарных возможностей почему-то нет...

MKN 08-10-2014 10:38 2412525

Serg866,
Попробуй плагин BrandingURL http://nsis.sourceforge.net/BrandingURL_plug-in
Linker плаг всегда странно работал... ( Хотя для этого дела плагин и не оч то нужен. Достаточно ExecShell "open" "http://....." с соответствующей "обвязкой" )
Код:

OutFile BrandingURL_test.exe
!include "MUI2.nsh"
BrandingText "BrandingURL"

!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"
InstallDir "$TEMP"

Function onGUIInit
BrandingURL::Set /NOUNLOAD "255" "0" "0" "http://nsis.sourceforge.net/Main_Page"
FunctionEnd

Function .onGUIEnd
BrandingURL::Unload
FunctionEnd

Section
SectionEnd

Цитата:

Цитата Serg866
Вроде НСИСу уже лет 10, а таких элементарных возможностей почему-то нет... »

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

MKN 08-10-2014 12:26 2412584

NSIS 3.0b1
Release Notes : http://nsis.sourceforge.net/Docs/AppendixF.html#v3.0b1
Download : https://drone.io/github.com/kichik/nsis/files

Flix 08-10-2014 13:04 2412604

Цитата:

Цитата Serg866
Если нажать на ссылку, а потом перейти обратно к окошку инсталлятора, то ссылку "колбасит". »

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

Цитата:

Цитата Serg866
А сам НСИС текст ссылок в линки не преобразовывает. »

Тут вы не правы. Если в тексте лицензионного соглашения явным образом указаны Интернет адреса, то NSIS автоматически преобразовывает их в ссылки, по которым можно перейти в браузер.

Цитата:

NSIS 3.0b1 Release Notes
MKN, а чем Вас не устроило мое сообщение на предыдущей странице по этому поводу? :o

MKN 08-10-2014 13:08 2412606

Цитата:

Цитата Flix
а чем Вас не устроило мое сообщение »

Пардон, не узрел. ( Глаз замылился, только на сообщениях с кодом останавливается... :) )
Хотя моя ссылка на иной источник и с ( почему то) иным содержанием...

Flix 08-10-2014 14:09 2412635

Цитата:

Цитата MKN
Пардон, не узрел. »

Да ничего, бывает, просто я предположил, что сделал это неправильно. :)
Цитата:

Цитата MKN
Хотя моя ссылка на иной источник и с ( почему то) иным содержанием... »

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

Serg866 08-10-2014 17:43 2412715

Цитата:

Цитата Flix
Тут вы не правы. Если в тексте лицензионного соглашения явным образом указаны Интернет адреса, то NSIS автоматически преобразовывает их в ссылки, по которым можно перейти в браузер. »

То преобразуется из текстового файла. Я имел ввиду как добавлять линки непосредственно там, где текст со страниц инсталлятора грузится, а не из текстовика.
Например на странице лицензии это текст типа: "Для перемещения по тексту..."

Цитата:

Цитата MKN
Попробуй плагин BrandingURL »

этот плаг не работает на UNICODE версии.
А также ссылка в брендинг текст кликабельна не только в месте где текст, но и по всей длине инсталлятора. Тоже выглядит как недоработка.
В итоге получаем что кликабельный брендинг-текст без косяков сделать невозможно.

Цитата:

Цитата MKN
Достаточно ExecShell "open" "http://....." с соответствующей "обвязкой" ) »

Спасибо. Если сами это использовали, не могли бы пример привести?
Я ничего конректного не нашёл насчёт вопроса кликабельности ссылок в тексте на страницах инсталлера.

kotkovets 08-10-2014 18:55 2412760

Цитата:

Цитата Serg866
А также ссылка в брендинг текст кликабельна не только в месте где текст, но и по всей длине инсталлятора. Тоже выглядит как недоработка »

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

Flix 08-10-2014 20:18 2412784

Вложений: 1
Serg866, немного подкорректировал плагин Linker v1.2, точнее убрал функцию перерисовки элементов при потере окном инсталлятора фокуса. Пробуйте, тестируйте. Если такой результат вас удовлетворяет, то пользуйтесь на здоровье. Может быть еще кому пригодится. Только рекомендую оригинальный файл плагина (ANSI и Unicode) переименовать или сделать его резервную копию, прежде чем использовать модифицированный.

В прикрепленном к сообщению архиве ClickBrandLabel_MOD.zip находятся модифицированные ANSI и Unicode версия плагина Linker v1.2, а также модифицированные файлы GUI, в которых для элемента с брандинг текстом удалено свойство WS_DISABLED.

Serg866 08-10-2014 23:55 2412869

Flix, благодарю. Тестил Unicode версию исправленного плагина Linker, пропал глюк со ссылкой после нажатия на неё. Но у меня ХП, нужно ещё чтоб кто-нибудь проверил на Вин7-8.
И тогда, на мой взгляд: всё, что сделано Вами на эту тему (исправленный ресурс, исправленный плаг и готовый код-пример) можно размещать в справочнике NSIS. Точнее обновить имеющуюся там инфу по вопросу кликабельного брендинг-текста.

Цитата:

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

Спасибо за разъяснение! Теперь понятно почему кликабельность идёт по всей длине инсталлера.
А не знаете что нужно подправить, чтобы плагин BrandingURL заработал на Unicode версии? Обычно у всех плагинов имеется отдельная версия под Unicode, а у этого почему-то только для ANSI
------------------

P.S: А вот тема о том как добавить кликабельную ссылку в тексте на страницах инсталлера так и не раскрыта пока. Тоже в принципе нужная вещь... Может подумаем что сделать можно?
Просто в моём инсталляторе ещё на странице финиша задуманы ссылки на несколько сайтов. В формате типа:
За предоставленные материалы благодарим администрацию ресурса ввв.такой-тосайт.ру
Обновления продукта доступны на сайтах ввв.сайт.ру и ввв.ещёсайт.ру
Как-то несолидно когда ссылки не кликабельны. Не помешал бы справочный материал по этому поводу :)

Flix 09-10-2014 01:38 2412881

Вложений: 1
Цитата:

Цитата Serg866
Но у меня ХП »

Я сам на XP сижу. :tongue: Но по идее проблем быть не должно.

Цитата:

Цитата Serg866
А не знаете что нужно подправить, чтобы плагин BrandingURL заработал на Unicode версии? »

Править исходный код и компилировать отдельно Unicode версию.

В общем пересобрал проект плагина BrandingURL в Microsoft Visual Studio 2010 и добавил версию Unicode. Кому надо берем архив в аттаче. :)
Функциональность плагина осталась без изменений.

Цитата:

Цитата Serg866
Просто в моём инсталляторе ещё на странице финиша задуманы ссылки на несколько сайтов. »

На финишной странице для создания ссылки используйте команды MUI_FINISHPAGE_LINK и MUI_FINISHPAGE_LINK_LOCATION. В справочнике по NSIS есть их описание. Если нужно создать несколько ссылок, то поищите ответ на форуме, уже был подобный вопрос.

Serg866 09-10-2014 03:26 2412886

Flix. Дай Бог тебе здоровья. Ещё раз спасибо за помощь!
Юникод версию плагина БрендингУрл завтра проверю и отпишусь.

Пока как советовали выше попробовал подправить файл ресурса (modern.exe) и уменьшить длину контрола 1028 в диалоге 105, чтобы кликабельность брендового текста была не по всей длине инсталлера, а только в области самого текста. Так вот это не сработало( Всё равно на всю площадь кликабельность сохраняется. Видимо всё же это сам плагин копать надо, а не оболочку инсталлятора...

Как это выглядит на примере:
Брендовая ссылка у нас в левом уголке аккуратненько вставлена, а кликабельно при этом всё, что выделено пунктиром.


------------------
Цитата:

Цитата Flix
На финишной странице для создания ссылки используйте команды MUI_FINISHPAGE_LINK и MUI_FINISHPAGE_LINK_LOCATION. В справочнике по NSIS есть их описание. Если нужно создать несколько ссылок, то поищите ответ на форуме, уже был подобный вопрос. »

Наверное я не так обрисовал задачу. Нужно, чтобы ссылки, которые есть в тексте инсталлятора стали кликабельными.
Например есть команда с текстом для финишной страницы:
!define MUI_FINISHPAGE_TEXT "Спасибо за установку программы! Обновления доступны на сайтах ww.такой-тосайт.ру и www.ещёкакой-тосайт.ру."
Вот как сделать чтобы ссылки были не в виде текста, а стали активными?
А про команду MUI_FINISHPAGE_LINK я в курсе. Она просто добавляет линк после финишного текста.

MKN 09-10-2014 10:58 2412976

Цитата:

Цитата Serg866
Вот как сделать чтобы ссылки были не в виде текста, а стали активными? »

Благодаря Flix, предыдущая твоя проблема, надо понимать, решена... Хотя и иных вариантов решения кликабельности чего либо на страницах, предостаточно.
А касательно гиперссылок в тексте, то самое простое здесь, это использовать плагин nsWeb + html файлик с нужным содержимым. Как это работает в UNICOD_е, не знаю, т.к. не использую за ненадобностью.

Flix 09-10-2014 12:54 2413020

Цитата:

Цитата Serg866
Так вот это не сработало »

Вы что-то снова делаете неправильно. :)
Загрузите файл modern.exe в редактор ресурсов, например Resource Hacker. Перейдите на ресурс диалога 105. В правой половине редактора, в тексте сценария, найдите элемент с номером 1028 - это брандинг текст. Измените в нем значение ширины (W) элемента на желаемое, например 90 (в зависимости от длины вашего текста). Затем нажмите кнопку "Compile Script".

После чего сохраните сделанные изменения в файле (меню "File -> Save"). Компилируете ваш проект. Теперь ширина элемента с брандинг текстом будет соответствовать заданному значению.

Serg866 09-10-2014 22:31 2413285

Flix, всё, разобрался.
Проверил Unicode версию плагина BrandingURL. Работает.
Вопрос с брендинг-текстом можно считать решённым
:)

Цитата:

Цитата MKN
А касательно гиперссылок в тексте, то самое простое здесь, это использовать плагин nsWeb + html файлик с нужным содержимым. Как это работает в UNICOD_е, не знаю, т.к. не использую за ненадобностью. »

Опять же это не то. Текст будет грузиться из html-файла, то же самое что и из txt или rtf. Неужели никак нельзя преобразовать ссылки в тексте из самого инсталлятора, а не из текстовиков, хтмл и т.п.

MKN 10-10-2014 10:04 2413397

Цитата:

Цитата Serg866
Текст будет грузиться из html-файла, то же самое что и из txt или rtf. »

Совсем не то же самое. В предложенном, главное простом варианте, в html будут работать гиперссылки. А чтобы реализовать гиперссылки в txt или rtf, надо сильно постараться...

Цитата:

Цитата Serg866
Неужели никак нельзя преобразовать ссылки в тексте из самого инсталлятора »

Да запросто, но будет крайне не изящно и громоздко... Как вариант - последовательность "блоков" из Label, подогнанных по координатам : Label с текстом, Label с текстом-ссылкой, Label с текстом и т.д.

Limonica 10-10-2014 14:21 2413497

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

kotkovets 10-10-2014 16:45 2413569

Цитата:

Цитата Limonica
Добрый день, как поместить всё содержимое текстового файла в одну переменную »

StrCpy, ограничение 1024 символа, в расширенном варианте 8192 символа (пробел тоже символ) все в справке есть.

MKN 10-10-2014 17:37 2413579

Цитата:

Цитата Limonica
как поместить всё содержимое текстового файла в одну переменную? »

Для не больших файлов был код :
Код:

FileOpen $4 "${__FILE__}" r
loop:
FileRead $4 $1
StrCpy $3 "$3$1"
IfErrors +1 loop
FileClose $4
MessageBox MB_OK "$3"

kotkovets,
А вот, если надо тыщи строк поместить в переменную, получится в принципе ?
( для работы с большими rtf , вроде как, придумали LoadRTF.nsh. А для того же txt ? )

kotkovets 10-10-2014 18:08 2413585

Цитата:

Цитата MKN
А вот, если надо тыщи строк поместить в переменную, получится в принципе ? »

ограничение 1024 символа, в расширенном варианте 8192 символа
Цитата:

Цитата MKN
( для работы с большими rtf , вроде как, придумали LoadRTF.nsh. А для того же txt ? ) »

тут содержимое, по коду, "пачками поступает в содержимое контрола" (циклически)
и с каждым циклом переменная NSIS перезаписывается - по барабану rtf или txt

MKN 17-10-2014 10:38 2416599

Если необходимо, чтобы при отмеченном каком либо чекбоксе на PAGE_COMPONENTS - открывалась кастомная страница (с содержанием, связанным с назначением отмеченного чекбокса), то можно использовать такой код :

Код:

OutFile "IfSelectSection_ShowCustomPage.exe"
!include "MUI.nsh"
!include "Sections.nsh"
!include "LogicLib.nsh"
 
!insertmacro MUI_PAGE_COMPONENTS
Page custom CustomPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Section /o "!section1" sec1
SectionEnd

Section /o "!section2" sec2
SectionEnd
 
Function CustomPage
!insertmacro MUI_HEADER_TEXT "Был отмечен чекбокс section1" "Значит отображается эта кастомная страница"
nsDialogs::Create 1018
Pop $0
SectionGetFlags ${sec1} $R0
IntOp $R0 $R0 & ${SF_SELECTED}
IntCmp $R0 ${SF_SELECTED} show
Abort
show:
nsDialogs::Show
FunctionEnd

Т.е , если чекбокс отмечен - кастомная страница откроется, если не отмечен - будет пропущена.

MKN 21-10-2014 11:22 2418237

Появился новый плагин - EmbedHTML
http://nsis.sourceforge.net/EmbedHTML_plug-in
Открывает страницы (online и offline ) в выбранном окне (сообразно ID) , например в PAGE_LICENSE
Работает с движком IE, начиная с IE9 (это Windows 7 и т.д.)
ps Кому не нравится использовать внешние html файлы, создавайте их на здоровье сами в скрипте.

MKN 23-10-2014 18:27 2419481

Цитата:

Цитата LOKYOXY
New Interface NSIS »

Если уж предлагать, то ВСЕ файлы для проекта. Для твоего примера требуется куча плагинов (locate.dll FindProcDLL.dll NSISVCLStyles.dll WndProc.dll
ToggleInstFiles.dll , возможно и ещё какие то. Просто надоело устанавливать...) Плюс ругань на !define PBM_SETBARCOLOR 0x111E (по моему вообще не нужен т.к. уже есть в хедере (хотя и не с такой константой... тоже вопрос... )
А в целом, овчинка, по моему, вообще не стоит выделки...

4eshireCat 23-10-2014 20:11 2419514

Пожалуйста, подскажите как с помощью NSIS переименовать секцию в ini-файле. Чем проще - тем лучше :)

K.A.V. 23-10-2014 20:35 2419525

Цитата:

Цитата 4eshireCat
переименовать секцию в ini-файле »

1. Секция - обычная строка, ini файл - обычный текстовый файл, отсюда делаем вывод, что можно переименовать секцию простой заменой строки (примеров с заменой уже тьма, к тому же в справочнике тоже есть примеры)
2. Можно воспользоваться плагином EnumINI (описание опять же, есть в справочнике), с помощью которого можно перечислить все параметры со значениями в конкретной секции (мы же знаем имя секции) - и просто записать все параметры со значением с новым именем секции, а секцию со старыми именем затем удалить

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

4eshireCat 23-10-2014 20:45 2419532

K.A.V., спасибо. Реализовал с помощью ${LineFind} --> ${WordReplace}.

Begin2Fly 25-10-2014 18:53 2420396

Здравствуйте.
Подскажите, пожалуйста, как грамотнее реализовать создание чекбокса на MUI_PAGE_DIRECTORY.
Отредактировал modern.exe, добавив туда чекбокс, но пока не получается с ним управиться. Есть идеи?

K.A.V. 25-10-2014 19:26 2420406

Цитата:

Цитата Begin2Fly
Подскажите, пожалуйста, как грамотнее реализовать создание чекбокса на MUI_PAGE_DIRECTORY. »

Создать собственную страничку с нужными элементами и заменить ею стандартную страничку выбора каталога

Цитата:

Цитата Begin2Fly
Отредактировал modern.exe, добавив туда чекбокс »

"секс" с NSIS - это прекрасно :up
Если вы любите заниматься с NSIS этим, то давайте я вам объясню, как можно достигнуть пика наслаждения от корректного кода таким методом :)

1. Создаём Checkbox в modern.exe в диалоге 103, при создании обязательно ставим ему стиль BS_AUTOCHECKBOX
2. В поле ID элемента (я создавал элемент в ResHacker'e) вводим, например 5555, это обязательно, чтобы потом в коде мы смогли обратиться именно к нашему чекбоксу
3. В коде, после строки
Код:

!insertmacro MUI_PAGE_DIRECTORY
Добавляем
Код:

page custom MUI_PAGE_DIRECTORY_POST
И добавляем функцию, которая будет определять статус нашего чекбокса
Код:

Function MUI_PAGE_DIRECTORY_POST
 FindWindow $0 "#32770" "" $HWNDPARENT
 GetDlgItem $0 $0 5555
 SendMessage $0 ${BM_GETCHECK} "" "" $0
MessageBox MB_OK|MB_ICONINFORMATION "Статус чекбокса: $0"
FunctionEnd

Значение в переменной $0: 1 = чекбокс отмечен, 0 = не отмечен

Begin2Fly 25-10-2014 20:10 2420421

Цитата:

Цитата K.A.V.
Создать собственную страничку с нужными элементами и заменить ею стандартную страничку выбора каталога »

Можно, но не интересно.

Цитата:

Цитата K.A.V.
"секс" с NSIS - это прекрасно »

А вот это мне нравится :laugh:

Спасибо за помощь, всё делал именно так, но не добавил:
Код:

page custom MUI_PAGE_DIRECTORY_POST

MKN 27-10-2014 10:25 2420909

Цитата:

Цитата Begin2Fly
как грамотнее реализовать создание чекбокса на MUI_PAGE_DIRECTORY. »

Грамотнее, наверное, с помощью CreateWindowEx.
Цитата:

Цитата Begin2Fly
Отредактировал modern.exe, добавив туда чекбокс »

А вот это, уже из разряда : :)
Цитата:

Цитата K.A.V.
"секс" с NSIS - это прекрасно Если вы любите заниматься с NSIS этим »

:) Может конечно, чуть проще, но редактирование ресурсов, это крайняк, когда уже ничего нельзя сделать по другому...
Ессно и то и другое - это результат, а значит имеет право быть.

MKN 06-11-2014 12:47 2425441

Обновился NSIS Dialog Designer до v. 1.3.1 2014-10-27
http://coolsoft.altervista.org/en/nsisdialogdesigner

Limonica 11-11-2014 12:03 2427797

Проблемка, как узнать Serial HDD, c помощью NSIS?

MKN 11-11-2014 16:00 2427950

Цитата:

Цитата Limonica
как узнать Serial HDD, c помощью NSIS? »

Самое простое с помощью HddInfo.dll - см в теме. Или http://nsis.sourceforge.net/Get_Disk..._Serial_Number

Sann-X! 21-11-2014 12:10 2433130

Нужна помощь в таком вопросе. сделал инсталлятор, который позволяет переустанавливать мое ПО поверх текущей версии, т.е. без вызова удаления. В моем ПО есть длл с СОМ-сервером. Поэтому в момент переустановки эта длл может быть занята другим приложением. Мне надо следующее:
1) при невозможности заменить файл длл новым файлом попоросить перезагрузку
2) после перезагрузки удалить старый и скопировать новый файл.
2) после замены файла зарегистрировать эту длл через RegDLL

Как это сделать?

K.A.V. 21-11-2014 12:21 2433135

Цитата:

Цитата Sann-X!
1) при невозможности заменить файл длл новым файлом попоросить перезагрузку »

1. Прописываете команду удаления dll (Delete)
2. Проверяете, есть ли эта dll на диске (если есть, значит занята приложением и не удалена) (команда IfFileExists)
3. Если dll не удалена, пользуемся командами MessageBox и Reboot

Цитата:

Цитата Sann-X!
2) после перезагрузки удалить старый и скопировать новый файл. »

1. Методом записи в RunOnce прописываете исполнение батника на удаление и копирование вашей dll
2. Либо добавляете в свой пакет инсталлятора отдельную функцию, +добавляете обработку ключа командной строки и прописываете в RunOnce исполнение своего же инсталлятора с ключем, в коде инсталлятора в функции .onInit проверяете наличие ключа в параметре запуска (команда GetOptions), если ключ есть - выполняете написанную функцию по удалению dll и копированию нового файла

Цитата:

Цитата Sann-X!
2) после замены файла зарегистрировать эту длл через RegDLL »

Регистрируете dll командой RegDll

Описание команд есть в справочнике, ссылка на справочник в моей подписи либо в шапке темы

блин, похоже, я вас не правильно понял и вы просили готовый код?

Begin2Fly 21-11-2014 12:24 2433137

Sann-X!, можно попробовать такой вариант:

Код:

ExecWait 'regsvr32.exe /s /u "$INSTDIR\Sample.dll"' ;Снимаем регистрацию с DLL
Rename "$INSTDIR\Sample.dll" "$INSTDIR\Sample.tmp" ;Переименовываем используемую DLL во временный файл
Delete /REBOOTOK "$INSTDIR\Sample.tmp" ;Пытаемся удалить временный файл и добавляем флаг удаления после перезагрузки

Дальше копируем новую DLL и регистрируем её, с этим проблем не возникнет, т.к. имя уже не занято

Можно вывести на экран сообщение о необходимости перезагрузки, если старая DLL до сих пор используется и удалить её до перезагрузки не получилось:
Код:

${If} ${FileExists} "$INSTDIR\Sample.tmp"
  MessageBox IDOK "Для завершения установки требуется перезагрузка"
${EndIf}

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

Sann-X! 21-11-2014 12:29 2433139

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

Aster 23-11-2014 07:24 2433967

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

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

Ребят, помогите, пожалуйста, в этом вопросе.

Begin2Fly 23-11-2014 12:28 2434054

Aster, есть такой плагин: http://nsis.sourceforge.net/MD5_plugin

Код:

!include logiclib.nsh
OutFile "md5test.exe"
Section ""
        md5dll::GetMD5File "${NSISDIR}\makensis.exe"
        Pop $0
        ${If} $0 == 3c49b7e524f015f6c60ba036db5cca8e
                MessageBox MB_OK "Сумма $0 совпадает с 3c49b7e524f015f6c60ba036db5cca8e"
        ${ElseIf} $0 == e7b7ae483d017f00c661b1b975e2c883
                MessageBox MB_OK "Сумма $0 совпадает с e7b7ae483d017f00c661b1b975e2c883"
        ${Else}
                MessageBox MB_OK "Сумма $0 не совпадает ни с одним из файлов"
        ${EndIf}
SectionEnd


Salmo 23-11-2014 19:00 2434223

Уважаемые, подскажите, есть ли плагин или какой-нибудь метод, для упаковки инсталлятором на ПК, на который идет установка, группы файлов в архив (например, ZIP). Плагины - распаковщики есть, а упаковщики?

Begin2Fly 23-11-2014 19:31 2434244

Цитата:

Цитата Salmo
Уважаемые, подскажите, есть ли плагин или какой-нибудь метод, для упаковки инсталлятором на ПК, на который идет установка, группы файлов в архив (например, ZIP). Плагины - распаковщики есть, а упаковщики? »

Salmo, http://www78.zippyshare.com/v/83017636/file.html

Упаковать папку mydir в архив mydir.zip:
Код:

zip.exe -r mydir.zip mydir
Упаковать файл script.nsi в архив archive.zip:
Код:

zip.exe -r archive.zip script.nsi
Можно использовать маски вроде *.nsi, *.dll

Упаковать два файла в архив archive.zip
Код:

zip.exe -r archive.zip script.nsi script1.nsi
Подробности здесь: http://www.info-zip.org/mans/zip.html
Нужно более мощное сжатие - есть консольная версия архиватора 7z и подобные команды.

Salmo 23-11-2014 21:01 2434298

Begin2Fly, Хотелось без лишних EXE_шников в пакете обойтись...будем думать. Есть кое-что из Resurs Kit. Файлообменник подсунул параллельно какой-то левый Setap - браузер перехватил.

Sann-X! 24-11-2014 07:36 2434470

Есть у меня старый проект, который создается инсталлятором Install Aware Express 7 R2. При удалении длл, даже если они используются другими приложениями, эти длл удаляются без перезагрузки. Как мне так же сделать в NSIS? Есть идеи?

MKN 25-11-2014 11:00 2435179

Цитата:

Цитата Sann-X!
При удалении длл, даже если они используются другими приложениями, эти длл удаляются без перезагрузки. »

Несколько страниц назад я уже задавался похожим вопросом. Есть предположение, что поможет System::Call 'Ole32::CoFreeUnusedLibraries() v'
Как это дело довести до ума, пока неизвестно...

Но ,если "по правилам", ситуации, когда при удалении\установки ПО, DLL этого ПО занята чем либо - быть не должно. Раз DLL занята, то следовательно открыто какое то приложение, которое использует эту DLL.

А, как известно "из азбуки", перед установкой\удалением любого ПО, сначала должны быть закрыты все открытые приложения ! ( Причины этого не раз рассматривались... ) О чём пользователь получает соответсвующее предупреждение (если ПО написано нормальным программером :) ). В NSIS это легко организовать с помощью LockedList плагина.

Вероятно некоторые разработчики при удалении\установки своего ПО принудительно закрывают, именно те приложения/процессы, которые мешают удалению\установке... Что не всегда допустимо...

Наверно, правильнее было бы получать сообщение, типа - такая то конкретная DLL не может быть удалена, пока Вы не закроете такое то конкретное приложение. (LockedList, к слову, так не умеет... Но можно привлечь для этого утилитку WhoUses.exe, что не оч интересно... )
Если кто подскажет, как в NSIS организовать именно такое сообщение - будет здОрово и полезно. :)

Sann-X! 25-11-2014 12:15 2435212

Я решил сделать так:
- удалить файл длл
- если не удалился, то показать, какие процессы его держат (я написал плагин на Делфи, который в стеке возвращает процессы). Показываю окошко "MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION"
- если юзер нажал "Пропустить", то я удаляю файл через "Delete /REBOOTOK", в реестре в "RunOnce" прописываю прогу, которая заменит файлы.

Если коротко, то так.

MKN 25-11-2014 12:23 2435215

Цитата:

Цитата Sann-X!
- если юзер нажал "Пропустить", то я удаляю файл через "Delete /REBOOTOK" »

А разве, если закрыть "удерживающий" DLL процесс и повторить удаление - DLL не удалится без перезагрузки ?

Sann-X! 25-11-2014 12:27 2435219

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

MKN 25-11-2014 12:33 2435221

Цитата:

Цитата Sann-X!
Удалится. Но зачем делать перезагрузку? »

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

Sann-X! 25-11-2014 12:38 2435223

Не, плагин только выдает список процесссов, которые держат файл. А в самом NSIS уже вывожу "MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION" и анализирую действие юзера. А так да, в самом сообщении прошу закрыть указанные процессы.

MKN 25-11-2014 12:41 2435225

Цитата:

Цитата Sann-X!
прошу закрыть указанные процессы. »

По моему, это не дело - самому пользователю заниматься закрытием процесса... (зачем дублировать уже имеющийся LockedList ? ) Это что же, он должен залезать в диспетчер задач или самому тыркаться по списку процессов (кстати, как этот список у тебя организован ? ) ? Зачем ? Раз уж процесс, удерживающий DLL определён - вывел сообщение, кликнул кнопку и всё...

Sann-X! 25-11-2014 12:44 2435227

Ну, юзер выберет из 2х зол меньшее: либо самому закрыть процессы или сделать перезагрузку компа. А разве есть 3й вариант?

MKN 25-11-2014 12:49 2435228

Цитата:

Цитата Sann-X!
А разве есть 3й вариант? »

Мне видится так - либо пользователь игнорирует удаление, т.е. DLL всё равно удалится, но после перезагрузки, либо выбирает удаление без перезагрузки, т.е. с автозакрытием процесса и последующим удалением DLL. Два варианта.

Sann-X! 25-11-2014 12:51 2435230

Автозакрытие - это уже будет больше походить на хак. А если это будет какой-нить Word? Тогда слишком усложняется весь процесс инсталлятора: надо всем процессам (приложения и службы) послать команду "закрыть" (как это сделать пока не знаю), а потом ждать закрытия каждого процесса... Долго будет и муторно программировать.

MKN 25-11-2014 12:54 2435235

Цитата:

Цитата Sann-X!
Автозакрытие - это уже будет больше походить на хак. А если это будет какой-нить Word? »

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

Sann-X! 25-11-2014 12:59 2435239

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

Хотя вот есть плагин KillProcDLL_plug-in

MKN 25-11-2014 13:03 2435242

Цитата:

Цитата Sann-X!
Хак в том, чтобы инсталлятор закрыл приложение. »

Ну ты даёшь... Для отыскания-закрытия конкретных процессов есть и плагины, и есть код Nsis... Посмотри в теме. Фишка в определении конкретного процесса , удерживающего конкретную указанную DLL. Т.е. что то аналогично tasklist /m My.dll , только кодом NSIS . А уж закрыть найденный процесс, разве проблема...

Sann-X! 25-11-2014 13:04 2435243

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

Я так понял, что для закрытия процессов (приложений и служб) мне одного LockedList хватит?

MKN 25-11-2014 13:20 2435251

Цитата:

Цитата Sann-X!
для закрытия процессов (приложений и служб) мне одного LockedList хватит? »

Хватит. Только LockedList отобразит ВСЕ открытые приложения (или процессы) , а хотелось бы только то (те) конкретное приложение , которое удерживает конкретную указанную DLL.

Sann-X! 25-11-2014 13:20 2435252

А в LockedList есть возможность самому составить список процессов?

Вроде есть:
Adds a custom item to the list with a callback function.

Значит, буду шаманить.

Цитата:

Цитата MKN
Только LockedList отобразит ВСЕ открытые приложения (или процессы)

Вроде не так. Через LockedList::AddModule добавли свою длл и в окне показались только процессы, которые держат мою длл.

MKN 25-11-2014 13:40 2435264

Цитата:

Цитата Sann-X!
LockedList::AddModule добавли свою длл и в окне показались только процессы, которые держат мою длл. »

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

Sann-X! 25-11-2014 15:17 2435294

Нашел минус в LockedList: если процесс - служба, то он завершает ее принудительно, хотя можно это сделать мягко.

Sann-X! 27-11-2014 13:01 2436310

Как создать массив данных (или просто переменная) в длл на делфи так, чтобы потом с этим массивом/переменной можно было работать в NSIS?
Например, у меня в длл есть такая переменная:
Код:

library libname;

type
  TProcessInfo = record
    ..
  end;
  TProcessesInfo = array of TProcessInfo;

var
  Processes: TProcessesInfo;
  b: Byte;

...
 
procedure proba1(const hwndParent: HWND; const string_size: integer; const variables: PAnsiChar; const stacktop: pointer); cdecl;
var
  Descr: AnsiString;
  i: Integer;
begin
  // setup global variables
  g_stringsize := string_size;
  g_hwndParent := hwndParent;
  g_stacktop := stacktop;
  g_variables := variables;

  Inc(b);
  NSISDialog(Format('%d', [b]), 'proba', MB_OK);
end;
 
exports
  proba1;

begin
end.

При вызове в NSIS так:
Код:

My_dll::proba1
Всегда показывает "1", т.е. значение предыдущего вызова теряется. Как так?

Kopejkin 27-11-2014 20:12 2436535

И снова о "занятых" DLL...
Читать дальше...

В составе программы FolderSizes (foldersizes.com) есть файл FSShellExt.dll, с помощью которого в контекстное меню папок добавляются собственные команды программы.



Мне нужно пропатчить эту dll-ку или, в крайнем случае, заменить своей и, конечно же, без перезагрузки. Проблема в том, что dll-ка "занята" и не поддается изменению/удалению. Скопировать её можно.

Не очень понимая, что получаю, заметил такую закономерность.

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



Как только контекстное меню вызвано, файл "захватывает" Explorer.exe.



Просто так его уже не удалить.



Но файл FSShellExt.dll можно ЗАМЕНИТЬ вручную (из учетки администратора, Win 8.1), например, его же копией. Проводник сопротивляется, но все же дает выполнить эту операцию.



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

Так как бы узнать, какая команда была выполнена, что Проводник разблокировал файл и можно ли это как-то использовать в сценарии NSIS? Насколько я понимаю, регистрация FSShellExt.dll не отменяется и сохраняется даже после его удаления. Контекстное меню начинает работать сразу же после копирования файла FSShellExt.dll на то же место (в папку программы) и вызова контекстного меню папки.

Предыдущие сообщения читал. Может появилось какое-то "бесперезагрузочное" решение.

MKN 28-11-2014 10:09 2436783

Цитата:

Цитата Kopejkin
Может появилось какое-то "бесперезагрузочное" решение. »

Дык разве предыдущее обсуждение - не решение ? Находим с помощью LockedList, что "заняло" DLL, закрываем найденное и работаем спокойно с DLL без перезагрузки.

Kopejkin 28-11-2014 21:56 2437072

Цитата:

Цитата MKN
Находим с помощью LockedList... »

Наверное, я что-то не так делаю.
Подставляю имя dll-ки в пример LockedListShell32.nsi для проверки.
Читать дальше

Код:

Name `LockedList Test`
OutFile LockedListTest.exe
RequestExecutionLevel user

!include MUI2.nsh
!include x64.nsh

!insertmacro MUI_PAGE_WELCOME
Page Custom LockedListShow
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_LANGUAGE English

Function LockedListShow
  !insertmacro MUI_HEADER_TEXT `LockedList Test` `Using AddModule and shell32.dll`
  ${If} ${RunningX64}
    File /oname=$PLUGINSDIR\LockedList64.dll `${NSISDIR}\Plugins\x86-ansi\LockedList64.dll`
  ${EndIf}
  LockedList::AddModule \FSShellExt.dll
  ;LockedList::AddModule "C:\Program Files\Key Metric Software\FolderSizes 7\FSShellExt.dll"
  LockedList::Dialog
  Pop $R0
FunctionEnd

Section
SectionEnd

В итоге нечего закрывать.

MKN 29-11-2014 09:58 2437189

Цитата:

Цитата Kopejkin
Наверное, я что-то не так делаю. »

всё так.
Цитата:

LockedList::AddModule "$PROGRAMFILES\Key Metric Software\FolderSizes 7\FSShellExt.dll"
LockedList::Dialog
Действительно, есть такой странный момент "не определения" для explorer_a. ( и это касается аналогичных библиотек не только для FolderSizes )
Если работать с TotalCommander_ом, то LockedList всё прекрасно отображает... Я с explorer_ом никогда не работаю, потому и не заметил... В чём дело, пока не известно... Надо бы задать этот вопрос автору плагина.
Если хочешь, попробуй спросить на http://forums.winamp.com/showthread.php?t=274168&page=8 Ты ведь английским хорошо владеешь ? :)
( Как вариант, можно попробовать предыдущие версии плагина, вдруг автор именно в этой последней версии чего то забыл... Так иногда бывает... :) )

ps С другой стороны - ведь прекрасно известно, что именно explorer.exe занимает FSShellExt.dll. Ну так и гаси его перед манипуляциями с DLL. Лучше с сообщением-предупреждением.

ps2 Потому и хотелось бы автономного кода NSIS, для этих целей (определение конкретных процессов, использующих конкретную указанную DLL (OCX или EXE ), с последующим закрытием этого(этих) процесса(ов) .
Может kotkovets поможет (хорошо бы добавить такую возможность в его замечательный ProcessFunс.nsh ) ? Вячеслав, помоги пожалуйста решить эту задачу.

Kopejkin 29-11-2014 10:44 2437196

Цитата:

Цитата MKN
Ну так и гаси его.. »

Я пробовал пример из Справочника. Но на Win 8.1 он работает как-то странно. А может это винда странно работает после отработки скрипта. Смысл примера - убить explorer и сразу же его запустить. Проводник действительно работает, его операции можно выполнять, dll-ку можно изменять, НО..."теряется" Рабочий стол, и восстановить его отображение можно только перезагрузкой. У меня, по крайней мере, так. После применение Unlocker винду тоже немного колбасит, но не так критично - на секунду пропадает Рабочий стол и снова появляется. То есть не очень красиво.

MKN 29-11-2014 11:37 2437212

Цитата:

Цитата Kopejkin
Смысл примера - убить explorer и сразу же его запустить. »

Попробуй командно :
Цитата:

Taskkill /f /im explorer.exe
start explorer.exe
или плагин http://nsis.sourceforge.net/NsRestartExplorer_plug-in - работает оч быстро на XP, на Win8 - тормоз
У меня рестарт проводника в W8x32 происходит нормально - на секнду исчезают значки раб стола и затем восстанавливаются. Может как то и можно принудительно "заморозить" на время рестарта это не красивое исчезновение - не знаю...

Kopejkin 29-11-2014 20:45 2437382

Цитата:

Цитата MKN
...в W8x32 происходит нормально »

У меня Windows 8.1x64.
Командно работает точно также. Оказывается explorer.exe убивается и запускается - его видно в диспетчере задач - но какой-то недоделанный. Чтобы стал виден Рабочий стол, Проводник нужно запустить из Диспетчера как новую задачу.
В общем, не знаю, как правильно пояснить.
Может маленькое видео поможет.

Vincent7 30-11-2014 23:27 2437791

Здравствуйте господа форумчане. Спустя много времени я решил вернутся к своему старому проекту, а посему нужна ваша помощь. Как из окошка исполняемой консольной программы передать все что там выводится в функцию nsis? Логирование в реальном времени. Это нужно прежде всего, чтобы "поймать" нужное сообщение, и послать окошку нажатие enter как только оно(нужное сообщение) появится, ну и чтобы посылать весь лог в detailed окно nsis. Вы скажете "а почему бы тебе не использовать execdos plug-in для этих целей?" С ним- не получается почему-то.Использую execcmd.

Sann-X! 01-12-2014 09:02 2437862

Нашел решение своей проблемы с плагинами. По умолчанию при вызове ф-ции из плагина dll-ка перед выполнением загружается в память, а после выполнения выгружается из памяти. И так каждый раз при вызове любой ф-ции dll. Поэтому данные в памяти не сохраняются между вызовами dll. Чтобы dll каждый раз не выгружалась, следовало использовать "/NOUNLOAD" или "SetPluginsUnload". Однако с версии 2.42 эти "штуки" считаются устаревшими и не рекомендуются для использования. Вот здесь в последнем сообщении есть пример на Delphi, как создать dll, которая сохраняет память между вызовами ее ф-ций.

K.A.V. 01-12-2014 17:59 2438138

Цитата:

Цитата Vincent7
Вы скажете "а почему бы тебе не использовать execdos plug-in для этих целей?" С ним- не получается почему-то »

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

Цитата:

Цитата Vincent7
Использую execcmd. »

У ExecCmd нет такой возможности, как
Цитата:

Цитата Vincent7
из окошка исполняемой консольной программы передать все что там выводится в функцию nsis? Логирование в реальном времени »

а у ExecDos есть, для этого нужно использовать ключ /TOFUNC

Интересно, он прочитает документацию к плагину и посмотрит примеры, или как год назад начнёт насиловать мозг глупыми вопросами?

Vincent7 01-12-2014 20:12 2438174

Читал. Пробовал. Не получается. Как скажите мне, отправлять что то окну если при использовании execdos это окно не создается? Я общался с создателем execdos и execcmd, и он мне посоветовал с моей задачей использовать execcmd. Вместо сарказма могли бы помочь..

K.A.V. 01-12-2014 21:30 2438212

Цитата:

Цитата Vincent7
Читал. Пробовал. Не получается »

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

Цитата:

Цитата Vincent7
Как скажите мне, отправлять что то окну если при использовании execdos это окно не создается? »

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

Вы хотите, чтобы я сейчас опять за вас начал прочитывать сообщения годичной давности в этой теме и начал повторять их содержимое?

Цитата:

Цитата Vincent7
Вместо сарказма могли бы помочь.. »

Помочь, ключевое слово, а не сделать за вас.

Всё-таки придётся сделать за вас. Данный пример кода создаёт текстовый документ в папке с выходным файлом, в котором будет результат исполнения команды help.exe, которая находится в системной директории.

Скрытый текст

Код:


Name "Test"
OutFile "TOFUNC_TEST.exe"


Function LogFunction
  Pop $2
FileWrite $R0 "$\r$\n$2"
FunctionEnd



Function .onInit

FileOpen $R0 "$EXEDIR\LOG.log" w
FileWrite $R0 "$\n"

    StrCpy $1 0
    GetFunctionAddress $0 LogFunction
    ExecDos::exec /NOUNLOAD /TOFUNC /TIMEOUT=5000 "$SYSDIR\help.exe" "" $0
    Pop $0
    ExecDos::wait $0

 FileClose $R0
 MessageBox MB_OK|MB_ICONINFORMATION "Готово"
 quit
FunctionEnd


Section
SectionEnd


Vincent7 02-12-2014 15:31 2438627

K.A.V., Спасибо за код, но ведь я же писал что в первую очередь нужно отправить enter выполняемому приложению, а используя execdos этого не сделаешь. Разве я не прав?

K.A.V. 02-12-2014 17:34 2438716

Цитата:

Цитата Vincent7
нужно отправить enter выполняемому приложению, а используя execdos этого не сделаешь »

А с помощью ExecCmd сделаешь? Причем здесь эти плагины и отправка сообщений окну?
Плагины ExecCmd и ExecDos используются для создания процесса с скрытым окном приложения. Всё. Это основной функционал.

С чего вы взяли вообще, что именно с помощью ExecCmd/ExecDos можно отправлять сообщения окну?
Ещё раз повторюсь, что пример отправки нажатия Enter в консольное приложение вам давали год назад, разве я не прав?

Со стороны это выглядит довольно глупо, начинать обсуждать год спустя то, что уже обсуждали. Вы память потеряли? Или просто опять лень теперь уже прочитать всё то, что уже написано год назад в этой теме?

Vincent7 03-12-2014 01:11 2438880

K.A.V., с помощью execcmd да, можно. А с чего вы взяли что я с чего-то взял что можно отправлять именно с помощью плагинов? Можно и подругому. Хорошо, спрошу иначе- можно ли без использования плагинов отправлять лог из выполняемого консольного приложения в nsis функцию?

MKN 03-12-2014 11:37 2438982

Цитата:

Цитата Kopejkin
В общем, не знаю, как правильно пояснить.
Может маленькое видео поможет. »

Да, лажа на видео... Но у меня на восьмёрке вроде как всё нормально происходит. Если можно назвать нормальным, явную задержку при перерисовке стола...

Я пробовал разные утилитки, предназначенные специально для рестарта - всё в целом одно и то же - тормоза и визуально ужасно...

Например, : RestartExplorer ( Author Winaero )
Performs a graceful restart of the Explorer shell in Windows 10, 8, 7 and Vista. Explorer will save your preferences, i.e. icons order on Desktop and then restart.
http://winaero.com/download.php?view.1783

http://www.nirsoft.net/utils/restart_explorer.html

RightClick Restart Explorer http://www.thewindowsclub.com/right-...o-context-menu

Кстати, лучше всех отрабатывает батник, вообщем такой же что я уже тебе давал + организована пинг-задержка :

Цитата:

echo off
mode 72,3
title Explorer Restart - v1.3
if exist TEMP_FILE goto erro_1
echo Security to not open two Explorer Restart>TEMP_FILE
taskkill /F /IM explorer.exe >NUL
echo Explorer Closed, Starting...
ping 127.0.0.1 >NUL
start %systemroot%\explorer.exe
del TEMP_FILE
echo Explorer restarts, wait few seconds for this window closes.
ping 127.0.0.1 >NUL
exit
:erro_1
echo Already have an Explorer Restart In Progress.
ping 127.0.0.1 >NUL
exit
На винампе предложили такой код :

Цитата:

!include LogicLib.nsh
!include WinMessages.nsh

Name RestartExplorer
OutFile RestartExplorer.exe
RequestExecutionLevel user
ShowInstDetails show

!macro _IsWindow _a _b _t _f
IsWindow `${_b}` `${_t}` `${_f}`
!macroend
!define IsWindow `"" IsWindow`

!macro RestartExplorer
Push $R0
Push $R1
FindWindow $R0 Shell_TrayWnd
${If} ${IsWindow} $R0
IntOp $R1 ${WM_USER} + 436
System::Call `user32::PostMessage(i R0, i R1, i 0, i 0)`
${For} $R1 1 20
Sleep 1000
FindWindow $R0 Shell_TrayWnd
${IfNot} ${IsWindow} $R0
Exec `"$WINDIR\explorer.exe"`
${Break}
${EndIf}
${Next}
${EndIf}
Pop $R1
Pop $R0
!macroend

Section Main
!insertmacro RestartExplorer
SectionEnd
Только всё это - один хрен... Тормоза и визуально не красиво...

(Про не отображение эксплорера плагином, автор пока ничего не сказал...)

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

(есть ещё экзотика с манипуляцией помещения файлов в память и чего то там ещё, но это для крутых программеров..)

Ну и ещё используется вариант - подмена исходных файлов на нужные, с переименованием исходных . Это дело известное и похоже, самое эффективное...

Также можно использовать сторонние утилитки типа inuse.exe или MoveFile
Цитата:

Inuse.exe предоставляет пользователям и администраторам возможность оперативно заменять файлы, которые в данный момент используются операционной системой.
http://download.microsoft.com/downlo...N-US/inuse.exe
Цитата:

Программы PendMoves (версия 1.2) и MoveFile (версия 1.01)
Автор: Марк Руссинович (Mark Russinovich)
http://technet.microsoft.com/ru-ru/s.../bb897556.aspx

Kopejkin 03-12-2014 17:19 2439193

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

MKN 04-12-2014 11:05 2439453

Цитата:

Цитата Vincent7
можно ли без использования плагинов отправлять лог из выполняемого консольного приложения в nsis функцию? »

Вроде как давно известно - используй операторы перенаправления консольных команд в файл (назови, лог файл или как угодно), а потом обрабатывай этот файл скриптом NSIS...
Конечно возможны нюансы и частные случаи, но ты ведь до сих пор ничего конкретного не сказал (какое консольное приложение запускаешь, что именно из него хочешь обработать и т.д. )...
http://www.windowsfaq.ru/content/view/260/57/
http://www.itroad.ru/standartnye-pot...oli-cmd-v-fajl
http://wiki.rosalab.ru/ru/index.php/..._вывод_консоли

Vincent7 04-12-2014 17:10 2439670

MKN , вообще-то называл год назад :) обработать надо все что в лог выводит приложение... большое спасибо за ссылки! Теперь пойду читать примеры по работе с текстом в nsis

Serg866 17-12-2014 12:31 2445013

Ребят Можно ли как-то добавить свой текст на странице прогресса установки (под прогресс баром)?
Вывод деталей установки отключён - там пусто сейчас. Хочу кое каким текстом заполнить.

MKN 17-12-2014 13:33 2445030

Цитата:

Цитата Serg866
Можно ли как-то добавить свой текст на странице прогресса установки (под прогресс баром)? »

Можно так :

Код:

OutFile "PAGE_INSTFILES_TXT_Test.exe"
InstallDir "$TEMP"
!include MUI2.nsh
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowTxt
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
; рамка вокруг области текста (если надо)
!define WS_BORDER 0x00800000

Function ShowTxt
; наш текст
StrCpy $R7 "Текст  Текст  Текст  Текст  Текст  Текст  Текст  Текст"

FindWindow $R0 "#32770" "" $HWNDPARENT

; создаём окно области текста
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R7",\
i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL}|${WS_BORDER},\
i5,i100,i445,i60,i$R0,i222,i0,i0) i.R2'

; цвет текста  &  цвет фона области текста
SetCtlColors $R2 `0x0000FF` `0x99FFFF`

; чтобы шрифт был, как и на странице (ессно можно назначить свой)
SendMessage $R0 ${WM_GETFONT} 0 0 $R9
SendMessage $R2 ${WM_SETFONT} $R9 0
FunctionEnd

Section
Sleep 1000
SectionEnd

Варианты флагов для CreateWindowEx и координаты области текста - по вкусу.

Serg866 17-12-2014 14:42 2445054

MKN, благодарю за подробный пример! Всё сработало!
Очень полезная возможность.
А можно ли туда ещё небольшую картинку приделать? Что-то вроде баннера.

MKN 17-12-2014 17:10 2445110

Цитата:

Цитата Serg866
А можно ли туда ещё небольшую картинку приделать? »

Добавь в Function ShowTxt :
Код:

!define HWND_TOP            0
!define SWP_NOSIZE          0x0001
!define SWP_NOMOVE          0x0002
!define IDC_BITMAP          1500

; например поместим картинку mypict.bmp ( размер выбран 58x80 - для "вписывания"  в уже имеющееся на странице, "хозяйство" )
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 220, i 220, i R1, i R2, i $HWNDPARENT, i ${IDC_BITMAP}, i R3, i 0) i.R2'
System::Call 'user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 00, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})'
System::Call `user32::LoadImage(i 0, t "mypict.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $R8
SendMessage $R2 ${STM_SETIMAGE} ${IMAGE_BITMAP} $R8
;  этот код обычно в Function .onGUIEnd )
System::Call 'gdi32:DeleteObject(i $R8)'

Ессно надо позаботиться о местонахождении mypict.bmp (обычно в $PLUGINSDIR через Function .onInit )

Serg866 17-12-2014 19:11 2445138

MKN, спасибо, выручаешь. И ещё один вопрос по этой теме.
Команда:
StrCpy $R7 "Текст Текст Текст Текст Текст Текст Текст Текст"

Как в ней делать перенос строки?
$\n не срабатывает(

+если можно, то подскажи, пожалуйста, как добавить ещё 2 строки с текстом над текстом, который в рамке? То есть нужен ещё просто текст над рамкой.

Ну и ещё один момент - текст почему-то редактируемый получается в рамке. Думал это из-за значения EDIT в команде System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R7",\

Попробовал STATIC - текст вообще пропал) Короче у меня руки походу растут не откуда надо)

Serg866 18-12-2014 00:42 2445217

Пока сам поковырял и погуглил по теме. Вроде получилось то что задумал.


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

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

Begin2Fly 18-12-2014 01:02 2445223

Serg866, добавьте эту строку к похожим:
Код:

SendMessage $R2 ${EM_SETREADONLY} 1 0

Serg866 18-12-2014 01:10 2445226

Begin2Fly, нее, что-то не срабатывает команда

Begin2Fly 18-12-2014 01:12 2445227

Serg866, я добавлял к коду MKN, возможно, вы что-то переделывали.
Код:

OutFile "PAGE_INSTFILES_TXT_Test.exe"
InstallDir "$TEMP"

!include MUI2.nsh
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowTxt
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

; рамка вокруг области текста
!define WS_BORDER 0x00800000

Function ShowTxt
; наш текст
StrCpy $R9 "Текст  Текст  Текст  Текст $\r$\n$\r$\n Текст  Текст  Текст  Текст"

FindWindow $R0 "#32770" "" $HWNDPARENT

System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R9",\
i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL}|${WS_BORDER},\
i5,i100,i445,i60,i$R0,i222,i0,i0) i.R2'


; цвет текста  & цвет фона
SetCtlColors $R2 `0x0000FF` `0x99FFFF`

SendMessage $R0 ${WM_GETFONT} 0 0 $R9
SendMessage $R2 ${WM_SETFONT} $R9 0
SendMessage $R2 ${EM_SETREADONLY} 1 0
FunctionEnd

Section
Sleep 1000
SectionEnd


Serg866 18-12-2014 01:17 2445228

Begin2Fly , да я наворотил что-то там... Отправил Вам в личку код.
Надо его облагородить.

MKN 18-12-2014 11:40 2445314

Цитата:

Цитата Serg866
текст почему-то редактируемый получается в рамке. »

Потому что гладиолус :) флаг EDIT. Как уже было сказано - играй флагами по вкусу.
Как ты уже правильно хотел сделать, поменяй EDIT на STATIC. И, раз не нужно редактирование, удали не нужные флаги. Т.е. ,будет :
Код:

System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R7",i ${WS_CHILD}|${WS_VISIBLE},\
i5,i80,i445,i60,i$R0,i222,i0,i0) i.R2'

WS_CHILD - Дочернее окно.
WS_VISIBLE - Создается окно, которое сразу становится видимым.
По умолчанию окна создаются невидимыми, и для их отображения требуется вызывать функцию ShowWindow .

можно ещё короче :

Код:

System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R7",i${DEFAULT_STYLES},\
i5,i80,i445,i60,i$R0,i222,i0,i0) i.R2'

Если нужна прокрутка, оставь ${WS_VSCROLL} (для случая, когда весь текст не вмещается в область созданного окна)
(Если не хочется видеть полосу прокрутки, а текста много - расширь область окна, смести прогресс бар повыше и сделай уже его полоску. Вариантов много.)

ps про всё это уже говорилось в теме

MKN 19-12-2014 12:50 2445686

Serg866,
Вот вариант для PAGE_INSTFILES с собственным окном для текста, с текстом-заголовком над этим окном и картинкой :

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

OutFile "PAGE_INSTFILES_TXT_Pict_Test.exe"
Name "PAGE_INSTFILES_TXT_Pict"
InstallDir "$TEMP"
!include MUI2.nsh
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowTxt
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
ShowInstDetails nevershow
!define WS_BORDER 0x00800000
!define HWND_TOP            0
!define SWP_NOSIZE          0x0001
!define SWP_NOMOVE          0x0002
!define IDC_BITMAP          1500

Var hBitmap

Function .onInit
  InitPluginsDir
  File /oname=$PLUGINSDIR\vinni.bmp "vinni.bmp"
FunctionEnd

Function ShowTxt
StrCpy $R9 "Текст в окне                                                                      Текст в окне$\r$\n\
Текст в окне                                                                    Текст в окне$\r$\n\
Текст в окне                                                                    Текст в окне$\r$\n\
Текст в окне                                                                    Текст в окне$\r$\n\
Текст в окне                                                                    Текст в окне$\r$\n\
Текст в окне                                                                    Текст в окне$\r$\n\
Текст в окне                                                                    Текст в окне$\r$\n\
Текст в окне                                                                    Текст в окне$\r$\n\
Текст в окне                                                                      Текст в окне"

FindWindow $R0 "#32770" "" $HWNDPARENT

System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R9",\
i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_AUTOVSCROLL}|${WS_BORDER},\
i5,i100,i445,i100,i$R0,i222,i0,i0) i.R1'

SetCtlColors $R1 `0x0000FF` `0x99FFFF`
SendMessage $R0 ${WM_GETFONT} 0 0 $R9
SendMessage $R1 ${WM_SETFONT} $R9 0
SendMessage $R1 ${EM_SETREADONLY} 1 0

StrCpy $R8 "Текст над окном"
System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R8",i ${WS_CHILD}|${WS_VISIBLE},i15,i75,i445,i20,i $R0,i122,i0,i0) i.R5'

SendMessage $R0 ${WM_GETFONT} 0 0 $R8
SendMessage $R5 ${WM_SETFONT} $R8 0

; помещаем на страницу картинку "vinni.bmp" (размеров 58x80)
        System::Call `kernel32::GetModuleHandle(i 0) i.R3`
    System::Call `user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i370, i110, i58, i80, i $R0, 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\vinni.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
    Pop $hBitmap
    SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $hBitmap
FunctionEnd

; Free loaded resources.
Function .onGUIEnd
; Destroy the bitmap.
System::Call `gdi32::DeleteObject(i s)` $hBitmap
 FunctionEnd

Section
Sleep 500
SectionEnd




Painkiller 19-12-2014 14:18 2445739

Народ , в чем может быть проблема кода :
Код:

${If} ${KeyExists} "${HKLM}\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}"
DetailPrint '[Присутствует] KB2881071 '
${Else}
DetailPrint '[не Установлено] KB2881071'
${EndIf}

Ключ не существует , а код говорит обратное =((
Ось 7 x64

MKN 19-12-2014 16:10 2445800

Painkiller,

Что это у тебя за синтаксис ?...

попробуй такие варианты :
Код:

ClearErrors
ReadRegStr $0 HKLM "SOFTWARE\App" ""
${If} ${Errors}
  # ключ не существует
${EndIf}

или

Код:

ClearErrors
EnumRegKey $ 0 HKCR "SOFTWARE\App" 0
IfErrors 0 keyexist
  # ключ не существует
keyexist:


Painkiller 19-12-2014 17:51 2445828

Цитата:

Цитата MKN
Что это у тебя за синтаксис ?... »

Взял из справочника , использую плагин RegistryFunc
Цитата:

Цитата MKN
попробуй такие варианты : »

MKN, попробовал твой пример, теперь ключ не существует, не зависимо от того, есть он или нету =((

Код:

ClearErrors
ReadRegStr $0 HKLM "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{8BEEA2FC-D416-428A-B52A-A3ED45921151}" ""
${If} ${Errors}

DetailPrint '[не Установлено] KB2553140'
${Else}
DetailPrint '[Установлено] KB2553140'

${EndIf}

Нашёл рабочее решение :

Код:

!include "Registry.nsh"
.....

; ----- KB2881071 -----------
${registry::KeyExists}  "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}" $9
StrCmp $9 0 0 +2
DetailPrint '[Присутствует] KB2881071'
StrCmp $9 -1 0 +2
DetailPrint '[нету] KB2881071'
SectionEnd

Но мне нужно засунь определенные действия в каждый из случаев . ${If} ${Else}${EndIf} не прокатывают =((

MKN 20-12-2014 10:25 2446024

Painkiller,
Конечно не работает, ведь ReadRegStr читает не сам ключ, а его значение (а оно у тебя пусто, или по факту какое то есть ? Если есть, то вполне можно "привязаться" к нему)
Если значения нет, используй EnumRegKey, с ним работает :
Код:

ClearErrors
EnumRegKey $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}" 0
IfErrors 0 keyexist
MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации."
keyexist:
MessageBox MB_OK "Дальнейший код"


K.A.V. 20-12-2014 10:40 2446025

Цитата:

Цитата Painkiller
Но мне нужно засунь определенные действия в каждый из случаев . ${If} ${Else}${EndIf} не прокатывают =(( »

Код:

${registry::KeyExists}  "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}" $9
 ${If} $9 == 0
 MessageBox MB_OK|MB_ICONINFORMATION "[Присутствует] KB2881071"
 ${Else}
 MessageBox MB_OK|MB_ICONINFORMATION "нету KB2881071"
${EndIf}


Painkiller 20-12-2014 17:04 2446125

Радовался что все получилось , да вот зря=(( Не все ключ правильно определяет (((

MKN 23-12-2014 13:32 2447250

Цитата:

Цитата Painkiller
Не все ключ правильно определяет »

В смысле ? Нужно определить не просто наличие ключа, а конкретно его название ?
Тогда можно так :
Код:

${Do}
EnumRegKey $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" $0  # перечисляются все разделы в ветке Uninstall
IntOp $0 $0 + 1
StrCpy $2 $1
${If} $2 == "{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}"
ClearErrors
MessageBox MB_OK "$1"
${EndIf}
${LoopUntil} $1 == ""


Painkiller 23-12-2014 14:45 2447271

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

MKN 23-12-2014 15:06 2447280

Painkiller,
Цитата:

Цитата Painkiller
мне нужен код чтобы при наличии ключа выполнял какие-то действия и при его отсутствии тоже выполнял определенные действия ? »

Так пример же дан. :
Код:

MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации."
keyexist:
MessageBox MB_OK "Дальнейший код"

Вместо "MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации." - пишешь свой код , когда ключа нет.

Painkiller 23-12-2014 15:17 2447284

Цитата:

Цитата MKN
Вместо "MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации." - пишешь свой код , когда ключа нет. »

А где писать когда ключ есть ?

Ладно, решу проблему на delphi

MKN 23-12-2014 15:30 2447290

Цитата:

Цитата Painkiller
А где писать когда ключ есть ? »

Так очевидно же - после метки keyexist: , т.е. вместо "MessageBox MB_OK "Дальнейший код"
Т.е. , ещё раз - нет ключа: весь твой код установки до keyexist:
Есть ключ: весь необходимый код после keyexist:

MKN 25-12-2014 16:35 2448160

Используем с помощью функции AddFontResourceEx - на страницах шрифт, НЕ установленный в системе.

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


комплект для сборки : http://www.mediafire.com/?eh3doa9jt5h34gf

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

!addplugindir .
!include nsDialogs.nsh
!include WinMessages.nsh
!include "FileFunc.nsh"

Page Custom mypagecreate
Page InstFiles
OutFile "TimeFont_RoundFace.exe"

Var dlg
Var button
Var Font1
Var Label
Var Label2
Var Label3
; рамка вокруг окна цифрового табло (не нужна при чёрном фоне)
!define WS_BORDER 0x00800000

Function .onInit
 InitPluginsDir
 File "/oname=$pluginsdir\DIGIFACE.ttf" "DIGIFACE.ttf"
 System::Call 'GDI32::AddFontResourceEx(t"$pluginsdir\DIGIFACE.ttf",i 0x30,i0)'
 File "/oname=$pluginsdir\Faux Snow BRK.ttf" "Faux Snow BRK.ttf"
 System::Call 'GDI32::AddFontResourceEx(t"$pluginsdir\Faux Snow BRK.ttf",i 0x30,i0)'
FunctionEnd

Function .onGUIInit
; вызов DLL для перемещения окна за любую точку
MoveAnywhere::Hook
; окно всегда поверх
System::Call "user32::SetWindowPos(i$HWNDPARENT,i-1,i,i,i,i,i3)"
; убрать заголовок 
System::Call `user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},0x9480084C)i.R0`
; убрать пунктирную рамку границы при перетаскивании окна
System::Call "user32::SystemParametersInfo(i0x0025,i0,*i.R0,i0)"
System::Call "user32::SystemParametersInfo(i0x0025,i1,i0,i0)"
FunctionEnd

Function .onGUIEnd
System::Call "user32::SystemParametersInfo(i0x0025,iR0,i0,i0)"
FunctionEnd
 
Function mypagecreate
nsDialogs::Create 1018
Pop $dlg
; цвет фона страницы (круга)
SetCtlColors $HWNDPARENT "" 0x972FFF
SetCtlColors $dlg "" 0x972FFF

${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$4 : $5 : $6",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i5,i60,i170,i50,i$dlg,i222,i0,i0) i.R2'
; цвет цифры - фон
SetCtlColors $R2 `0xFF0000` `0x000000`

CreateFont $R9 "DIGIFACE" 27
SendMessage $R2 ${WM_SETFONT} $R9 0

${NSD_CreateButton} 50u 82u 30 20 "OFF"
Pop $button
; фейс в виде круга
System::Call "*(i, i, i, i)i.r0"
System::Call "User32::GetClientRect(i$HWNDPARENT, ir0)"
System::Call "*$0(i, i, i.r1, i.r2)"
IntOp $1 $1 + 5
IntOp $2 $2 + 30
System::Call "Gdi32::CreateRoundRectRgn(i0,i0,i200,i200,i200,i200)i.r0"
System::Call "User32::SetWindowRgn(i$HWNDPARENT, ir0, i1)"

  ; Font снежинки (цифры и буквы - форма снежинок)
  CreateFont $Font1 "Faux Snow BRK" 30
  ${NSD_CreateLabel} 50u 5u 20u 20u "0"
  Pop $Label3
  SendMessage $Label3 ${WM_SETFONT} $Font1 0
  SetCtlColors $Label3 0xFFFFFF 0x972FFF
 
  ${NSD_CreateLabel} 20u 78u 20u 20u "0"
  Pop $Label
  SendMessage $Label ${WM_SETFONT} $Font1 0
  SetCtlColors $Label 0xFFFFFF 0x972FFF
 
  ${NSD_CreateLabel} 80u 78u 20u 20u "0"
  Pop $Label2
  SendMessage $Label2 ${WM_SETFONT} $Font1 0
  SetCtlColors $Label2 0xFFFFFF 0x972FFF

${NSD_OnClick} $button done
${NSD_CreateTimer} OnTimer 1000
nsDialogs::Show
${NSD_KillTimer} OnTimer
FunctionEnd

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

Function done
SendMessage $hwndparent ${WM_CLOSE} 0 0
FunctionEnd

Section
SectionEnd


Пример 2. Используем свой шрифт для оригинальных надписей на странице + туда же поместим снежинки


комплект для сборки : http://www.mediafire.com/?re6kc7ts9ww33hd

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

OutFile "PictBg_Font.exe"
Name "MyFont"

Function onguiinit
 InitPluginsDir
 File "/oname=$pluginsdir\OdessaScriptFWF.ttf" "OdessaScriptFWF.ttf"
 System::Call 'GDI32::AddFontResourceEx(t"$pluginsdir\OdessaScriptFWF.ttf",i 0x30,i0)'
 File "/oname=$pluginsdir\Faux Snow BRK.ttf" "Faux Snow BRK.ttf"
 System::Call 'GDI32::AddFontResourceEx(t"$pluginsdir\Faux Snow BRK.ttf",i 0x30,i0)'
 File "/oname=$pluginsdir\Almonte Snow.ttf" "Almonte Snow.ttf"
 System::Call 'GDI32::AddFontResourceEx(t"$pluginsdir\Almonte Snow.ttf",i 0x30,i0)'
 File /oname=$PLUGINSDIR\p.bmp "p.bmp"
FunctionEnd

!define MUI_CUSTOMFUNCTION_GUIINIT onguiinit
!include MUI2.nsh
Page custom fnc_Create
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Var dlg
Var Bitmap
Var BitmapHandle
Var Label
Var Font
Var Label2
Var Font2
Var Label3
Var Font3

Function fnc_Create
nsDialogs::Create 1044
Pop $dlg
GetDlgItem $1 $hwndparent 1028
ShowWindow $1 0
GetDlgItem $1 $hwndparent 1035
ShowWindow $1 0

CreateFont $Font "Faux Snow BRK" 50
${NSD_CreateLabel} 10u 160u 400u 50u "0 1 2 3 4 5 6"
Pop $Label
SendMessage $Label ${WM_SETFONT} $Font 0
SetCtlColors $Label 0x0080FF transparent
 
CreateFont $Font2 "OdessaScriptFWF" 45
${NSD_CreateLabel} 50u 10u 300u 50u "С Новым Годом !"
Pop $Label2
SendMessage $Label2 ${WM_SETFONT} $Font2 45
SetCtlColors $Label2 0xFF0000 transparent
 
CreateFont $Font3 "Almonte Snow" 40
${NSD_CreateLabel} 65u 60u 300u 50u "forum.oszone.net"
Pop $Label3
SendMessage $Label3 ${WM_SETFONT} $Font3 40
SetCtlColors $Label3 0x400080 transparent

  ${NSD_CreateBitmap} 0 0 100% 100% ""
  Pop $Bitmap
  StrCpy $0 $PLUGINSDIR\p.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

Section
SetAutoClose true
SectionEnd


Mafia_forever 29-12-2014 16:31 2449612

Хочу чтоб инсталл копировал файл находящийся рядом сним
Пишу так (File "$EXEDIR\setup.arc) на что компилятор ругается , как решить это ?

Painkiller 29-12-2014 16:35 2449613

Цитата:

Цитата Mafia_forever
Пишу так (File "$EXEDIR\setup.arc) на что компилятор ругается , как решить это ? »

Код:

${If} ${FileExists} "$EXEDIR\setup.arc"

тут код копирования

${EndIf}


K.A.V. 29-12-2014 16:36 2449614

Цитата:

Цитата Mafia_forever
Пишу так (File "$EXEDIR\setup.arc) на что компилятор ругается , как решить это ? »

Справочник по NSIS
Почитайте различие команд File и Copyfiles

Mafia_forever 31-12-2014 12:22 2450307

Painkiller Большое спасибо!!!

MKN 05-01-2015 15:41 2452234

Бегущая текстовая строка

Код:

!include "nsDialogs.nsh"
OutFile "ScrollTxt.exe"
Page custom myPage

var dialog
var txt

Function myPage
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateText} 0 0 100% 8% "С Рождеством !  "
Pop $txt
SetCtlColors $txt 0xFF0000 0xffffff
${NSD_CreateTimer} OnTimer 250
nsDialogs::Show
${NSD_KillTimer} OnTimer
FunctionEnd

Function OnTimer
${NSD_GetText} $txt "$1"
StrCpy $2 $1 1  #  в $2 будет помещен первый символ из $1
StrCpy $1 "$1$2" "" 1    #  из $1$2 будет отсечен первый символ и помещён в $1
${NSD_SetText} $txt "$1"
FunctionEnd

Section
SectionEnd

В данном примере текст "бежит" справа налево. Вопрос : как изменить направление движения ?

K.A.V. 06-01-2015 13:18 2452585

Цитата:

Цитата MKN
В данном примере текст "бежит" справа налево. Вопрос : как изменить направление движения ? »

У тебя же код уже есть, достаточно изменить команды StrCpy в нужный формат...

Код:

!include "nsDialogs.nsh"
OutFile "ScrollTxt.exe"
Page custom myPage

var dialog
var txt

Function myPage
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateText} 0 0 100% 8% "С Рождеством !  "
Pop $txt
SetCtlColors $txt 0xFF0000 0xffffff
${NSD_CreateTimer} OnTimer 250
nsDialogs::Show
${NSD_KillTimer} OnTimer
FunctionEnd

Function OnTimer
${NSD_GetText} $txt "$1"
StrCpy $2 $1 "" -1
StrCpy $1 "$2$1" -1
${NSD_SetText} $txt "$1"
FunctionEnd

Section
SectionEnd


MKN 06-01-2015 14:16 2452599

K.A.V.,
Вот спасибо ! Как всё просто. А я нагородил, что все буквы, как взрывом разбрасывало по строке... :)

Может подскажешь, как в таком забавном коде, задать конкретное направление (слева-направо) ? А то какие то качели получаются :

Задаём траекторию движения с помощью Math и NsResize плагинов ( http://nsis.sourceforge.net/NsResize_plug-in )

Код:


!AddPluginDir .
!include MUI2.nsh
Name MathLabel
OutFile MathLabel_Test.exe

Page Custom MyPage
!insertmacro MUI_LANGUAGE English

Var Label

Function MyPage
  nsDialogs::Create 1018
  Pop $R0
  ${NSD_CreateLabel} 100% 100% 60u 10u `  C Рождеством !`
  Pop $Label
  SetCtlColors $Label 0xFF0000 0xFFFFFF
  StrCpy $R0 0
  ${NSD_CreateTimer} MathMove 50
  nsDialogs::Show
  ${NSD_KillTimer} MathMove
FunctionEnd

Function MathMove
Math::Script `R0 = R0 + 0.05; R1 = 140 + sin(R0) * 140; R2 = 5 + cos(R0) * 0`
nsResize::Set $Label $R1u $R2u `` ``
FunctionEnd

Section
SectionEnd

Движение и скорость, в зависимости от установленных значений, может быть и по окружности и любыми другими загогулинами...
Например, Math::Script `R0 = R0 + 0.1; R1 = 140 + cos(R0) * 140; R2 = 55 + sin(R0) * 50`

K.A.V. 06-01-2015 17:12 2452673

Цитата:

Цитата MKN
Может подскажешь, как в таком забавном коде, задать конкретное направление (слева-направо) ? »

А ты описание плагинов вообще читаешь, которые в твоих примерах прописаны? :teeth:

nsResize::Set функция для того, чтобы изменить расположение/размер элемента, первые два параметра:
Цитата:

Цитата ReadMe.txt
nsResize::Set control_HWND x y width height

соответственно, это и есть то, что тебе нужно, позиция по горизонтали и вертикали соответственно
Math плагин в твоём примере просто генерирует тебе координаты точек, по которым затем nsResize перемещает элемент
Отсюда делаем вывод, что ты можешь простыми командами сам высчитывать необходимые тебе координаты для элемента, как в пример:

Код:

!AddPluginDir .
!include MUI2.nsh
Name MathLabel
OutFile MathLabel_Test.exe

Page Custom MyPage
!insertmacro MUI_LANGUAGE English

Var Label

Function MyPage
strcpy $R9 0

  nsDialogs::Create 1018
  Pop $R0
  ${NSD_CreateLabel} 100% 100% 60u 10u `  C Рождеством !`
  Pop $Label
  SetCtlColors $Label 0xFF0000 0xFFFFFF
  StrCpy $R0 0
  ${NSD_CreateTimer} MathMove 50
  nsDialogs::Show
  ${NSD_KillTimer} MathMove
FunctionEnd

Function MathMove
intop $R9 $R9 + 1
StrCmp $R9 "100" 0 +2
strcpy $R9 0
nsResize::Set $Label $R9u $R2u `` ``

FunctionEnd

Section
SectionEnd

Если хочешь делать "туда-сюда" до границ инсталлятора, то тебе нужно сначала рассчитать количество точек в горизонтали интерфейса

MKN 06-01-2015 21:26 2452774

Цитата:

Цитата K.A.V.
nsResize перемещает элемент
Отсюда делаем вывод, что ты можешь простыми командами сам высчитывать необходимые тебе координаты для элемента »

Это не совсем то, что я имел ввиду... При таком раскладе этот пример мало отличается от предыдщего с манипуляциями с StrCpy.
Интересна "формула" в Math плагине, задающего траекторию движения. Возможно ли изменить математику для прямолинейного одностороннего движения ? Касательно описания этого плагина - а нет никакого внятного описания, окромя запутанного примера, по которому вообще ни черта не понятно... :)

K.A.V. 06-01-2015 21:49 2452779

Тебе что нужно то в итоге? Либо я тебя не понял, либо ты просто закидываешь код ненужными плагинами и командами, т.к.:
Цитата:

Цитата MKN
При таком раскладе этот пример мало отличается от предыдщего с манипуляциями с StrCpy. »

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

Цитата:

Цитата MKN
Возможно ли изменить математику для прямолинейного одностороннего движения ? »

Зачем тебе использовать плагин для этого? Чтобы сделать простейшую операцию сложения?? :dont-know
Я же тебе дал пример, чтобы переместить элемент чисто в горизонтали - нам не нужен плагин Math, если ты хочешь сделать свои карусели, что кружит элемент, как в твоём примере -это другой вопрос

MKN 07-01-2015 09:17 2452890

Цитата:

Цитата K.A.V.
а здесь мы переносим весь элемент управления в пределах нашего окна »

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

K.A.V. 07-01-2015 09:37 2452895

Цитата:

Цитата MKN
Интересно, а перемещение элементов с одновременным изменением их размера, например кнопки или собственного окна, возможно ли ? »

У тебя под носом всё))
Тебе слова width и height в строке
Код:

nsResize::Set control_HWND x y width height
ничего не говорят?

Код:

!AddPluginDir .
!include MUI2.nsh
Name MathLabel
OutFile MathLabel_Test.exe

Page Custom MyPage
!insertmacro MUI_LANGUAGE English

Var Label

Function MyPage
strcpy $R9 0
strcpy $R5 60
strcpy $R6 10


  nsDialogs::Create 1018
  Pop $R0
  ${NSD_CreateLabel} 100% 100% 60u 10u `  C Рождеством !`
  Pop $Label
  SetCtlColors $Label 0xFF0000 0xFFFFFF
  StrCpy $R0 0
  ${NSD_CreateTimer} MathMove 50
  nsDialogs::Show
  ${NSD_KillTimer} MathMove
FunctionEnd

Function MathMove
intop $R9 $R9 + 1
StrCmp $R9 "100" 0 noreset
strcpy $R9 0
strcpy $R5 60
strcpy $R6 10
noreset:
intop $R5 $R5 + 1
intop $R6 $R6 + 1
nsResize::Set $Label $R9u $R2u `$R5u` `$R6u`
FunctionEnd

Section
SectionEnd


MKN 07-01-2015 12:32 2452944

Цитата:

Цитата K.A.V.
У тебя под носом всё)) »

Ну, в данный момент не под носом, а только было в планах эксперимента, который ты успешно реализовал. :) Хороший подарок на Рождество. :) Какой однако, интересный плагин - nsResize...

Kopejkin 07-01-2015 16:39 2453045

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



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

Всех с наступившим Новым годом и рождественскими праздниками!

K.A.V. 08-01-2015 15:03 2453401

Kopejkin, добавь в код переменную в начале кода
Код:

var MyVar
и измени кусок:
Код:

  Function .onSelChange
; Переключатель компонентов
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${LNG}
    !insertmacro RadioButton ${DLLB}
    !insertmacro RadioButton ${PATCH}
  !insertmacro EndRadioButtons
    ; MessageBox MB_OK "$$1 = $1"
  FunctionEnd

на этот:
Код:

  Function .onSelChange
; Переключатель компонентов
  !insertmacro StartRadioButtons $MyVar
    !insertmacro RadioButton ${LNG}
    !insertmacro RadioButton ${DLLB}
    !insertmacro RadioButton ${PATCH}
  !insertmacro EndRadioButtons
    ; MessageBox MB_OK "$$1 = $1"
  FunctionEnd


Kopejkin 08-01-2015 16:01 2453421

K.A.V., спасибо большое! Работает. А можно пояснить, так сказать, физический смысл назначения и использования собственной переменной?

K.A.V. 08-01-2015 17:05 2453458

Цитата:

Цитата Kopejkin
А можно пояснить, так сказать, физический смысл назначения и использования собственной переменной? »

Смысл в том, чтобы не было такой каши при исполнении в инсталляторе, как у вас.
В справочнике гляньте пример, там ещё есть такой вот кусочек кода:

Цитата:

Назначаем по-умолчанию отмеченные
Код:

Function .onInit

  StrCpy $1 ${ID_2}
  StrCpy $2 ${ID_5}

FunctionEnd


Т.е. у нас получается, что при создании группы для одной отметки из нескольких компонентов, нам необходима одна переменная, которая будет хранить данные о том, какой компонент отмечен. А т.к. мы используем дефолтную переменную $1 - значение которой миллион раз может поменяться до момента показа диалога с выбором компонентов - мы и получаем такой бред при исполнении инсталлятора. Пример не очень корректный как в оригинальных примерах из поставки в файлах NSIS (откуда был взят пример и помещен в справочник), да и сама реализация создания таких компонентов кривая, если вы постоянно читаете эту тему - могли заметить, что проблемы с секциями возникают частенько, постоянно NSIS ловит глюки на этой теме, я тут даже кому-то писал собственную функцию onSelChange (там вроде было несколько групп что ли, не помню)
На то время, когда пример был добавлен в справочник - я всех тонкостей этого вопроса не знал, поэтому там пример кода из файлов примеров NSIS
Так что в будущем, во всех ваших кодах сразу создавайте свою переменную для таких компонентов

megane68 11-01-2015 17:28 2454587

С прошедшими и с наступающим Старым НГ!
Подскажите пожалуйста, как прописать в скрипте для NSIS директорию вместе с её содержимым, чтобы не перечислять каждый файл в отдельности?
Сейчас секция в скрипте имеет вид:
Код:

Section "AllFonTV" SEC03
  SetOutPath "$INSTDIR\luaScr\user\allfontv"
  File "..\SimpleTV\AllFonTV\luaScr\user\allfontv\allfonTVDialog.htm"
  File "..\SimpleTV\AllFonTV\luaScr\user\allfontv\allfonTVDialog.lua"
  File "..\SimpleTV\AllFonTV\luaScr\user\allfontv\allfonTVRefreshPls.lua"
  SetOutPath "$INSTDIR\luaScr\user\allfontv\core"
  File "..\SimpleTV\AllFonTV\luaScr\user\allfontv\core\allfoncore.lua"
  SetOutPath "$INSTDIR\luaScr\user\allfontv"
  File "..\SimpleTV\AllFonTV\luaScr\user\allfontv\getaddress.lua"
  File "..\SimpleTV\AllFonTV\luaScr\user\allfontv\initconfig.lua"
  SetOutPath "$INSTDIR\luaScr\user\startup"
  File "..\SimpleTV\AllFonTV\luaScr\user\startup\allfontv.lua"
SectionEnd

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

Begin2Fly 11-01-2015 17:43 2454592

megane68, в шапке есть справочник по NSIS, который люди делали специально во избежание подобных вопросов.
Найдите там "Перевод справки NSIS -> File".

megane68 11-01-2015 19:47 2454653

Цитата Begin2Fly:
"Перевод справки NSIS -> File". »
Спасибо за подсказку. Собственно больше ничего и не нужно. Нашёл ключ /r.

MaGoth 13-01-2015 19:59 2455592

Привет народ.. :)

Цитата:

Цитата MKN
WimImage plug-in
Цитата:
This plugin is designed to remove the current 2GB limit in NSIS by creating and extracting images contained in .wim files that are separate to the installer.
http://nsis.sourceforge.net/WimImage_plug-in »

Это то что я думаю?!
И как оно, нормально работает?
Если кто ни будь проверял, отпишите плиз, у самого пока нет возможности проверить..

Спасибо.

MKN 17-01-2015 12:13 2457395

Цитата:

Цитата MaGoth
И как оно, нормально работает? »

Я не проверял, т.к. смысла в плагинах , для работы с большими объёмами, не вижу... Делай нужный отдельный архив, тем же 7z (Supporting files with sizes up to 16000000000 GB) , и управляй им из скрипта как угодно. Чего ещё надо...

MaGoth 17-01-2015 16:57 2457488

Цитата:

Цитата MKN
Я не проверял, т.к. смысла в плагинах , для работы с большими объёмами, не вижу... Делай нужный отдельный архив, тем же 7z (Supporting files with sizes up to 16000000000 GB) , и управляй им из скрипта как угодно.»

Не, это дохлый и убогий вариант с никому не нужными окнами распаковки и прочего...
Судя по переписке оно работает корректно:
http://forums.winamp.com/showthread.php?t=377498
Но, только на осях Вин7 и выше, членово.. :(

Есть вариант заюзать оригинальный плагин либы WimImage, но я хз как оно там и что настраивается. И будет ли полезно для Нсис..
http://sourceforge.net/projects/wimlib/


Цитата:

Чего ещё надо...
Хороший вопрос.. :clever-ma

А вообще, хорошего инсталлера надо, с:
- исправлением наконец-то сраного бага "иконки" в Нсис, которая убивается при компиляции чего угодно выше 300 мег;
- реализации его нормальной работы с разными версиями архиваторов, без убогих консольных окон и прочего мелькающего дерьма, по мере установки;
- реализации нормальной и вменяемой системы элементов управления в панели выбора компонентов, вместо кривого не-до чек-бокса;
- реализации нормальной работы с файлами выше 2 ГБ;

От этого уже давно нада (!) :yes:

K.A.V. 17-01-2015 17:54 2457515

Цитата:

Цитата MaGoth
- исправлением наконец-то сраного бага "иконки" в Нсис, которая убивается при компиляции чего угодно выше 300 мег; »

Это баг не в NSIS, это проблема ОС, попробуйте создать большой SFX архив в другой программе и увидите

Цитата:

Цитата MaGoth
- реализации его нормальной работы с разными версиями архиваторов, без убогих консольных окон и прочего мелькающего дерьма, по мере установки; »

Зависит от ваших знаний и умений работы с NSIS, в чем проблема использовать плагины типа ExecDos для скрытого запуска консольных приложений?
И в чем проблема использовать другие плагины, например NsUnzip для распаковки zip архивов и стороннюю unrar.dll для распаковки rar архивов?

Цитата:

Цитата MaGoth
- реализации нормальной и вменяемой системы элементов управления в панели выбора компонентов, вместо кривого не-до чек-бокса; »

Тоже всё реализуется, в этой теме мы уже такое вытворяли...взять хотя бы ту просьбу с 3 деинсталляторами :biggrin:
Тем более, собственные странички никуда не пропали, можно написать свой интерфейс со своими элементами/страничками и сделать его на свой вкус, заменив стандартные диалоги

Цитата:

Цитата MaGoth
- реализации нормальной работы с файлами выше 2 ГБ; »

Наверное, единственный минус NSIS, но мне кажется это сомнительным минусом. "Тяжелый" исполняемый файл много плюсов даёт?

MaGoth 17-01-2015 21:39 2457603

Цитата:

Цитата K.A.V.
Это баг не в NSIS, это проблема ОС, попробуйте создать большой SFX архив в другой программе и увидите »

Эм.. в таком случае почему у Инно или любого другого инсталлера этих проблем нет, даже близко, не зависимо от ОС ?!
Вся проблема в этом дерьме: SFX ?

Цитата:

Цитата K.A.V.
Зависит от ваших знаний и умений работы с NSIS, в чем проблема использовать плагины типа ExecDos для скрытого запуска консольных приложений?
И в чем проблема использовать другие плагины, например NsUnzip для распаковки zip архивов и стороннюю unrar.dll для распаковки rar архивов? »

Причем тут умения и прочее?
Программный продукт изначально должен быть ориентирован на большее число архиваторов, причем, встроенных на уровне его кода или компонентов. Коли его позиционируют как супер-пупер Инсталлер. А это не так, судя по всему..
Вот именно, что проблема в этих самых сторонних телодвижениях и левых длл, которые отрабатывают в стороне от основного процесса проги, а не в ней самой непосредственно, с соответствующим Гуем для юзера и прочими интерфейсными радостями встроенными непосредственно в требуемые окна установщика..
Это называется "человеческий интерфейс" у проги, которого в Нсис никогда не валялось даже близко..

Цитата:

Цитата K.A.V.
Тоже всё реализуется, в этой теме мы уже такое вытворяли...взять хотя бы ту просьбу с 3 деинсталляторами
Тем более, собственные странички никуда не пропали, можно написать свой интерфейс со своими элементами/страничками и сделать его на свой вкус, заменив стандартные диалоги »

Про 3 деинсталлятора что-то не припоминаю такого, линк плз, если не затруднит..?
Моя что-то сомневается в этом, или мы друг-друга не поняли ?! Хотелось бы видеть пример нормальной работы разношерстных компонентов, с каким угодно выбором, параметрами взаимоисключения и т.д. и т.п.. Если не трудно. :)

Цитата:

Цитата K.A.V.
Наверное, единственный минус NSIS, но мне кажется это сомнительным минусом. "Тяжелый" исполняемый файл много плюсов даёт? »

В других инсталлерах ничего тяжелого в этом нет, а пользы на миллионы.. Вот нужда у меня запаковать в нормальный инсталлер свои файлы, а их размер от 4 ГБ и ушел за 10 ГБ и выше..
И что здесь делать можно с этим огрызком ?! :dont-know

K.A.V. 17-01-2015 22:19 2457616

Цитата:

Цитата MaGoth
Эм.. в таком случае почему у Инно или любого другого инсталлера этих проблем нет, даже близко, не зависимо от ОС ?!
Вся проблема в этом дерьме: SFX ? »

Не пробовал Inno, может из-за сжатия что-то, может из-за чего ещё, насчет иконки читал где-то, что это проблема в осях, а не в самих файлах, поэтому утверждать 100% не могу, да и не особо хочется это выяснять тестами

Цитата:

Цитата MaGoth
Программный продукт изначально должен быть ориентирован на большее число архиваторов, причем, встроенных на уровне его кода или компонентов »

Должен ориентирован на сторонние архиваторы? С чего это он именно должен? У продукта есть встроенный механизм сжатия, причем не один. Всё остальное - ваши хотелки.

Цитата:

Цитата MaGoth
Вот именно, что проблема в этих самых сторонних телодвижениях и левых длл »

Вы посмотрите на возможности, которые NSIS предлагает и сколько команд имеет "из коробки", плагины - это уже дополнительные плюшки, которые не всем нужны.

Цитата:

Цитата MaGoth
которые отрабатывают в стороне от основного процесса проги, а не в ней самой непосредственно »

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

Цитата:

Цитата MaGoth
Про 3 деинсталлятора что-то не припоминаю такого, линк плз, если не затруднит..?
Моя что-то сомневается в этом, или мы друг-друга не поняли ?! Хотелось бы видеть пример нормальной работы разношерстных компонентов, с каким угодно выбором, параметрами взаимоисключения и т.д. и т.п.. Если не трудно. »

Лень искать и перечитывать всё, воспользуйтесь поиском по теме (по этой и по первой части, не помню, когда это было), в поиске забивайте onSelChange (по выбору компонентов) и Uninstall (по 3 деинсталляторам)
По поводу компонентов я уже говорил, можно создать свою страничку, а можно воспользоваться функцией onSelChange и своей головой, всё для работы с секциями есть в справочнике (описание команд), можете сделать какой угодно функционал, зависит только от вас

Цитата:

Цитата MaGoth
В других инсталлерах ничего тяжелого в этом нет, а пользы на миллионы.. »

А как мне видится ситуация: вы пакуете 20 гигов данных (ждёте, пока всё это запакуется), потом тестите свой инсталлер - в одном месте ошибка, делаете ещё раз - ещё ошибка, и ещё, и ещё, тратя своё время на постоянную перепаковку 20 гигов данных.
А как сделал я: я взял и "выкинул" все файлы в 7zip архив рядом с инсталлером, в основной EXE не добавляются никакие файлы, кроме необходимых интерфейсу (оформление, рюшечки всякие и т.д.), в скрипте стоит одна команда на распаковку данных из 20 гигового (заранее подготовленного) 7zip архива. У меня ошибка в коде - правка и через 5 секунд EXE собран, вы же тратите на сжатие 20 гигов прилично времени за место моих 5 секунд.

В любом случае, я не собираюсь никого ни в чем переубеждать, каждый останется при своём мнении, если вы видите преимущество Inno перед NSIS, так в чем проблема, собственно говоря? Тема обсуждения Inno на нашем форуме тоже имеется, изучайте и делайте более гибкие инсталляторы с помощью Inno, а не в NSIS :)

MaGoth 17-01-2015 23:03 2457634

Цитата:

Цитата K.A.V.
Не пробовал Inno, может из-за сжатия что-то, может из-за чего ещё, насчет иконки читал где-то, что это проблема в осях, а не в самих файлах, поэтому утверждать 100% не могу, да и не особо хочется это выяснять тестами »

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

Цитата:

Цитата K.A.V.
Должен ориентирован на сторонние архиваторы? С чего это он именно должен? У продукта есть встроенный механизм сжатия, причем не один. Всё остальное - ваши хотелки. »

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

Цитата:

Цитата K.A.V.
Вы посмотрите на возможности, которые NSIS предлагает и сколько команд имеет "из коробки", плагины - это уже дополнительные плюшки, которые не всем нужны. »

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


Цитата:

Цитата K.A.V.
Лень искать и перечитывать всё, воспользуйтесь поиском по теме (по этой и по первой части, не помню, когда это было), в поиске забивайте onSelChange (по выбору компонентов) и Uninstall (по 3 деинсталляторам)
По поводу компонентов я уже говорил, можно создать свою страничку, а можно воспользоваться функцией onSelChange и своей головой, всё для работы с секциями есть в справочнике (описание команд), можете сделать какой угодно функционал, зависит только от вас »

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

Цитата:

Цитата K.A.V.
А как мне видится ситуация: вы пакуете 20 гигов данных (ждёте, пока всё это запакуется), потом тестите свой инсталлер - в одном месте ошибка, делаете ещё раз - ещё ошибка, и ещё, и ещё, тратя своё время на постоянную перепаковку 20 гигов данных.

Хм, а я так никогда не делаю, я всегда тестирую свой инсталлер на файлах "пустышках", быстро и просто.. ,)

Цитата:

А как сделал я: я взял и "выкинул" все файлы в 7zip архив рядом с инсталлером, в основной EXE не добавляются никакие файлы, кроме необходимых интерфейсу (оформление, рюшечки всякие и т.д.), в скрипте стоит одна команда на распаковку данных из 20 гигового (заранее подготовленного) 7zip архива. У меня ошибка в коде - правка и через 5 секунд EXE собран, вы же тратите на сжатие 20 гигов прилично времени за место моих 5 секунд. »
Это все лишний геморрой с тасканием вагона в прицепухе файлов, обязанных находится рядом с .ехе.. Мне что тупым юзерам также объяснять персонально каждому, что и где должно лежать и как что и зачем запускать вместо 1-го нормального вменяемого файла инсталлятора или образа на его основе ?!

Цитата:

Цитата K.A.V.
В любом случае, я не собираюсь никого ни в чем переубеждать, каждый останется при своём мнении, если вы видите преимущество Inno перед NSIS, так в чем проблема, собственно говоря? Тема обсуждения Inno на нашем форуме тоже имеется, изучайте и делайте более гибкие инсталляторы с помощью Inno, а не в NSIS »

Ну плюсы у него точно есть, хотя-бы то же пресловутое ограничений по весу, ну и + вагон всяких либ и компонентов..
Что до проблемы, то она в том что мне совсем не хочется соваться в Паскаль. Ну, противен он мне по определению.. + и я хз, как и что там надо будет изменять и сделать, если переносить туда все мое хозяйство и прочие мои хотелки, свистелки и перделки.. :clever-ma

K.A.V. 17-01-2015 23:45 2457649

Цитата:

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

А конкретно на примере? Чего не может NSIS в данном вопросе?
Добавить второй прогресс-бар на страничке установки - вроде бы не проблема, управлять его шкалой - вроде бы тоже не проблема. Есть WinAPI функции (не знаю, как в других системах инсталляторов), но с помощью WinAPI сделать можно много чего.

Цитата:

Цитата MaGoth
но мне помниться что без изменения файлов самого Нсис, это все дохлый номер »

без изменений файлов, я же делал кому-то, работало всё...вроде бы :)

MaGoth 17-01-2015 23:56 2457653

Цитата:

Цитата K.A.V.
А конкретно на примере? Чего не может NSIS в данном вопросе? »

Хм.. дайте подумать, а вот, помните я скидывал вам пдфку для игрового инсталлера, но там тупо по интерфейсу все было расписано?
Что до прогресса и либы, то да, перебор функций апи и гора этого кода в скрипте, при том чтобы все корректно работала доставляют море удовольствия. Не говоря о конкретных зависонах самого инсталла, по окончанию установки и перехода на финальную страничку..
Этот баг так и не смог поймать и искоренить. Возможно специфика Юникода хз..
+ я помнится так где-то месяца три, прикручивал либу конвертера/пакера и андпакера звука, так до конца все и не сделал. Плюнул на это дело, из-за больших возможностей Нсис, а самому писать что-то, ну если бы мог по этой части что толковое то тут бы точно не куковал, временами..


Цитата:

Цитата K.A.V.
без изменений файлов, я же делал кому-то, работало всё...вроде бы »

Хотелось бы глянуть примерчик. :yes:

Dodakaedr 18-01-2015 00:23 2457656

Подскажите как с помощью rename переместить папку(не пустую) с заменой файлов, папок при необходимости? Так не работает:
Код:

Rename $EXEDIR\App\IFX $LOCALAPPDATA
Rename $EXEDIR\App\Set\IFX $APPDATA


K.A.V. 19-01-2015 17:42 2458441

Цитата:

Цитата MaGoth
Хм.. дайте подумать, а вот, помните я скидывал вам пдфку для игрового инсталлера, но там тупо по интерфейсу все было расписано? »

Неа, не помню,всё не запомнить...

Цитата:

Цитата MaGoth
Что до прогресса и либы, то да, перебор функций апи и гора этого кода в скрипте, при том чтобы все корректно работала доставляют море удовольствия. Не говоря о конкретных зависонах самого инсталла, по окончанию установки и перехода на финальную страничку.. »

Перебор? Вам буквально 1 функция нужна по созданию элемента управления...
Гора кода?
Зависоны?
Ну,в моём примере ничего из вами перечисленного я не заметил :tongue:

Дополнительный прогресс бар

Код:

; K.A.V. Progress test

var LabelText
var ProgressBar

OutFile "PAGE_INSTFILES_MyProgress_Test.exe"
InstallDir "$TEMP"
!include MUI2.nsh
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW MyProgress
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"
ShowInstDetails nevershow




Function MyProgress
 FindWindow $R0 "#32770" "" $HWNDPARENT
System::Call 'user32::CreateWindowEx(i0,t"msctls_progress32",t"",i${WS_CHILD}|${WS_VISIBLE},i5,i120,i520,i20,i$R0,i6666,i0,i0) i.R2'

StrCpy $ProgressBar $R2
StrCpy $LabelText "[ Подготовка к началу установки ]"
DetailPrint "Подготовка к началу установки..."

 System::Call 'user32::CreateWindowEx(i0,t "Static",t "$LabelText",i${DEFAULT_STYLES},i5,i100,i525,i20,i$R0,i7777,i0,i0) i.R2'
 GetDlgItem $LabelText $R0 7777
 SendMessage $R0 ${WM_GETFONT} 0 0 $R9
 SendMessage $R2 ${WM_SETFONT} $R9 0
FunctionEnd



Section
Sleep 3000
st:
intop $0 $0 + 1
 SendMessage $ProgressBar ${PBM_SETPOS} "$0" "0"
 SendMessage $LabelText ${WM_SETTEXT} 0 'STR:Прогресс $0%'
 DetailPrint "Инфа о деталях установки...А тем временем, у нижнего прогресса $0% :)"
sleep 150
StrCmp $0 "100" 0 st
 SendMessage $LabelText ${WM_SETTEXT} 0 'STR:[ Завершено ] $0%'
SectionEnd


Section
  sleep 500
  sleep 500
  sleep 500
  sleep 500
  sleep 500
  sleep 500
  sleep 500
  sleep 500
  sleep 500
  sleep 500
  sleep 500
SectionEnd



Цитата:

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

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

Цитата:

Цитата Dodakaedr
Подскажите как с помощью rename переместить папку(не пустую) с заменой файлов, папок при необходимости? Так не работает: »

Перемещение папки возможно только в пределах одного диска, т.е. вы не сможете переместить папку, скажем, с диска C на диск D. Так же, данная функция может не отработать корректно, если файл уже существует в указанной конечной папке. Можете использовать флаг /REBOOTOK, данный флаг поможет переместить файлы после перезагрузки компьютера, если невозможно было переместить некоторые файлы (опять же, не знаю, как функция будет отрабатывать, хотите - проверьте)
Вообще, лучше бы выполнили копирование файлов и затем удаление первой директории...
А вообще, в команде в качестве конечного пути необходимо указывать новое имя папки помимо путя, куда вы собираетесь перемещать папку, например:
Код:

Rename "C:\Перемещаемая папка" "C:\Путь 1\Ещё путь\Новое имя перемещаемой папки"

Dodakaedr 20-01-2015 20:19 2458991

Кто-то знаком с плагином ExecDos? Как с помощью него перемещать папки с разных дисков?

K.A.V. 20-01-2015 20:57 2459002

Цитата:

Цитата Dodakaedr
Кто-то знаком с плагином ExecDos? Как с помощью него перемещать папки с разных дисков? »

С чего вы взяли, что этот плагин для этого предназначен? Вы хоть пробовали описание в переводчик ввести?
Цитата:

Цитата Description
Plug-in works with console applications - creates hidden child process

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

Dodakaedr 20-01-2015 21:00 2459005

Цитата:

Цитата K.A.V.
что означает, данный плагин работает с консольными приложениями, создаёт дочерний процесс с скрытием окна консольного приложения »

значить с помощью плагина можно как-то через cmd.exe сделать, а именно через команду move. Вот только как это сообразить?

K.A.V. 20-01-2015 21:05 2459007

Цитата:

Цитата Dodakaedr
значить с помощью плагина можно как-то через cmd.exe сделать, а именно через команду move. Вот только как это сообразить? »

Не ищите лёгких путей? Ну, раз говорите, что "можно", так попробуйте это сделать, примеры команд плагина есть в архиве, посмотрите примеры и попробуйте что-то сообразить с командой move

Dodakaedr 20-01-2015 23:46 2459071

K.A.V., Как указать папку ProgramData?
Код:

CopyFiles "$EXEDIR\Data\IFX\*.*" "здесь путь к programdata\IFX"

K.A.V. 21-01-2015 00:38 2459083

Цитата:

Цитата Dodakaedr
K.A.V., Как указать папку ProgramData? »

А что за папка такая ProgramData? Вы же наверное в курсе, куда она ведёт и что в ней за файлы?
C:\Users\All Users = C:\ProgramData

Теперь мы знаем, что это за папка и какая переменная нам нужна (знают сразу те, кто прочел справочник в отличии от вас, видимо)

Затем мы берём и открываем наше чудо под названием Справочник по NSIS, читаем страничку Переменные NSIS (Variables), прочтя, находим такую строку на страничке:
Цитата:

$APPDATA — папка с данными учётной записи пользователя (c:\Documents and Settings\Ваше имя\Application Data\ или c:\Documents and Settings\All Users\Application Data\). Для неё справедливо замечание SetShellVarContext, равно как и для $DESKTOP.
Соответственно, делаем вывод, что эта та переменная, которая нам нужна, но лишь с той поправкой, что перед её использованием нам необходимо использовать команду SetShellVarContext all, чтобы значение переменной указывало не в профиль пользователя, а в профиль всех пользователей.

Код:

SetShellVarContext all
CopyFiles "$EXEDIR\Data\IFX\*.*" "$APPDATA\IFX"
SetShellVarContext current


Limonica 04-02-2015 17:25 2466339

Задача: перевести строку с данными в бинарный вид:

Исходная строка:
Код:

74DB-AB80-4706
Переводим в HEX:
Код:

373444422d414238302d34373036
Нужно чтоб было в таком виде:
Код:

37003400440042002D0041004200380030002D003400370030003600
Сложность представляет не перевод в HEX, а именно привести в вид 370034004400 что бы после каждого значения стояли нули. Есть идеи?

K.A.V. 04-02-2015 19:15 2466413

Цитата:

Цитата Limonica
Сложность представляет не перевод в HEX, а именно привести в вид 370034004400 что бы после каждого значения стояли нули. Есть идеи? »

эм...если я всё правильно понял, то в чем сама сложность то? Главное логику команд продумать, а с такой задачей легко справится прекрасная команда StrCpy (описание есть в справочнике)

Код:

OutFile "test.exe"


Function .onInit
 StrCpy $0 "2B3CY6H5R4"
 now:
StrCpy $1 "$0" 2 ; Кидаем в $1 первые 2 символа из строки, которую преобразовываем
StrCpy $0 "$0" "" 2 ; Кидаем в $0 эту же строку, но отрезаем первые 2 символа, которые уже мы использовали для преобразования строки
StrCpy $2 "$200$1" ; Кидаем в $2 то, что уже есть + два числа + то, что отрезали от строки (первые 2 символа)
StrCmp $0 "" 0 now ; когда исходная строка после урезания останется пустой - тогда и закончим :)
StrCpy $2 "$2" "" 2 ; После завершения преобразования отрезаем первые два нуля в начале строки
StrCpy $2 "$200" ; После завершения преобразования добавляем последние два нуля в конец строки
 MessageBox MB_OK|MB_ICONINFORMATION "$2$\n$\nГотово!"
 quit
FunctionEnd


Section
SectionEnd


MaGoth 06-02-2015 12:52 2467302

Прив,

Хм.. при компиляции словил такую ошибку:
Цитата:

Internal compiler error #12345: error mapping file (1614438004, 33554432) is out of range.
Note: you may have one or two (large) stale temporary file(s)
left in your temporary directory (Generally this only happens on Windows 9x).
Кто нить сталкивался с подобным, и как от нее избавится есть какие идеи ?!

K.A.V. 06-02-2015 13:00 2467309

MaGoth, суммарный размер файлов проекта, которые упаковываются, не больше 2 Гб?

MaGoth 06-02-2015 13:21 2467320

Цитата:

Цитата K.A.V.
MaGoth, суммарный размер файлов проекта, которые упаковываются, не больше 2 Гб? »

Эмм.. файлы:
1-й - 89,7 МБ (94*059*011 байт)
2-й - 65,7 МБ (68*893*188 байт)
3-й - 36,3 МБ (38*131*349 байт)
4-й - 448 МБ (470*307*669 байт)
+ две папки:
1,51 ГБ (1*629*940*362 байт)
406 МБ (426*590*980 байт)

Т.е. если больше 2-х размером, то пожать он их уже не сможет ?!
Это пипец какой-то, а не инсталлер, в архиве все это дело меньше 2х будет и жмется нормально, а тут даже толковый инсталлятор хрен соберешь..
Мда, придется перебираться на Инно.. :(

K.A.V. 06-02-2015 13:31 2467324

Цитата:

Цитата MaGoth
Т.е. если больше 2-х размером, то пожать он их уже не сможет ?! »

Нет, не сможет

Цитата:

Цитата MaGoth
Это пипец какой-то, а не инсталлер, в архиве все это дело меньше 2х будет и жмется нормально, а тут даже толковый инсталлятор хрен соберешь.. »

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

MKN 06-02-2015 15:39 2467409

Цитата:

Цитата K.A.V.
либо создать отдельный файл архива, лежащий рядом с инсталером »

Самое разумное и правильное решение. Практически все огромные инсталляторы так устроены. Маленький Setup.exe и рядом архив(ы). Тот же знаменитый ISS так делает.
(тут вроде как было беспокойство, что будет мелькать окно консоли при распаковке - так нужно сделать это окно скрытым)

MaGoth 06-02-2015 15:50 2467419

Цитата:

Цитата MKN
Самое разумное и правильное решение. Практически все огромные инсталляторы так устроены. Маленький Setup.exe и рядом архив(ы). Тот же знаменитый ISS так делает. »

Хм.. а примерчика случаем рабочего нет, глянуть как оно там?

K.A.V. 06-02-2015 17:00 2467461

Вложений: 2
Цитата:

Цитата MaGoth
Хм.. а примерчика случаем рабочего нет, глянуть как оно там? »

А что там в примерчике такого сложного то вы хотите увидеть? Достаточно подготовить архив и прописать команду на распаковку с плагином ExecDos, при этом посмотрев параметры 7-Zip, которые вы будете ему передавать
Но, конечно же, проще попросить уже готовый пример, тебе помогут всё это за тебя кто-то сделает

Распаковка файлов будет производиться на рабочий стол пользователя, после распаковки будет открыта папка
В данном примере я показываю, как можно распаковать не просто полностью весь архив в папку, а как можно распаковать разные папки из архива в разные директории
Такой метод я использую в своём SFX Creator, только там код навороченнее :blush2:

Kopejkin 07-02-2015 00:42 2467698

Чем отличается ярлык на рабочем столе, создаваемый NSIS
Код:

SetShellVarContext current    # (или all)
CreateShortCut "$DESKTOP\FolderSizes 7.lnk" "$INSTDIR\FolderSizes.exe" "" "$INSTDIR\FolderSizes.exe" "" "" "" "Запустить ${PRODUCT_NAME}${PRODUCT_VERSION}"

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





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


K.A.V. 07-02-2015 10:14 2467759

Цитата:

Цитата Kopejkin
Чем отличается ярлык на рабочем столе, создаваемый NSIS »

Цитата:

Цитата Kopejkin
и ярлык, создаваемый вручную из контекстного меню файла: Отправить - Рабочий стол (создать ярлык)? »

КЭП. Зайти в свойства двух ярлыков и посмотреть различия :)
У "правильного" ярлыка прописана рабочая директория, а у вас при создании ярлыка там пустое значение, из-за этого в программе получается указанный вами глюк.

Решение.
Прописать SetOutPath перед командой создания ярлыка:
Код:

SetOutPath $INSTDIR
CreateShortCut "$DESKTOP\FolderSizes 7.lnk" "$INSTDIR\FolderSizes.exe" "" "$INSTDIR\FolderSizes.exe" "" "" "" "Запустить ${PRODUCT_NAME}${PRODUCT_VERSION}"


Kopejkin 08-02-2015 19:23 2468513

Цитата:

Цитата K.A.V.
...и посмотреть различия
...рабочая директория...там пустое значение...
Решение. Прописать SetOutPath...»

Да нет, не пустое, но... другое:
Скрытый текст

"Увидел" разницу только после того, как сделал скриншоты окон свойств.
А вот за решение спасибо. Я когда распихивал ярлыки по отдельным секциям, совершенно упустил этот момент :lamer:

Может есть решение и второй части вопроса (про ярлык с админскими привилегиями) ?

K.A.V. 08-02-2015 21:23 2468571

Цитата:

Цитата Kopejkin
Да нет, не пустое, но... другое: »

В поле "Рабочая директория", как вы думаю, догадались, ставится та директория, которая была использована в последний раз в команде SetOutPath
Просто на моём голом скрипте она оказалась пустой :)

Цитата:

Цитата Kopejkin
Может есть решение и второй части вопроса (про ярлык с админскими привилегиями) ? »

А второй вопрос вы "запихнули" между картинками про первый вопрос для особо внимательных? :up
Даже не смотрел на текст, что между картинками :biggrin:

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

K.A.V. 09-02-2015 12:51 2468847

Вложений: 1
Возвращаясь к вопросу о галочке "Запуск от имени администратора" в свойствах ярлыка.
Решил сразу написать небольшой include, может, кому пригодится...

Как подключать include файл, я думаю, все уже знают и умеют это делать?
а если нет, то...

1. Распаковываем файл из архива в папку, где лежит ваш NSIS-скрипт
2. В начале вашего NSIS-скрипта прописываем:
Код:

!include "adminShortCut.nsh"


После подключения include-файла вы можете использовать 2 команды:
Ставим отметку на чекбокс "Запуск от имени администратора"
Код:

${aSC::SetON} "полный путь к ярлыку.lnk"

Снимаем отметку с чекбокса "Запуск от имени администратора"
Код:

${aSC::SetOFF} "полный путь к ярлыку.lnk"
Пример команды
Код:

${aSC::SetON} "$DESKTOP\Мой ярлык.lnk"

MaGoth 09-02-2015 15:23 2468959

Цитата:

Цитата K.A.V.
А что там в примерчике такого сложного то вы хотите увидеть? Достаточно подготовить архив и прописать команду на распаковку с плагином ExecDos, при этом посмотрев параметры 7-Zip, которые вы будете ему передавать
Но, конечно же, проще попросить уже готовый пример, тебе помогут всё это за тебя кто-то сделает
Распаковка файлов будет производиться на рабочий стол пользователя, после распаковки будет открыта папка
В данном примере я показываю, как можно распаковать не просто полностью весь архив в папку, а как можно распаковать разные папки из архива в разные директории
Такой метод я использую в своём SFX Creator, только там код навороченнее »

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

Вообщем, все зер гут, продолжаю сидеть на NSIS-ке.. :ok:

K.A.V. 09-02-2015 18:12 2469089

Цитата:

Цитата MaGoth
Посмотрел ваш пример, для меня не сгодился, все тексты кракозябрами »

Ещё одно подтверждение того, что вам нужен далеко не пример (вы просили - я предоставил), а вам нужен конечный готовый код

Я же вам не зря писал, например, про
Цитата:

Цитата K.A.V.
при этом посмотрев параметры 7-Zip »

вам даже это лень было сделать, это ведь очевидно

Если бы вы открыли справку 7-ZIP и посмотрели бы команды+ключи, то увидили бы такой полезный ключ как -scc и после подстановки его в мой пример, то...
Код:

ExecDos::exec /NOUNLOAD /ASYNC /DETAILED '$PLUGINSDIR\7za.exe x "$EXEDIR\data.7z" -o"$2" "$1" -aoa -y -sccWIN' "" $0
И, если бы вы хотя бы попробовали поработать с плагином ExecDos (опять же, почитав его описание и посмотрев готовые примеры в архиве с плагином), то могли бы реализовать и такое, чтобы никакая информация не отображалась в детали установки из консоли приложения, кроме файлов, которые распаковываются...

Цитата:

Цитата MaGoth
и криво работает »

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

MaGoth 09-02-2015 19:42 2469160

K.A.V.
Цитата:

Ещё одно подтверждение того, что вам нужен далеко не пример (вы просили - я предоставил), а вам нужен конечный готовый код »
Ну, скажем так я и сам могу сделать то, что мне требуется, просто иногда хочется видеть готовый пример(с нормально описанными комментами) уже кем-то реализованный, чем греть голову самому и тратить свободное время на очередной "лисапед на квадратных колесах"..

Цитата:

Моё дело предложить, у меня прекрасно всё работает, я вам всего-лишь подкинул идею реализации с консольным приложением »
Полагаю что проблема в моей версии Юникодного Нсис, а не в вашем примере.. У меня он немного расшаренный..

Цитата:

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


ЗЫ, Еще один момент, можете подсказать справку или что нибудь подобное применительно работы с архивами в Нсис, из вашего примера не совсем понял, как например распаковывать содержимое отдельно взятого вложенного каталога, из кучи каталогов в архиве, ибо комментов нема.. :clever-ma

K.A.V. 09-02-2015 21:40 2469213

Цитата:

Цитата MaGoth
можете подсказать справку или что нибудь подобное применительно работы с архивами в Нсис »

Даже и не знаю, как ответить на этот вопрос...
Всё, что я видел по NSIS - оригинальная справка, с которой началось моё изучение NSIS, мне хватает того, что у меня в голове, так что по NSIS информацию не искал и не знаю, что есть помимо плагинов, примеров на оф. сайте и того, что в шапке этой темы.
Если есть конкретные вопросы - задавайте, постараемся помочь по мере текущих наших знаний в NSIS
Если брать работу с архивами, ну, что здесь можно сказать? Всё идёт к одному - к работе с консольной версией конкретного архиватора (параметры/ключи, но это можно и самому посмотреть в справке ахиватора), либо к работе с его dll, с помощью которых можно производить распаковку архива, но копаться в этом лично у меня нет желания.
Есть, опять же, плагины для NSIS, для распаковки архивов

был тут ещё разговор про RAR dll для NSIS, не знаю, работает ли эта dll для новых архивов, лень проверять

Цитата:

Цитата MaGoth
из вашего примера не совсем понял, как например распаковывать содержимое отдельно взятого вложенного каталога, из кучи каталогов в архиве »

Ну там же всё просто, какие там комменты то... :o
Код:

Section "1"
 DetailPrint "Распаковка папки 1..."
Push "Папка 1"
 Push "$INSTDIR"

  call _7ZipExtractFileFunc
SectionEnd

Push "Папка 1" - указывает, какую директорию распаковать из архива
Push "$INSTDIR" - указывает, в какую директорию распаковать
Эти команды передают функции _7ZipExtractFileFunc наши папки

Код:

Function _7ZipExtractFileFunc
  pop $2
  pop $1

 CreateDirectory "$2"
 ExecDos::exec /NOUNLOAD /ASYNC /DETAILED '$PLUGINSDIR\7za.exe x "$EXEDIR\data.7z" -o"$2" "$1" -aoa -y -sccWIN' "" $0
    Pop $0
 ExecDos::wait $0
FunctionEnd

Команды pop принимают передаваемые параметры и используют эти параметры в командной строке архиватора
$1 - директория, которая распаковывается
$2 - директория, куда распаковываются файлы

Распаковать можно с полными путями только папку, которая лежит в корне архива, нельзя распаковать (вроде бы :)) вложенную подпапку в какой-либо папке с сохранением всей структуры каталогов

MaGoth 09-02-2015 22:57 2469260

K.A.V.
Цитата:

Распаковать можно с полными путями только папку, которая лежит в корне архива, нельзя распаковать (вроде бы ) вложенную подпапку в какой-либо папке с сохранением всей структуры каталогов »
Вот конкретно распаковка вложенных каталогов и интересовала в этом вопросе. Спасибо.
Будем копать дальше..


Зы, кстати, а где можно стянуть RAR dll для NSIS, что-то ссылок не нашел, а та что есть не робит.. ?! :dont-know

K.A.V. 10-02-2015 00:08 2469283

Вложений: 1
Цитата:

Цитата MaGoth
Вот конкретно распаковка вложенных каталогов и интересовала в этом вопросе. Спасибо. »

Консольный WinRAR вроде такого тоже не умеет, либо просто я не вкуриваю, как там ключи правильно использовать :blush:

Цитата:

Цитата MaGoth
Зы, кстати, а где можно стянуть RAR dll для NSIS, что-то ссылок не нашел »

С ней нужно тягать ещё unrar.dll свежей версии, чтобы поддерживалась распаковка современных RAR5 архивов, в архиве обновил до версии 5.20, вроде распаковка работает

Не забудьте, что nsisUnRar2 будет работать только при использовании граф. интерфейса (при исполнении из секции), может, запустите и из под .onInit, копайтесь, если хотите, мне разбираться не особо интересно в этой теме :)

MaGoth 10-02-2015 01:34 2469298

Цитата:

Цитата K.A.V.
Не забудьте, что nsisUnRar2 будет работать только при использовании граф. интерфейса (при исполнении из секции), может, запустите и из под .onInit, копайтесь, если хотите, мне разбираться не особо интересно в этой теме »

Ога, ща посчупаем... :)

MKN 10-02-2015 13:30 2469464

Давеча понадобилось вывести содержимое операций из консоли - в окошко NSIS...
ExecDos, как говорится, мне в помощь, вроде как всё хорошо, но оказалось всё же совсем не хорошо... А именно :

Каким образом из окна ListBox_а можно скопировать выведенные текст-данные ? Посылал ListBox на разные стили - всё бестолку...
Наивный вопрос, но без ответа - почему русские буковки в ListBox_е, у меня в виде кракозябров ? ( В ОС (W7x32) все кодовые страницы , файлы и записи реестра приведены к 1251... Толку - ноль... )
И каким образом отображать в окне ListBox_а только первые, к примеру, нужные мне 10 строк ?

Код:

!include MUI2.nsh
;!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English
OutFile TOWINDOW_test.exe
Var Dlg
Var Log
Page custom myPage wait

Function myPage
nsDialogs::Create 1044
Pop $Dlg

${NSD_CreateListBox} 0 10 330u 100u $Log
Pop $Log

ExecDos::exec /NOUNLOAD /ASYNC /TOWINDOW "cmd /?" "" $Log
Pop $9

nsDialogs::Show
FunctionEnd

Function wait
ExecDos::wait $9
FunctionEnd

Section
SectionEnd

Цитата:

Цитата K.A.V.
о галочке "Запуск от имени администратора" в свойствах ярлыка. »

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

K.A.V. 10-02-2015 18:55 2469603

Цитата:

Цитата MKN
Каким образом из окна ListBox_а можно скопировать выведенные текст-данные ? Посылал ListBox на разные стили - всё бестолку... »

Я помню, как я настрадался с этим элементом в своём SFX Creator, у меня был такой же вопрос, но лично у меня не получилось получить текст в строке, поэтому...

Я нашел выход только в создании ListView элемента, после изучения которого переписал практически все диалоги в SFX Creator :biggrin:
Поэтому, могу тебе посоветовать плюнуть на ListBox и создать ListView элемент.

Цитата:

Цитата MKN
Наивный вопрос, но без ответа - почему русские буковки в ListBox_е, у меня в виде кракозябров ? ( В ОС (W7x32) все кодовые страницы , файлы и записи реестра приведены к 1251... Толку - ноль... ) »

А вот полезно было бы читать все странички в справке, а не только те, которые тебе нужны, в справочнике, как ни странно, есть решение этой проблемы :)
В разделе Обучение IO: собственные странички, есть раздел Примеры диалогов, в котором есть один пример Считываем данные из консольного приложения в ListView
Посмотришь ради собственного развития)
А конкретно тебе нужна WinAPI команда OemToChar, пример использования тоже есть в справке в разделе Примеры кодов на страничке Русские символы в DOS кодировке

По поводу работы с элементом ListView - читай следующее:
1. Обучение IO: собственные странички => Элементы в диалоге => ListView: список => ListView: обычный список
2. "CommCtrl.nsh" файл найдёшь на страничке Обучение IO: собственные странички => Введение
Использовать команды взаимодействия с элементами, которые описаны в этом разделе можно не только с InstallOptions - различие лишь в том, что там в команды нужно подставить правильный HWND элемента

Цитата:

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

Не совсем понял вопрос, но...в справке на страничке описания ListView есть в сааамом конце команда для перемотки списка, возможно, это то, о чем ты спросил...

Если что-то не поймёшь или будут вопросы - пиши, мне просто лень код накидывать, в последнее время вообще всё лень...

Цитата:

Цитата MKN
Хорошо, что реализовал для NSIS этот известный полезный трюк. Когда то здесь уже обсуждался, но тогда без результата. »

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

MKN 11-02-2015 12:17 2469797

Цитата:

Цитата K.A.V.
Обучение IO: собственные странички »

Очень не хотелось бы связываться с IO, который забраковали даже сами разрабы, как явно устаревший и во всём уступающий nsDialogs...
Цитата:

Цитата K.A.V.
пример Считываем данные из консольного приложения в ListView »

Даже если пересилить себя :) и связаться допотопным IO, то этот способ оч громоздский по сравнению с одной строкой
ExecDos::exec /NOUNLOAD /ASYNC /TOWINDOW

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

Код:

OutFile ExecDos_TOWINDOW.exe
!include nsDialogs.nsh
Var Dialog
Var hcli
Var ListBox
Page custom MyPage leave

Function MyPage
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateListBox} 0 20 100% 100u "$ListBox"
Pop $ListBox
;System::Call "user32::OemToChar(t$ListBox, t.$ListBox)" #ни хрена не работает, местоположение менял...
ExecDos::exec /NOUNLOAD /ASYNC /TOWINDOW "cmd /?" "" $ListBox
Pop $hcli
nsDialogs::Show
FunctionEnd

Function leave
SendMessage $ListBox ${LB_GETCURSEL} 0 0 $1
IntOp $1 $1 + 1
;MessageBox MB_OK $1
System::Call user32::SendMessage(i$ListBox,i${LB_GETTEXT},ir1,t.r1)
;System::Call "user32::OemToChar(tr1, t.r1)"    # здесь работает, но здесь не надо...
MessageBox MB_OK $1
ExecDos::wait $hcli
FunctionEnd

Section
SectionEnd

Цитата:

Цитата K.A.V.
в справочнике, как ни странно, есть решение этой проблемы »

Точно так. Знал ведь , да забыл... Но почему то не работает там, где надо (см. пример в коде, комбинировал по разному - без результата... ). Может я чего опять упустил...

Цитата:

Цитата K.A.V.
Не совсем понял вопрос, но...в справке на страничке описания ListView есть в сааамом конце команда для перемотки списка »

Я имел ввиду, что из консоли мне насыпится куча строк, а надо использовать только конкретные номера строк, а остальные ессно игнорировать...
Но с LB_GETCURSEL наверное может удастся это реализовать... Как - пока не придумал...

ps В доке сказано, что можно посылать данные с помощью /TOWINDOW не только в чёртов ListView :
Цитата:

Edit, RichEdit, ListView and ListBox supported
А как бы это сделать на практике ? Например, отправить инфу в окно Edit (с помощью nsDialogs :) ) ...

K.A.V. 11-02-2015 15:05 2469889

Цитата:

Цитата MKN
Очень не хотелось бы связываться с IO »

Цитата:

Цитата MKN
Даже если пересилить себя и связаться допотопным IO »

Ты вообще читал моё сообщение или глазами по нему пробежался? Я тебе ни слова не говорил про то, чтобы использовать IO, перечитай моё сообщение ещё раз.

Цитата:

Цитата MKN
Но оказалось есть интересный способ получить данные из ListBox_а»

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

ЗАМЕЧАНИЕ ДЛЯ ВСЕХ
Возьмите на заметку, если вы пользуетесь плагином ExecDos просто для вывода данных консольного приложения в элемент управления - используйте ключ /TOWINDOW или /DETAILED в зависимости от сиуации, НО, если же вам необходимо произвести какую-то манипуляция с теми данными, которые консольное приложение вам выдаёт - используйте ключ /TOSTACK или /TOFUNC, опять же, в зависимости от ситуации

Цитата:

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

Мой пример в моём примере :)

Цитата:

Цитата MKN
Но с LB_GETCURSEL наверное может удастся это реализовать... Как - пока не придумал... »

Я тебе ещё раз повторяю про элемент ListView, почему ты такой упёртый?

Ладно, дам тебе задание: после того, как ты свой код напишешь, всё сделаешь так, как нужно, попробуй добавить в свой любимый ListBox горизонтальную прокрутку
Хочу потом написать здесь "я же говорил" после того, как ты возьмёшься переписывать код под элемент ListView :biggrin:
всё готовенькое, как вы любите

Код:

OutFile ExecDos_TOWINDOW.exe
!include nsDialogs.nsh
Var Dialog
Var hcli
Var ListBox
Page custom MyPage  leave

Function MyPage
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateListBox} 0 20 100% 100u "$ListBox"
Pop $ListBox


    GetFunctionAddress $0 MyFunction
    ExecDos::exec /NOUNLOAD /ASYNC /TOFUNC  `cmd /?` "" $0
    Pop $hcli

nsDialogs::Show
FunctionEnd


Function leave
    ExecDos::wait $hcli
FunctionEnd


Function MyFunction
  Pop $2
 ; в эту переменную кидается по-отдельности каждая строка, которую конс. приложение выдаёт
 ; можешь пропустить и не добавлять данные в элемент (как ты хотел, можно заюзать IntOp+StrCmp, например обнуляя переменную IntOp через каждые 3 прохода)
 ; что-то типа такого...
;IntOp $R0 $R0 + 1
;StrCmp $R0 4 0 noAddString
;StrCpy $R0 0

System::Call "user32::OemToChar(tr2, t.r2)"
SendMessage $ListBox ${LB_ADDSTRING} 0 "STR:$2"
#MessageBox MB_OK|MB_ICONINFORMATION "Добавляется строка:$\n$2"

; noAddString:
FunctionEnd


Section
SectionEnd



Цитата:

Цитата MKN
ps В доке сказано, что можно посылать данные с помощью /TOWINDOW не только в чёртов ListView : »

Да лааадно? Кто-то наконец-то открыл документацию к плагину? :o :up

Цитата:

Цитата MKN
А как бы это сделать на практике ? Например, отправить инфу в окно Edit »

Может, заглянешь там ещё в папку Examples? Ходят слухи, что там что-то интересное и ты будешь рад это увидеть :)
Я могу понять некоторых личностей, но чтобы ты ленился, MKN, стыдно должно быть :(
Там же в примерах всё есть, ну не сложно же открыть этот чертов ToWindow.nsi, который лежит в архиве с плагином и посмотреть, как там всё устроено, ты же не первый день с NSIS работаешь...


В этих примерах я взял стандартный блокнот (закройте копии блокнота перед запуском скомпилированного скрипта, чтобы не записало куда попало), после его запуска скрипт закидывает данные прямо в область редактирования текста (элемент Edit)
всё готовенькое (2): /TOWINDOW с иероглифами

Код:

!addincludedir "."
!addplugindir "."
!include "WinMessages.nsh"

OutFile "!TEST.exe"


Function .onInit
exec "notepad"
stget:
Sleep 1000
  FindWindow $0 "notepad" ""
  StrCmp $0 "0" stget 0
  FindWindow $1 "Edit" "" $0
  StrCmp $1 "0" stget 0
  ExecDos::exec /TOWINDOW "cmd /?" "" $1
  quit
FunctionEnd


Section -post
SetAutoClose false
SectionEnd


всё готовенькое (3): /TOFUNC с обработкой строк и без иероглифов

Код:

!addincludedir "."
!addplugindir "."
!include "WinMessages.nsh"

OutFile "!TEST.exe"



Function .onInit
exec "notepad"
stget:
Sleep 1000
  FindWindow $0 "notepad" ""
  StrCmp $0 "0" stget 0
  FindWindow $1 "Edit" "" $0
  StrCmp $1 "0" stget 0
    GetFunctionAddress $0 MyFunction
    ExecDos::exec /NOUNLOAD /ASYNC /TOFUNC  `cmd /?` "" $0
    pop $0
    ExecDos::wait $0
  quit
FunctionEnd

Function MyFunction
  Pop $2
System::Call "user32::OemToChar(tr2, t.r2)"
SendMessage $1 ${EM_REPLACESEL} 0 "STR:$\r$\n$2"
FunctionEnd



Section -post
SetAutoClose false
SectionEnd


MKN 11-02-2015 15:35 2469904

Цитата:

Цитата K.A.V.
Я тебе ни слова не говорил про то, чтобы использовать IO, перечитай моё сообщение ещё раз. »

Хмм... А как же тогда понимать :
Цитата:

Цитата K.A.V.
В разделе Обучение IO: »

и т.д., включая пример "Считываем данные из консольного приложения" - сплошные IO :)
Понятное дело, что
Цитата:

Использовать команды взаимодействия с элементами, которые описаны в этом разделе можно не только с InstallOptions
Но этот вопрос надо сначала ещё тщательно изучить и переварить... Я с этими глистбоксами и виевирами вообще никогда не сталкивался...
Цитата:

Цитата K.A.V.
Может, заглянешь там ещё в папку Examples? »

в первую очередь заглянул - ничего интересного, т.к. опять же, в том же ToWindow.nsi - чертовы IO ( ну не дело это, использовать дополнительные ini файлы)
Цитата:

Цитата K.A.V.
В этих примерах я взял стандартный блокнот, после его запуска скрипт закидывает данные прямо в область редактирования текста (элемент Edit) »

Причём тут блокнот ?! Под Edit подразумевается созданная пользователем , автономная область окна, на странице NSIS...

Цитата:

Цитата K.A.V.
Я тебе ещё раз повторяю про элемент ListView, почему ты такой упёртый? »

Почему упёртый... Пока не вижу в ListView достойной альтернативы (во всяком случае в данный момент для своей задачи. Может потом, когда припрёт, и оценю :) ) ... И код в примере из справочника велик, и опять - c IO...

А вот пример с /TOFUNC - интересный. Спасибо.

MKN 11-02-2015 15:59 2469919

Цитата:

Цитата K.A.V.
попробуй добавить в свой любимый ListBox горизонтальную прокрутку »

Это, как раз, давно придумано :
Код:

OutFile ListBox_H-Scroll.exe
!include nsDialogs.nsh
Var Dialog
Var ReleaseNotesText
Page custom MyPage

Function MyPage
nsDialogs::Create 1018
Pop $Dialog
nsDialogs::CreateControl /NOUNLOAD ${__NSD_ListBox_CLASS} ${__NSD_ListBox_STYLE}|${WS_HSCROLL} ${__NSD_ListBox_EXSTYLE} 0 13u 262u -13u ""
Pop $ReleaseNotesText
${NSD_LB_AddString} $ReleaseNotesText "A pretty loooooooooooooooooooooooooooooooooooooooooooooooong striiiiiiiiiiing"
${NSD_LB_AddString} $ReleaseNotesText "A really long string that should be longer than the listbox that contains this message, so I can enable the horizontal scrollbar!"
SendMessage $ReleaseNotesText ${WM_GETFONT} 0 0 $R0
System::Call user32::GetDC(i$ReleaseNotesText)i.R1
System::Call gdi32::SelectObject(i$R1,i$R0)i.R0
System::Call *(i,i)i.r0
StrCpy $2 0
${NSD_LB_GetCount} $ReleaseNotesText $1
loop:
IntOp $1 $1 - 1
System::Call 'user32::SendMessage(i $ReleaseNotesText,i ${LB_GETTEXT},i $1,t.r3)'
StrLen $4 $3
System::Call 'gdi32::GetTextExtentPoint32(i $R1,t "$3",i $4,i $0)'
System::Call *$0(i.r4,i)
IntOp $4 $4 + 10 ;add a little padding
${IfThen} $4 > $2 ${|} StrCpy $2 $4 ${|}
IntCmp $1 0 "" "" loop
System::Free $0
System::Call gdi32::SelectObject(i$R1,i$R0)i
System::Call user32::ReleaseDC(i$ReleaseNotesText,i$R1)
SendMessage $ReleaseNotesText ${LB_SETHORIZONTALEXTENT} $2 0
nsDialogs::Show
FunctionEnd

Section
SectionEnd

Да. Громозда... Но зато без IO ! :)

K.A.V. 11-02-2015 16:15 2469927

Цитата:

Цитата MKN
Хмм... А как же тогда понимать : »

Цитата:

Цитата MKN
и т.д., включая пример "Считываем данные из консольного приложения" - сплошные IO »

Я же тебе ясно написал:
Цитата:

Цитата K.A.V.
Использовать команды взаимодействия с элементами, которые описаны в этом разделе можно не только с InstallOptions - различие лишь в том, что там в команды нужно подставить правильный HWND элемента »

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

Цитата:

Цитата MKN
в первую очередь заглянул - ничего интересного, т.к. опять же, в том же ToWindow.nsi - чертовы IO »

Да какая разница, на чем пример построен, IO или nsDialogs? У плагина команда не меняется в зависимости от того, что мы используем, тебе нужно смотреть синтаксис команды и какие данные в неё подставляются:
Код:

  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $R8 $0 1016
  ExecDos::exec /TOWINDOW /TIMEOUT=6000 "$EXEDIR\consApp.exe" "test_login$\ntest_pwd$\n" $R8
  Pop $R6 ; return value - process exit code or error or STILL_ACTIVE (0x103).

Здесь же прекрасно видно, что получают HWND элемента поиском окна и командой GetDlgItem, помещая результат в $R8 и далее эта переменная используется в команде с плагином...

Цитата:

Цитата MKN
Причём тут блокнот ?! Под Edit подразумевается созданная пользователем , автономная область окна, на странице NSIS... »

Ты серьёзно? Ты посмотри на мой код внимательней и ещё скажи, из чего в принципе состоит графический интерфейс каждого приложения? Из множества элементов, не?
Для тебя будет открытием, если я скажу тебе, что та самая область в блокноте, в которой ты набираешь текст - это элемент Edit?
Возьми любой похожий софт типа программки "InqSoft Window Scanner", которая тебе на интерфейсе программы/инсталлятора покажет, какие в интерфейсе типы элементов и каковы их стили

А по какому принципу, ты думаешь, работает мой код? Именно по тому, что сначала ищет окно конкретной программы (в моём случае блокнот), а затем уже ищет элемент Edit в этом самом родительском окне...Я же не мог тебе предоставить код, который бы искал не понятно где в системе элемент Edit и запихивал туда данные, ну а писать специально для этого пример на nsDialogs или IO с интерфейсом NSIS мне лень, честно говоря...кода меньше и наглядно всё видно, без лишних строк
Код:

stget:
Sleep 1000
  FindWindow $0 "notepad" ""
  StrCmp $0 "0" stget 0
  FindWindow $1 "Edit" "" $0
  StrCmp $1 "0" stget 0

Цитата:

Цитата MKN
и опять - c IO... »

промолчу...всё выше написал

Цитата:

Цитата MKN
Это, как раз, давно придумано : »

какая жесть, не удивительно, что я не додумался до этого в то время... :lol:

MKN 11-02-2015 16:28 2469936

K.A.V.,
Цитата:

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

Я внимательно читаю твои сообщения, откуда черпаю много полезного. Но ListBox и ListView, для меня совершенно новы и не знакомы... Ну не приходилось с ними ещё работать, потому и много вопросов и недоумений. :) И конечно понятное дело, что всё связанное с IO можно использовать и с nsDialogs. Только это надо сначала изучить и осознать, что требует времени, терпения и усидчивости... Со всем этим , как оказалось - проблемы... :) Но, не без твоей помощи, проблемы эти преодолеваются. А роль наставника и учителя требует терпения и снисходительности к ученикам. :) Этих качеств , как мне кажется, многие пользователи NSIS темы и тебе желают. :)

PS После адаптации примера с консолью из справочника под nsDialogs, получаю при компиляции :
Цитата:

!verbose: Invalid verbose level
Error in macro __NSD_LV_InsertColumn_Call on macroline 2
т.е. ругается на строку в коде : ${NSD_LV_InsertItem} $ListView "0" "$1"

Такую же ошибку получаю и при компиляции примера из http://nsis.sourceforge.net/Header_file_for_Listview
Может CommCtrl.nsh не дружит с NSIS3 ? (2.46 нет под рукой)

ps2 Да, не дружит... Проверил на 2.46 - всё нормально компилится с примером из http://nsis.sourceforge.net/Header_file_for_Listview
Адаптированный пример из справочника, рисует только пустой Listview... Видать что то не доадаптировал... Ну да то ладно... Что делать с CommCtrl.nsh в NSIS3 ?
Может можно вообще отказаться от CommCtrl.nsh ? Там всего то не большой кусок кода используется. Состряпать макрос из него...

K.A.V. 11-02-2015 18:26 2469994

Цитата:

Цитата MKN
Что делать с CommCtrl.nsh в NSIS3 ? »

Всё отлично там работает, не надо тут панику разводить)

Цитата:

Цитата MKN
т.е. ругается на строку в коде : ${NSD_LV_InsertItem} $ListView "0" "$1" »

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

Цитата:

Цитата K.A.V.
2. "CommCtrl.nsh" файл найдёшь на страничке Обучение IO: собственные странички => Введение »


MKN 11-02-2015 18:35 2469998

CommCtrl.nsh ессно у меня есть и находится где положено : \NSIS\Include\CommCtrl.nsh

ps Да, у меня оказалась другая версия CommCtrl.nsh, которой всегда пользовался и всё всегда работало... Заменил на ту , что в справочнике, ошибка пропала.
Откуда интересно этот файл взят ? Если пользователь возьмёт его из архива с http://nsis.sourceforge.net/mediawik...a/ListView.zip
как на многих ресурсах и рекомендуется , то с NSIS 3 получит ошибку... Кто бы мог подумать...

K.A.V. 11-02-2015 18:56 2470010

Цитата:

Цитата MKN
Откуда интересно этот файл взят ? »

Мне его kotkovets подарил... :biggrin: с этого события и началась разработка нового интерфейса SFX Creator...

Цитата:

Цитата MKN
Если пользователь возьмёт его из архива с http://nsis.sourceforge.net/mediawik...a/ListView.zip »

А какое нам дело до тех пользователей, которые не читают наш справочник?))

Цитата:

Цитата MKN
как на многих ресурсах и рекомендуется »

Ну...Мы же - не многие :tongue:

MaGoth 11-02-2015 20:14 2470047

Вложений: 1
K.A.V.,
Глянул ваш пример по прогрессу, работает, хотя до конца не все оттестировал еще, но есть один мелкий графический баг, см. ,вложение.
Как его побороть без ковыряния в ресурсах Нсис?!

И дополнительно хотелось бы:
- уменьшить высоту второго прогресс бара, на одну треть или в половину от текущей(надо поиграться с его настройками), как я понял из System::Call, параметры этого элемента прописаны, только не понятно что есть что в циферках..
- узнать, как правильно передать исполняемые процессы из какой-либо .dll, например, nsisUnRar2.dll, в этот созданный прогресс бар?
- при достижении 100% выполнения, удалять этот прогресс из окна оставляя только основной прогресс в окне инсталлера.

Спасибо..

K.A.V. 11-02-2015 22:01 2470077

Цитата:

Цитата MaGoth
но есть один мелкий графический баг, см. ,вложение. »

У вас есть, у меня нет :)

Цитата:

Цитата MaGoth
Как его побороть без ковыряния в ресурсах Нсис?! »

Зачем в ресурсы то лезть, просто команду подкорректируйте, размеры прогресса...

Цитата:

Цитата MaGoth
- уменьшить высоту второго прогресс бара, на одну треть или в половину от текущей(надо поиграться с его настройками), как я понял из System::Call, параметры этого элемента прописаны, только не понятно что есть что в циферках.. »

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

Для создания элемента мы используем команду CreateWindowEx, описание на русском, например, можно посмотреть здесь, гуглится всё достаточно легко

Из описания команды, думаю, вам всё станет более-менее ясно, какие параметры за что отвечают
Код:

System::Call 'user32::CreateWindowEx(i0,t"msctls_progress32",t"",i${WS_CHILD}|${WS_VISIBLE},i5,i120,i520,i20,i$R0,i6666,i0,i0) i.R2'
Цитата:

HWND WINAPI CreateWindowEx(
_In_ DWORD dwExStyle,
_In_opt_ LPCTSTR lpClassName,
_In_opt_ LPCTSTR lpWindowName,
_In_ DWORD dwStyle,
_In_ int x,
_In_ int y,
_In_ int nWidth,
_In_ int nHeight,

_In_opt_ HWND hWndParent,
_In_opt_ HMENU hMenu,
_In_opt_ HINSTANCE hInstance,
_In_opt_ LPVOID lpParam
);
5 - позиция по горизонтали
120 - позиция по вертикали
520 - ширина
20 - высота

Цитата:

Цитата MaGoth
- узнать, как правильно передать исполняемые процессы из какой-либо .dll, например, nsisUnRar2.dll, в этот созданный прогресс бар ? »

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

Цитата:

Цитата MaGoth
при достижении 100% выполнения, удалять этот прогресс из окна оставляя только основной прогресс в окне инсталлера. »

Команда ShowWindow вам в помощь, описание есть в справочнике

MKN 12-02-2015 11:45 2470272

K.A.V.,
Вчера я говорил, что "адаптированный" под nsDialogs пример "Считываем данные из консольного приложения в ListView" из справочника - не работает : получаю чистый ListView.
( чтобы никого не злить - у меня не работает... :) )
Ты наверное будешь смеяться, но оказалось дело в том, что гасит всё, применение стиля ${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}" .

Но достаточно добавить ${NSD_LV_InsertColumn} $ListView 0 450 "column 0" - и сразу всё работает. ( Не понятно, почему так получается, что обязательно нужно определить конкретный столбец и почему LVS_NOCOLUMNHEADER у меня игнорируется... )
Вот упрощённый код для этой ситуации :
Код:

!include "MUI2.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"
!include "CommCtrl.nsh"
;!include "FileFunc.nsh"

Page custom MyDialog ""
!insertmacro MUI_LANGUAGE "Russian"

Caption "Получение информации из консольного приложения"
OutFile "NOCOLUMNHEADER-Test.exe"

Var dlg
Var /global ListView

Function MyDialog
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateListView} 0u 0u 300u 140u ""
Pop $ListView
SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} "${LVS_EX_FULLROWSELECT}" "${LVS_EX_FULLROWSELECT}"
${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}"  # не работает
${NSD_LV_InsertColumn} $ListView 0 450 "column 0"  # работает

call getSystemInfo
nsDialogs::Show
FunctionEnd

Function getSystemInfo
${NSD_LV_InsertItem} $ListView "0" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbb"
SendMessage $ListView ${LVM_SETCOLUMNWIDTH} "0" "${LVSCW_AUTOSIZE}"
FunctionEnd

Section
SectionEnd

Ну, и до кучи : у меня Caption "Получение информации из консольного приложения" - кракозябрами... :) Почему вдруг ?

ps Действительно можно обойтись и без CommCtrl.nsh, закинув из него в скрипт только нужные макросы... ( Но это, наверное, не тот случай, когда нужно экономить... )

K.A.V. 12-02-2015 13:46 2470339

Цитата:

Цитата MKN
Ты наверное будешь смеяться, но оказалось дело в том, что гасит всё, применение стиля ${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}" »

Конечно буду, т.к. этот стиль не влияет на функционал, этот стиль всего-лишь убирает отображение колонок
Здесь проблема в другом, как я выяснил только что, всё дело в том, что в nsDialogs создание ListView происходит не так, как в IO, такое ощущение, что nsDialogs создаёт совсем голый элемент, и для того, чтобы "всё заработало", необходимо вручную дописать команду на вставку колонки, пусть даже и "невидимой"
Т.е. после создания элемента тебе нужно дописывать команду на вставку колонки:
Код:

${NSD_LV_InsertColumn} $ListView 0 450 ""
В IO таких телодвижений не требуется, там элемент создаётся сразу в "рабочем состоянии"

Скрытый текст

Код:

!include "MUI2.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"
!include "CommCtrl.nsh"
;!include "FileFunc.nsh"

Page custom MyDialog
!insertmacro MUI_LANGUAGE "Russian"

OutFile "NOCOLUMNHEADER-Test.exe"

Var dlg
Var /global ListView

Function MyDialog
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateListView} 0u 0u 300u 140u ""
Pop $ListView
SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} "${LVS_EX_FULLROWSELECT}" "${LVS_EX_FULLROWSELECT}"
${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}"
${NSD_LV_InsertColumn} $ListView 0 450 ""
call getSystemInfo
nsDialogs::Show
FunctionEnd



Section
SectionEnd


Function getSystemInfo
Push "ExecDos::End" # Add a marker for the loop to test for.
ExecDos::exec /NOUNLOAD /TOSTACK "systeminfo" "" ""
Pop $0 # return value
StrCmp $0 0 0 Failed
## Loop through stack.
Loop:
    Pop $1
    StrCmp $1 "ExecDos::End" ExitLoop
 System::Call "user32::OemToChar(tr1, t.r1)"
# SendMessage $R2 ${WM_SETTEXT} "0" "STR:$1"
 SendMessage $ListView ${LVM_GETITEMCOUNT} "" "" $R1
 ${NSD_LV_InsertItem} $ListView "0" "$1"
 SendMessage $ListView ${LVM_ENSUREVISIBLE} $R1 1
 SendMessage $ListView ${LVM_SETCOLUMNWIDTH} "0" "${LVSCW_AUTOSIZE}"
    Goto Loop
ExitLoop:
Return # Exit Function / Section
Failed:
MessageBox MB_OK "Exit code $0"
Return # Exit Function / Section
FunctionEnd




Section -post
SetAutoClose false
SectionEnd


опять панику разводишь, не работает у него ничего :biggrin:

Цитата:

Ну, и до кучи : у меня Caption "Получение информации из консольного приложения" - кракозябрами... Почему вдруг ?
Без понятия, что у тебя там с кодировками :) Я вот недавно пересел с 32 бита на 64, теперь тоже мучаюсь с кодировками, из NIS Edit всё в иероглифах, нужно открывать через другой текстовик, чтобы скопировать текст с родным языком...

MKN 12-02-2015 15:28 2470389

Цитата:

Цитата K.A.V.
опять панику разводишь, не работает у него ничего »

Но ведь действительно - не работает, ты ведь сам убедился :) , пока не добавишь ${NSD_LV_InsertColumn}, что я сразу и сделал.
И никакой паники - просто информирую пользователей, ( чтобы у них не было паники, когда пример не заработает, т.е. у тех, кто не захочет связываться с допотопным IO :) )

Цитата:

Цитата K.A.V.
Без понятия, что у тебя там с кодировками »

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

ps И к слову сказать, ты напрасно называешь, якобы вытянутый из тебя, :) код - "всё готовенькое" :) Это самый что ни на есть настоящий и наглядный - пример, логически вытекающий из имеющегося описания в справочнике и вопросов-обсуждений на форуме. Это ведь - общепринятая форма обучения и закрепления любого материала. Именно по конкретному коду легче всего понимать предмет изучения. ( Жаль, что в справочнике таких примеров, мало или они вообще отсутствуют (может тогда и не было бы лишних вопросов))...

Kopejkin 12-02-2015 18:38 2470493

Подскажите, можно ли заменить текст или число в определенной строке? Например, как на снимке: нужно заменить число 1 в строке, следующей за [SearchPOT].


MaGoth 12-02-2015 18:45 2470498

Цитата:

Цитата Kopejkin
Подскажите, можно ли заменить текст или число в определенной строке? Например, как на снимке: число 1 в строке, следующей за [SearchPOT] »

А это что файл или чего такое ?!

Kopejkin 12-02-2015 19:19 2470517

Цитата:

Цитата MaGoth
А это что »

Это обычный текстовый файл.
Так содержимое выглядит в Notepad+, если включить отображение всех символов.


MaGoth 12-02-2015 19:27 2470523

Цитата:

Цитата Kopejkin
Это обычный текстовый файл. »

Понятно, читай тогда справку в части:
[Примеры кодов] → [Работа со строками] » Замена строки в текстовом файле.
либо:
» Замена фразы в текстовом файле
Здесь можно подсмотреть пример по поиску строки по её номеру...

Kopejkin 12-02-2015 23:42 2470655

Цитата:

Цитата MaGoth
..пример по поиску строки по её номеру. »

Что-то не нашел именно этого примера. Номер текущей строки, насколько я понял, используется для последовательного перебора строк в диапазоне всего их количества.
Если я правильно читаю, то в примере "Замена фразы в текстовом файле" можно заменить все вхождения или только первое. А мне нужно заменить, например, только 5-е вхождение (текст, число), находящееся в 28-й строке.
А может я ничего и не понял...

MaGoth 13-02-2015 00:59 2470686

Цитата:

Цитата Kopejkin
Что-то не нашел именно этого примера. Номер текущей строки, насколько я понял, используется для последовательного перебора строк в диапазоне всего их количества. »

Можно такой еще вариант попробовать, из описание справки оригинала:
Скрытый текст
E.2 Text Functions Header
E.2.1 Introduction
Include header:

!include "TextFunc.nsh"
Call functions:

Section Install
${LineRead} "C:\a.log" "-1" $R0
; $R0="Last line$\r$\n"
SectionEnd
Section un.Install
${TrimNewLines} "Last line$\r$\n" $R0
; $R0="Last line"
SectionEnd
E.2.2 LineFind
Find specified lines in text file, and edit or view these lines in callback function.
Syntax:

${LineFind} "[File1]" "[File2|/NUL]" "[LineNumbers]" "Function"
"[File1]" ; Input text file
;
"[File2|/NUL]" ; [File2]
; Output text file
; If empty then File2=File1
; [/NUL]
; No output text file (only read File1)
;
"[LineNumbers]" ; [No|-No|No:No|{No}|{-No}|{No:No}]
; 1:-1 all lines to change (default)
; 2 second line from start
; -3 third line from end
; 5:9 range of lines from 5 to 9
; {2} only second line from start to output
; {-3} only third line from end to output
; {5:9} only range of lines from 5 to 9 to output
;
"Function" ; Callback function for specified lines

Function "Function"
; $R9 current line
; $R8 current line number
; $R7 current line negative number
; $R6 current range of lines
; $R5 handle of a file opened to read
; $R4 handle of a file opened to write ($R4="" if "/NUL")

; you can use any string functions
; $R0-$R3 are not used (save data in them).
; ...

Push $var ; If $var="StopLineFind" Then exit from function
; If $var="SkipWrite" Then skip current line (ignored if "/NUL")
FunctionEnd
Note:
- Error flag if input file doesn't exist
- Error flag if output file path doesn't exist
- Ranges must be specified on growth (2 4:5 9:-8 -5:-4 -2:-1)
- Output file will not be updated if no changes made.

Example1 (delete first two symbols):

Section
${LineFind} "C:\a.log" "C:\a-edited.log" "3:-1" "Example1"
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd

Function Example1
${TrimNewLines} '$R9' $R9
StrCpy $R9 $R9 '' 2
StrCpy $R9 '$R9$\r$\n'
;start from 3 line and delete first two symbols

Push $0
FunctionEnd
Example2 (show changed lines):

Section
${LineFind} "C:\a.log" "a.log" "{5:12 15 -6:-5 -1}" "Example2"
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd

Function Example2
${TrimNewLines} '$R9' $R9
StrCpy $R9 "$R9 ~Changed line ($R8)~$\r$\n"

Push $0
FunctionEnd
Example3 (delete lines):

Section
${LineFind} "C:\a.log" "\logs\a.log" "2:3 10:-5 -3:-2" "Example3"
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd

Function Example3
StrCpy $0 SkipWrite

Push $0
FunctionEnd
Example4 (insert lines):

Section
${LineFind} "C:\a.log" "" "10" "Example4
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd

Function Example4
FileWrite $R4 "---First Line---$\r$\n"
FileWrite $R4 "---Second Line ...---$\r$\n"

Push $0
FunctionEnd
Example5 (replace in file with count of changes - "WordFunc.nsh" required):

!include "WordFunc.nsh"

Section
StrCpy $R0 0
${LineFind} "C:\a.log" "C:\logs\a.log" "1:-1" "Example5"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2
MessageBox MB_OK "Changed lines=$R0"
SectionEnd

Function Example5
StrCpy $1 $R9

${WordReplace} '$R9' ' ' '_' '+*' $R9

StrCmp $1 $R9 +2
IntOp $R0 $R0 + 1
;$R0 count of changed lines

Push $0
FunctionEnd
Example6 (line string to cut or delete):

Section
${LineFind} "\a.log" "C:\logs\a.log" "" "Example6"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2
MessageBox MB_OK "Processed lines=$R1:$R2"
SectionEnd

Function Example6
;(Cut lines from a line to another line (also including that line))
StrCmp $R0 finish stop
StrCmp $R0 start finish
StrCmp $R9 'Start Line$\r$\n' 0 skip
StrCpy $R0 start
StrCpy $R1 $R8
goto code
finish:
StrCmp $R9 'Finish Line$\r$\n' 0 code
StrCpy $R0 finish
StrCpy $R2 $R8
goto code
skip:
StrCpy $0 SkipWrite
goto output
stop:
StrCpy $0 StopLineFind
goto output

;;(Delete lines from a line to another line (also including that line))
; StrCmp $R0 finish code
; StrCmp $R0 start finish
; StrCmp $R9 'Start Line$\r$\n' 0 code
; StrCpy $R0 start
; StrCpy $R1 $R8
; goto skip
; finish:
; StrCmp $R9 'Finish Line$\r$\n' 0 skip
; StrCpy $R0 finish
; StrCpy $R2 $R8
; skip:
; StrCpy $0 SkipWrite
; goto output

code:
;...

output:
Push $0
FunctionEnd
Example7 (read lines):

Section
${LineFind} "C:\a.log" "/NUL" "1:-1" "Example7"
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd

Function Example7
MessageBox MB_OKCANCEL '$$R9 "Line"=[$R9]$\n$$R8 "#" =[$R8]' IDOK +2
StrCpy $0 StopLineFind

Push $0
FunctionEnd
E.2.3 LineRead
Get line in file specified with number.
Syntax:

${LineRead} "[File]" "[LineNumber]" $var
"[File]" ; Input text file
;
"[LineNumber]" ; [No|-No]
; 3 line number from start
; -5 line number from end
;
$var ; Result: Line
Note:
- Error flag if input file doesn't exist
- Error flag if line number not found

Example:

Section
${LineRead} "C:\a.log" "-1" $R0
; $R0="Last line$\r$\n"
SectionEnd
E.2.4 FileReadFromEnd
Read text file from end line by line.
Syntax:

${FileReadFromEnd} "[File]" "Function"
"[File]" ; Input text file
"Function" ; Callback function

Function "Function"
; $9 current line
; $8 current line number
; $7 current line negative number

; $R0-$R9 are not used (save data in them).
; ...

Push $var ; If $var="StopFileReadFromEnd" Then exit from function
FunctionEnd
Note:
- Error flag if input file doesn't exist

Example1:

Section
${FileReadFromEnd} "C:\a.log" "Example1"

IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd

Function Example1
MessageBox MB_OKCANCEL '"Line"=[$9]$\n "#"=[$8]$\n "-#"=[$7]' IDOK +2
StrCpy $0 StopFileReadFromEnd

Push $0
FunctionEnd
Example2 (Reverse text file):

Section
GetTempFileName $R0
FileOpen $R1 $R0 w
${FileReadFromEnd} "C:\a.log" "Example2"
FileClose $R1

IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2
Exec '"notepad.exe" "$R0"'
SectionEnd

Function Example2
StrCmp $7 -1 0 +5
StrCpy $1 $9 1 -1
StrCmp $1 '$\n' +3
StrCmp $1 '$\r' +2
StrCpy $9 '$9$\r$\n'

FileWrite $R1 "$9"

Push $0
FunctionEnd
E.2.5 LineSum
Get sum of lines in text file.
Syntax:

${LineSum} "[File]" $var
"[File]" ; Input file
$var ; Result: Sum of lines
Note:
- Error flag if input file doesn't exist

Example:

Section
${LineSum} "C:\a.log" $R0
; $R0="54"
SectionEnd
E.2.6 FileJoin
Join two files in one (File1 + File2 = File3).
Syntax:

${FileJoin} "[File1]" "[File2]" "[File3]"
"[File1]" ; Input File1
"[File2]" ; Input File2
"[File3]" ; Output File3
; If [File3]="" Then add [File2] to [File1]
Note:
- Error flag if input files don't exist
- Error flag if output file path doesn't exist

Example1 (Join: a.log + b.log = Z.log):

Section
${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\Z.log"
SectionEnd
Example2 (Add: a.log + b.log = a.log):

Section
${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\a.log"
SectionEnd
E.2.7 TextCompare
Compare two text files.
Syntax:

${TextCompare} "[File1]" "[File2]" "[Option]" "Function"
"[File1]" ; File1 Compare these lines
"[File2]" ; File2 Compare with these lines
"[Options]" ; (line-by-line):
; FastDiff Compare line N (File1) with line N (File2)
; Call function if Different lines found
; FastEqual Compare line N (File1) with line N (File2)
; Call function if Equal lines found
; (line number independent):
; SlowDiff Compare line N (File1) with all lines (File2)
; Call function if line N (File1) Different
; SlowEqual Compare line N (File1) with all lines (File2)
; Call function if line N (File1) Equal
"Function" ; Callback function

Function "Function"
; $9 "Line File1"
; $8 "Line number"
; $7 "Line File2" (empty if SlowDiff)
; $6 "Line number" (empty if SlowDiff)

; $R0-$R9 are not used (save data in them).
; ...

Push $var ; If $var="StopTextCompare" Then exit from function
FunctionEnd
Note:
- Error flag if File1 or File2 doesn't exist
- Error flag if syntax error

Example (Different or Equal):

Section
StrCpy $R0 ''
${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example1"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +4

StrCmp $R0 NotEqual 0 +2
MessageBox MB_OK "Files differ" IDOK +2
MessageBox MB_OK "Files identical"
SectionEnd

Function Example1
StrCpy $R0 NotEqual
StrCpy $0 StopTextCompare

Push $0
FunctionEnd
Example (Compare line-by-line - Different):

Section
StrCpy $R0 'Text1.txt'
StrCpy $R1 'Text2.txt'

GetTempFileName $R2
FileOpen $R3 $R2 w
FileWrite $R3 "$R0 | $R1$\r$\n"
${TextCompare} "$R0" "$R1" "FastDiff" "Example2"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2

Exec "notepad.exe $R2"
FunctionEnd

Function Example2
FileWrite $R3 '$8=$9'
FileWrite $R3 '$6=$7$\r$\n'

Push $0
FunctionEnd
Example (Compare line-by-line - Equal):

Section
StrCpy $R0 'Text1.txt'
StrCpy $R1 'Text2.txt'

GetTempFileName $R2
FileOpen $R3 $R2 w
FileWrite $R3 "$R0 | $R1$\r$\n"
${TextCompare} "$R0" "$R1" "FastEqual" "Example3"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2

Exec "notepad.exe $R2"
FunctionEnd

Function Example3
FileWrite $R3 '$8|$6=$9'

Push $0
FunctionEnd
Example (Compare all lines - Different):

Section
StrCpy $R0 'Text1.txt'
StrCpy $R1 'Text2.txt'

GetTempFileName $R2
FileOpen $R3 $R2 w
FileWrite $R3 "$R0 | $R1$\r$\n"
${TextCompare} "$R0" "$R1" "SlowDiff" "Example4"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK end

FileWrite $R3 "$\r$\n$R1 | $R0$\r$\n"
${TextCompare} "$R1" "$R0" "SlowDiff" "Example4"
FileClose $R3
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK end

Exec "notepad.exe $R2"

end:
FunctionEnd

Function Example4
FileWrite $R3 '$8=$9'

Push $0
FunctionEnd
Example (Compare all lines - Equal):

Section
StrCpy $R0 'Text1.txt'
StrCpy $R1 'Text2.txt'

GetTempFileName $R2
FileOpen $R3 $R2 w
FileWrite $R3 "$R0 | $R1$\r$\n"
${TextCompare} "$R0" "$R1" "SlowEqual" "Example5"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2

Exec "notepad.exe $R2"
FunctionEnd

Function Example5
FileWrite $R3 '$8|$6=$9'

Push $0
FunctionEnd
Example (Show variables):

Section
${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example6"

IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd

Function Example6
MessageBox MB_OKCANCEL '$$9 "Line File1" =[$9]$\n$$8 "Line #" =[$8]$\n$$7 "Line File2" =[$7]$\n$$6 "Line #" =[$6]' IDOK +2
StrCpy $0 StopTextCompare

Push $0
FunctionEnd
E.2.8 TextCompareS
Same as TextCompare, but case sensitive.
E.2.9 ConfigRead
Read value from entry name in config file.
Syntax:

${ConfigRead} "[File]" "[Entry]" $var
"[File]" ; config file
;
"[Entry]" ; entry name
;
$var ; Result: Value
Note:
- Error flag if entry not found
- Error flag if file doesn't exist

Example1:

Section
${ConfigRead} "C:\AUTOEXEC.BAT" "SET winbootdir=" $R0
;$R0=C:\WINDOWS
SectionEnd
Example2:

Section
${ConfigRead} "C:\apache\conf\httpd.conf" "Timeout " $R0
;$R0=30
SectionEnd
E.2.10 ConfigReadS
Same as ConfigRead, but case sensitive.
E.2.11 ConfigWrite
Write value from entry name in config file.
Syntax:

${ConfigWrite} "[File]" "[Entry]" "[Value]" $var
"[File]" ; config file
;
"[Entry]" ; entry name
;
"[Value]" ; value name
; if "" then delete Entry
;
$var ; Result:
; $var=CHANGED Value is written
; $var=DELETED Entry is deleted
; $var=ADDED Entry and Value are added
; $var=SAME Entry and Value already exist
Note:
- Error flag if file doesn't exist
- Error flag if file can't be opened

Example1:

Section
${ConfigWrite} "C:\AUTOEXEC.BAT" "SET winbootdir=" "D:\WINDOWS" $R0
;$R0=CHANGED
SectionEnd
Example2:

Section
${ConfigWrite} "C:\apache\conf\httpd.conf" "Timeout " "30" $R0
;$R0=SAME
SectionEnd
Example3:

Section
${ConfigWrite} "C:\apache\conf\httpd.conf" "Timeout " "" $R0
;$R0=DELETED
SectionEnd
E.2.12 ConfigWriteS
Same as ConfigWrite, but case sensitive.
E.2.13 FileRecode
Recode text file from DOS to Windows format and vice-versa.
Syntax:

${FileRecode} "[File]" "[Format]"
"[File]" ;
;
"[Format]" ; OemToChar -from DOS to Windows
; CharToOem -from Windows to DOS
Note:
- Error flag if file doesn't exist
- Error flag if syntax error

Example:

Section
${FileRecode} "C:\SCANDISK.LOG" "CharToOem"
SectionEnd
E.2.14 TrimNewLines
Trim newlines in a string.
Syntax:

${TrimNewLines} "[string]" $var
"[string]" ; Input string
$var ; Result: String without '$\r' and '$\n' at the end
Example:

Section
${TrimNewLines} "Text line$\r$\n" $R0
; $R0="Text line"
SectionEnd

MaGoth 13-02-2015 01:58 2470707

Вложений: 1
Цитата:

Цитата Kopejkin
Подскажите, можно ли заменить текст или число в определенной строке? Например, как на снимке: нужно заменить число 1 в строке, следующей за [SearchPOT]. »

Накидал небольшой по замене строки, синтакс:
${LineFind} "файл1" "файл2" "строка" "функция"

Добавь к своему проекту:
!include "TextFunc.nsh"

А далее как в примере:
Скрытый текст
XPstyle on
!include MUI2.nsh

Name "TestTXT"
OutFile TEST_Txt.exe
RequestExecutionLevel user

InstallDir "$EXEDIR\Test7z"
!insertmacro MUI_LANGUAGE English
!include "TextFunc.nsh"

Section "Test"
${LineFind} "$EXEDIR\MyText.txt" "" "9" "delines"
;IfErrors 0 +2
;MessageBox MB_OK "Error"
${LineFind} "$EXEDIR\MyText.txt" "" "9" "inlines"
;IfErrors 0 +2
;MessageBox MB_OK "Error"
SectionEnd

Function delines
StrCpy $0 SkipWrite
Push $0
FunctionEnd

Function inlines
FileWrite $R4 "Привет Kopejkin, это я, твоя изменённая строка.. :)$\n"
Push $0
FunctionEnd



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

Kopejkin 13-02-2015 03:34 2470726

Цитата:

Цитата MaGoth
...Накидал »

Спасибо, но это не то.
Как заменить уникальный (встречающийся 1 раз) текст я знаю - из примера в справочнике.
В моем же примере текст повторяется, т.е. уникален не текст, а номер строки.
Буду разбираться с примерами из ориг. справки

MaGoth 13-02-2015 03:58 2470728

Цитата:

Цитата Kopejkin
Спасибо, но это не то.
Как заменить уникальный (встречающийся 1 раз) текст я знаю - из примера в справочнике.
В моем же примере текст повторяется, т.е. уникален не текст, а номер строки.
Буду разбираться с примерами из ориг. справки »

Или я ничего не понял, или ты, одно из двух..

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

Цитата Kopejkin
Подскажите, можно ли заменить текст или число в определенной строке? Например, как на снимке: нужно заменить число 1 в строке, следующей за [SearchPOT]. »

Так вот, то что я написал в примере, как раз-таки цепляется к номеру строки, а само содержимое строки в данном случае не имеет значения..

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


Зы, и скинь свой изменяемый текстовый файл, гляну что это такое...

Kopejkin 13-02-2015 09:30 2470763

Цитата:

Цитата MaGoth
...или ты »

Да, это я тупанул. Спасибо еще раз!

MaGoth 15-02-2015 22:17 2471683

Привет народ, :)

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

Flix 16-02-2015 22:49 2472209

Цитата:

Цитата MaGoth
У кого нибудь получилось скомпилить плагин Nsis7z_921 из представленных исходников? »

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

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

K.A.V. 16-02-2015 23:47 2472235

Цитата:

Цитата MaGoth
У кого нибудь получилось скомпилить плагин Nsis7z_921 из представленных исходников? »

Сомневаюсь, что это вообще кому-то нужно было, а у вас не получилось скомпилировать? Там же вроде всё есть, и проект даже от Visual Studio...
Никого не хочу обидеть, но ещё я сомневаюсь, что хотя бы половина кодеров на NSIS из этой темы писали плагины для NSIS

Цитата:

Цитата MaGoth
И есть у кого желание поковыряться в нем и подлатать чуток, до нужной кондиции? »

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

Цитата:

Цитата Flix
Есть у программистов такая негласная защита от дурака: в опубликованных исходниках делать несколько ошибок. Опытные сразу поймут что-к-чему (по сообщениям компилятора) и исправят. А начинающие, или неопытные будут говорить, что у них ничего не получается. »

Нужно взять на заметку и потом примеры здесь такие выкладывать :biggrin: заодно будем учить NSIS-кодеров самостоятельно исправлять ошибки в коде. :up

Цитата:

Цитата Flix
Поверьте, вам скажут спасибо. »

У меня первая мысль, которая промелькнула - "Зачем?"

MaGoth 17-02-2015 00:30 2472249

Цитата:

Цитата Flix
Есть у программистов такая негласная защита от дурака: в опубликованных исходниках делать несколько ошибок. Опытные сразу поймут что-к-чему (по сообщениям компилятора) и исправят. А начинающие, или неопытные будут говорить, что у них ничего не получается.»

Ух ты как интересно..

Может вы прокомментируете эту защиту от дурака ?!
Скрытый текст
Код:

1>------ Построение начато: проект: Nsis7z, Конфигурация: Debug Win32 ------
1>  StdAfx.cpp
1>  UserInputUtils.cpp
1>c:\users\александр\desktop\7zip\ui\nsis\userinpututils.cpp(5): fatal error C1083: Не удается открыть файл включение: Common/StdInStream.h: No such file or directory
1>  OpenCallbackConsole.cpp
1>c:\users\александр\desktop\7zip\ui\nsis\opencallbackconsole.h(devil): fatal error C1083: Не удается открыть файл включение: Common/StdOutStream.h: No such file or directory
1>  NSISBreak.cpp
1>  MainAr.cpp
1>c:\users\александр\desktop\7zip\ui\nsis\mainar.cpp(7): fatal error C1083: Не удается открыть файл включение: Windows/Error.h: No such file or directory
1>  Main.cpp
1>c:\users\александр\desktop\7zip\ui\nsis\main.cpp(5): fatal error C1083: Не удается открыть файл включение: Common/MyInitGuid.h: No such file or directory
1>  ExtractCallbackConsole.cpp
1>c:\users\александр\desktop\7zip\ui\nsis\extractcallbackconsole.h(devil): fatal error C1083: Не удается открыть файл включение: Common/MyString.h: No such file or directory
1>  WorkDir.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\WorkDir.cpp: No such file or directory
1>  UpdateProduce.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\UpdateProduce.cpp: No such file or directory
1>  UpdatePair.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\UpdatePair.cpp: No such file or directory
1>  UpdateCallback.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\UpdateCallback.cpp: No such file or directory
1>  UpdateAction.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\UpdateAction.cpp: No such file or directory
1>  Update.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\Update.cpp: No such file or directory
1>  TempFiles.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\TempFiles.cpp: No such file or directory
...



Мы на-пару с одним человечком перелопатили все исходники плагинов для этой версии 7з, до которых смогли дотянуться, и везде болт. Эти идиоты, выложили сырцы, а на пол проекта компиляции файлов не положили... :angry2:
Вообще не понимаю, какой дебил так делает ?! Или выкладывай полностью, или не выкладывай вообще. И всё всем понятно будет..

Цитата:

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


K.A.V.
Пост ради поста ?!
Ибо ни грамму не понял из того что ты написал..

K.A.V. 17-02-2015 00:53 2472254

Цитата:

Цитата MaGoth
Может вы прокомментируете эту защиту от дурака ?! »

Цитата:

Цитата MaGoth
Эти идиоты, выложили сырцы, а на пол проекта компиляции файлов не положили...
Вообще не понимаю, какой дебил так делает ?! Или выкладывай полностью, или не выкладывай вообще. И всё всем понятно будет.. »

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

Цитата:

Цитата MaGoth
Пост ради поста ?! »

Я постоянно тут пишу просто так, ради количества сообщений, люблю это дело, видите, какое у меня несоответствие "полезняшек" с общим числом сообщений?
И смотрите, это моё очередное сообщение, которое вроде бы и с одной стороны указывает на причину вашей проблемы, но и с другой...
Цитата:

Цитата MaGoth
Пост ради поста ?! »


Flix 18-02-2015 00:25 2472680

Цитата:

Цитата MaGoth
Может вы прокомментируете эту защиту от дурака ?! »

А что здесь может быть непонятно? Компилятор вам на русском языке пишет:
Цитата:

Не удается открыть файл источник
и далее указывает конкретный файл, который ему не удалось найти. Ну и... дальше что?
Если вы выполните все рекомендации автора плагина, которые он старательно изложил в сопровождающем документе (nsis7z.txt), то файл компилируется без проблем.

MKN 19-02-2015 13:35 2473431

K.A.V.,
Подскажи пожалуйста, как в твоём примере, вывести строки в ListBox - с 1ой по 4ую включительно ? (как вывести только 4ую- понятно, как вывести с 4 ой и далее- понятно. с выводом с 1ой по 4 ую - что то не заладилось...)
Код:

OutFile ListBoxHSCROLL_ExecDosTOWINDOW.exe
!include nsDialogs.nsh
Var Dialog
Var hcli
Var ListBox
Page custom MyPage  leave

Function MyPage
nsDialogs::Create 1018
Pop $Dialog
nsDialogs::CreateControl /NOUNLOAD ${__NSD_ListBox_CLASS} ${__NSD_ListBox_STYLE}|${WS_HSCROLL} ${__NSD_ListBox_EXSTYLE} 0 20 100% 100u ""
Pop $ListBox
SendMessage $ListBox ${LB_SETHORIZONTALEXTENT} 2000  0  ; 2000 - количество пикселей, на которое список может прокручиваться.

GetFunctionAddress $0 MyFunction
    ExecDos::exec /NOUNLOAD /ASYNC /TOFUNC  `cmd /?` "" $0
Pop $hcli
nsDialogs::Show
FunctionEnd

Function leave
    ExecDos::wait $hcli
FunctionEnd

Function MyFunction
  Pop $2
 ; вывести только 4ую строку
;IntOp $R0 $R0 + 1
;StrCmp $R0 4 0 noAddString 

; вывести всё , начиная с 4ой строки
IntOp $R0 $R0 + 1
StrCmp $R0 4 0 noAddString
StrCpy $R0 3

System::Call "user32::OemToChar(tr2, t.r2)"
SendMessage $ListBox ${LB_ADDSTRING} 0 "STR:$2"
noAddString:
FunctionEnd

Section
SectionEnd

ps HSCROLL можно сделать гораздо проще, не заморачиваясь с учётом размера шрифта, как в вышеприводимой громозде из кода...

K.A.V. 19-02-2015 15:33 2473489

Цитата:

Цитата MKN
вывести строки в ListBox - с 1ой по 4ую включительно ? »

Ну диапазон же...IntCmp...

Код:

OutFile ListBoxHSCROLL_ExecDosTOWINDOW.exe
!include nsDialogs.nsh
Var Dialog
Var hcli
Var ListBox
Page custom MyPage  leave

Function MyPage
nsDialogs::Create 1018
Pop $Dialog
nsDialogs::CreateControl /NOUNLOAD ${__NSD_ListBox_CLASS} ${__NSD_ListBox_STYLE}|${WS_HSCROLL} ${__NSD_ListBox_EXSTYLE} 0 20 100% 100u ""
Pop $ListBox
SendMessage $ListBox ${LB_SETHORIZONTALEXTENT} 2000  0  ; 2000 - количество пикселей, на которое список может прокручиваться.

GetFunctionAddress $0 MyFunction
    ExecDos::exec /NOUNLOAD /ASYNC /TOFUNC  `cmd /?` "" $0
Pop $hcli
nsDialogs::Show
FunctionEnd

Function leave
    ExecDos::wait $hcli
FunctionEnd

Function MyFunction
  Pop $2   

IntOp $R0 $R0 + 1
IntCmp $R0 4 0 0 noAddString

System::Call "user32::OemToChar(tr2, t.r2)"
SendMessage $ListBox ${LB_ADDSTRING} 0 "STR:$2"
noAddString:
FunctionEnd

Section
SectionEnd


MKN 19-02-2015 16:06 2473509

Цитата:

Цитата K.A.V.
IntCmp »

Напрочь из головы вылетело... :search:

MKN 20-02-2015 12:42 2473806

Когда то kotkovets, предлагал код, как убрать заголовок окна :
читать дальше »
Код:

!include MUI2.nsh
 !define MUI_CUSTOMFUNCTION_GUIINIT GUIInit
 !insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_LANGUAGE "Russian"
 OutFile "Example.exe"

 !define WS_CAPTION 0x00C00000
 !define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call"
 !macro _NSD_RemoveStyle_Call CONTROL EXSTYLE
  Push `${CONTROL}`
  Push `${EXSTYLE}`
  System::Store SR1R0
  IntOp $R1 $R1 ~
  System::Call `user32::GetWindowLong(iR0,i${GWL_STYLE})i.R2`
  IntOp $R2 $R1 & $R2
  System::Call `user32::SetWindowLong(iR0,i${GWL_STYLE},iR2)`
  System::Store L
 !macroend

 Function GUIInit
  ${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
 FunctionEnd

 Section
 SectionEnd



А каким образом добавить к получившемуся "лысому" окну - рамку ? (пробовал добавлять "рамочные" стили WS_BORDER , WS_THICKFRAME , посылал окну сообщение ${CM_BORDERCHANGED} - без эффекта )

K.A.V. 20-02-2015 15:39 2473875

Цитата:

Цитата MKN
пробовал добавлять "рамочные" стили WS_BORDER »

Цитата:

Цитата MKN
без эффекта »

А как пробовал то?

Если делать так, то всё прекрасно работает:

Стиль WS_DLGFRAME
Код:

Function GUIInit
 ${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
 System::Call "user32::GetWindowLong(i$HWNDPARENT,i${GWL_STYLE})i.s"
 System::Int64Op "0x00400000L" |
 System::Call "user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},is)" 
 FunctionEnd



Стиль WS_BORDER
Код:

Function GUIInit
 ${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
 System::Call "user32::GetWindowLong(i$HWNDPARENT,i${GWL_STYLE})i.s"
 System::Int64Op "0x00800000L" |
 System::Call "user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},is)" 
 FunctionEnd



Цитата:

Цитата MKN
"рамочные" стили »

Цитата:

Цитата MKN
WS_THICKFRAME »

WS_THICKFRAME - не рамочный стиль, да, он создаёт рамку окна при удаленном WS_CAPTION, но при этом ещё и добавляет возможность изменять границы окна, это не то, что тебе нужно

MKN 20-02-2015 15:52 2473884

Цитата:

Цитата K.A.V.
Если делать так, то всё прекрасно работает: »

Не работает. Заголовок окна - остаётся (но таскать за себя не позволяет). Задача ведь сделать обрамление рамкой обезглавленного окна .

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

K.A.V. 20-02-2015 16:54 2473909

Так тоже не работает?
WS_DLGFRAME
Код:

Function GUIInit
 ${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
 System::Call "user32::GetWindowLong(i$HWNDPARENT,i${GWL_STYLE})i.r0"
 System::Call "user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},i$0|0x00400000)"
 FunctionEnd



WS_BORDER
Код:

Function GUIInit
 ${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
 System::Call "user32::GetWindowLong(i$HWNDPARENT,i${GWL_STYLE})i.r0"
 System::Call "user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},i$0|0x00800000)"
 FunctionEnd



На W7x64 и W8x32 работает, а вот на WinXP нет

MKN 20-02-2015 17:35 2473927

Цитата:

Цитата K.A.V.
Так тоже не работает? »

Не работает. Заголовок , как прилип...

ps Выяснил, почему не работает. В "визуальных эффектах" обязательно должна быть включена опция "включение композиции рабочего стола".
У меня была отключена, т.к. почти все визуальные эффекты я всегда отключаю за ненадобностью. И не только я один... Т.е. в скрипте с манипуляциями стилями, придётся принудительно включать композицию на время установки...
А вообще , это лажа со строны MS. Пользовательские настройки не должны принципиально влиять на работу программ...
Есть вроде как спец функция для манипуляций с композицией... Обсуждалось, к примеру, здесь http://www.gamedev.ru/code/forum/?id=168231

K.A.V. 23-02-2015 06:51 2474738

Цитата:

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

Ну, вот видишь...А я работаю со всеми включенными эффектами :)

Цитата:

Цитата MKN
Есть вроде как спец функция для манипуляций с композицией... »

Зачем ты всё усложняешь функциями, смотри:
1. Берёшь файл интерфейса modern.exe из папки Contrib\UIs
2. Копируешь в папку со скриптом
3. Открываешь его в ResHacker
4. Переходишь в диалог 105
5. Ставишь свой стиль окна, убирая WS_CAPTION и добавляя, например, WS_BORDER
Код:

105 DIALOGEX 0, 0, 331, 222
STYLE DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_BORDER | WS_SYSMENU
CAPTION ""
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
FONT 8, "MS Shell Dlg"
{
  CONTROL "", 3, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 166, 201, 50, 14
  CONTROL "", 1, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 216, 201, 50, 14
  CONTROL "", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 273, 201, 50, 14
  CONTROL "", 1018, STATIC, SS_BLACKRECT | WS_CHILD | WS_GROUP, 15, 45, 300, 140
  CONTROL "", 1044, STATIC, SS_BLACKRECT | WS_CHILD | WS_GROUP, 0, 0, 331, 193
  CONTROL "", 1035, STATIC, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 193, 321, 1
  CONTROL "", 1036, STATIC, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE | WS_GROUP, 0, 35, 340, 1
  CONTROL "", 1045, STATIC, SS_ETCHEDHORZ | WS_CHILD | WS_GROUP, 0, 193, 340, 1
  CONTROL "", 1256, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 188, 322, 8
  CONTROL "", 1028, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_GROUP, 5, 188, 322, 8
  CONTROL "", 1034, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 0, 0, 332, 35
  CONTROL "", 1037, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 10, 5, 280, 10
  CONTROL "", 1038, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 15, 16, 275, 16
  CONTROL 103, 1039, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE | WS_GROUP, 300, 8, 21, 20
}

6. Компилируешь/сохраняешь свои изменения
7. В NSIS скрипте прописываешь в самом начале
Код:

!define MUI_UI "modern.exe"
8. Наслаждаешься
Просто баг появляется не из-за того, что в MS косячники (ну, в меньшей степени, я думаю), а из-за того, что мы модифицируем созданное окно, создай его изначально без заголовка - и такой проблемы не будет

ps
не знаю насчет пункта 4, достаточно ли будет изменений только в диалоге 105, лень тестить, оставлю это дело тебе :wink:

psps
А если кому нужна твоя функция для включения/отключения композиции, то...

Включить
Код:

  System::Call "Dwmapi::DwmEnableComposition(i1)i.r0"
Отключить
Код:

  System::Call "Dwmapi::DwmEnableComposition(i0)i.r0"
вроде работает :)

MKN 25-02-2015 11:06 2475612

K.A.V.,

Да. Замена стиля в ресурсе работает.

И, к слову, об изменении ресурсов. Кроме стилей, чаще всего в modern.exe пользователи изменяют размеры окон страниц, кнопок и других элементов (или скрывают не нужные элементы).

Вполне можно было бы сделать на NSIS программку, упрощающую изменение ресурсов в modern.exe Dialog.
Ввёл нужные значения размеров, отметил нужные стили и нажал кнопку, сохранив modern.exe , скажем, как - modern_correct.exe . Было бы весьма полезно.

Но нигде в сети не обнаружил даже намёка, как с помощью NSIS можно изменить/заменить ресурсы файлов.

Хотя... Однажды kotkovets рассказывал, как это делается (правда только для битмапов)... Вот, что я понял из его рассказа-примера и использовал в таком примере (+ добавил некоторые описания...) :

Пример замены ресурса в WinRar 5.21x32 рус ( http://www.rarlab.com/rar/wrar521ru.exe )

Заменим ресурс Bitmap 104 в RarLng.dll. Это - цветная картинка-лейба WinRAR из "Справка" -> "О программе..."



Заменяем эту цветную картинку на черно-белую - из файла 104.bmp :

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

!include "logiclib.nsh"
ShowInstDetails show
OutFile "replacement_of_ resources_ BMP-test.exe"

!define RT_BITMAP      2  ;Bitmap resource.
/* при необходимости используем :
!define RT_CURSOR      1  ;Hardware-dependent cursor resource.
!define RT_ICONH        3  ;ardware-dependent icon resource.
!define RT_MENU        4  ;Menu resource.
!define RT_DIALOG      5  ;Dialog box.
!define RT_STRING      6  ;String-table entry.
!define RT_FONTDIR      7  ;Font directory resource.
!define RT_FONT        8  ;Font resource.
!define RT_ACCELERATOR  9  ;Accelerator table.
!define RT_RCDATA      10 ;Application-defined resource (raw data).
!define RT_MESSAGETABLE 11 ;Message-table entry.
!define /math RT_GROUP_CURSOR ${RT_CURSOR} + ${RT_MESSAGETABLE}
!define /math RT_GROUP_ICON  ${RT_ICONH} + ${RT_MESSAGETABLE}
!define RT_VERSION      16 ;Version resource.
!define RT_DLGINCLUDE  17 ;include heder file
!define RT_PLUGPLAY    19 ;Plug and Play resource.
!define RT_VXD          20 ;DWORD cbData
!define RT_ANICURSOR    21 ;Animated cursor.
!define RT_ANIICON      22 ;Animated icon.
!define RT_HTML        23 ;HTML resource.
!define RT_MANIFEST    24 ;Side-by-Side Assembly Manifest.
*/
Section
  System::Store S
  FileOpen $0 "$EXEDIR\104.bmp" r
${Unless} ${Errors}
      System::Call "kernel32::GetFileSizeEx(ir0,*l.r1)"
;Т.к. мы заменяем растровое  изображение (BMP файл), то для его правильной обработки
;сначала необходимо устранить первые 14 байт заголовка растрового изображения.
      IntOp $1 $1 - 14
      System::Call "kernel32::SetFilePointer(ir0,i14,i0,i0)"
      System::Alloc $1
      Pop $2
      System::Call "kernel32::ReadFile(ir0, ir2, ir1, *i.r3, i0)"
      FileClose $0
; BeginUpdateResource - создает описатель для EXE или DLL файла, в котором нужно заменить ресурс
; UpdateResource - используя описатель  файла добавляет, удаляет или заменяет в нем ресурсы
; EndUpdateResource - закрывает описатель  файла
      System::Call "kernel32::BeginUpdateResource(t'$EXEDIR\RarLng.dll', i0)i.r0"
${Unless} $0 == 0
          System::Call "kernel32::UpdateResource(ir0, i${RT_BITMAP}, i104, i1033, ir2, ir3)"  ;  104 - ресурс  ,  1033 - язык
          System::Call "kernel32::EndUpdateResource(ir0,i0)"
${Else}
          DetailPrint "файла для изменения не существует!"
${EndUnless}
      System::Free $2
${Else}
      DetailPrint "файл для замены не существует!"
${EndUnless}
  System::Store L
SectionEnd

Section
SectionEnd

В итоге :



Но как заменить в modern.exe Dialog 105 - на откорректированный... Вроде сначала, сохранённый-откорректированный .rc файл надо конвертировать в бинарный вид, а потом уже заменять ресурс...
(Если напрямую заменять .rc ,то заменяться то он вроде как заменяется (точнее изменяется, но без внесённых изменений и при этом получается черт те что) )...
И скорее всего, не так это делается... Тогда как ?

ps Во вложении черно-белая картинка - файл 104.bmp :

K.A.V. 25-02-2015 21:26 2475884

Цитата:

Цитата MKN
Но нигде в сети не обнаружил даже намёка, как с помощью NSIS можно изменить/заменить ресурсы файлов. »

Вот ты сам подумай, зачем системе создания инсталляторов копаться в содержимом файлов, заменяя их ресурсы? Это явно не задача таких систем.
А если нужно заменить ресурсы - юзай командную строку приложений, которые умеют заменить ресурсы (тот же ResHacker, справка в помощь)

Цитата:

Цитата MKN
Но как заменить в modern.exe Dialog 105 - на откорректированный... Вроде сначала, сохранённый-откорректированный .rc файл надо конвертировать в бинарный вид, а потом уже заменять ресурс...
(Если напрямую заменять .rc ,то заменяться то он вроде как заменяется (точнее изменяется, но без внесённых изменений и при этом получается черт те что) )...
И скорее всего, не так это делается... Тогда как ? »

Я что-то не понял, ты не можешь через ResHacker сохранить изменения в диалоге 105? Или что? :unsure:

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

MKN 26-02-2015 09:24 2476006

Цитата:

Цитата K.A.V.
зачем системе создания инсталляторов копаться в содержимом файлов, заменяя их ресурсы? »

Не системе инсталлятора, а автономной программе на NSIS.
Задачи с заменой ресурсов могут быть разные, к примеру :
интереующая меня (и полезная для многих) программа для удобного и быстрого изменения размеров и пр. у окон конструированного инсталлятора NSIS , в ресурсах modern.exe . Как я уже говорил выше. Конечно всё это можно делать редактором ресурсов - но оч долго и оч не удобно, особенно , если регулярно. :)
И, как ты правильно заметил - разнообразные патчеры ресурсов, как для простой замены какого либо ресурса, так и для корректировки, локализации и т.д.
Оч. полезно в применении для программ с часто меняющимися версиями, где постоянно приходится обновлять ресурсы...
Не нужно каждый раз возиться с ResHacker_ом, особенно если надо заменять десятки параметров в ресурсах... А тут один раз повозился, а далее просто вводи данные (если надо) и жми кнопку :)
Цитата:

Цитата K.A.V.
Я что-то не понял, ты не можешь через ResHacker сохранить изменения в диалоге 105? »

Сохранить ессно можешь (как файл .rc). Как изменить-заменить его потом, после корректировки, с помощью кода NSIS ?

kotkovets 26-02-2015 09:56 2476022

Цитата:

Цитата MKN
А каким образом добавить к получившемуся "лысому" окну - рамку ? (пробовал добавлять "рамочные" стили WS_BORDER , WS_THICKFRAME , посылал окну сообщение ${CM_BORDERCHANGED} - без эффекта ) »

насколько помню )), нужно считать в переменную текущие свойства окна и прибавить (IntOp) нужное свойство в форточку.
и применить, все действия в GUIInit.

MKN 26-02-2015 10:27 2476027

Цитата:

Цитата kotkovets
нужно считать в переменную текущие свойства окна и прибавить (IntOp) нужное свойство в форточку.
и применить, все действия в GUIInit. »

С этим вроде разобрались - все API манипуляции со стилями окна, перечёркивает отключение композиции раб стола...

Подскажи пожалуйста - как изменить-заменить сохранённый и откорректированный .rc ресурс в modern.exe , с помощью кода NSIS ?

kotkovets 26-02-2015 16:00 2476203

Цитата:

Цитата MKN
Подскажи пожалуйста - как изменить-заменить сохранённый и откорректированный .rc ресурс в modern.exe , с помощью кода NSIS ? »

Дело в том, что у штатного system.dll проблемы работы со структурами, что требует WinAPi работу с ресурсами,
все это сводит на нет штатными инструментами редактирование ресурсов...
Этот "косяк" сильно ограничивает функциональность расширенных кодов для продвинутого в этом плане NSIS

K.A.V. 27-02-2015 05:51 2476468

Цитата:

Цитата MKN
Не системе инсталлятора, а автономной программе на NSIS. »

Пошел по моим стопам? :biggrin: Ну, тогда понятно :) Работы то уже есть готовые?

Цитата:

Цитата MKN
интереующая меня (и полезная для многих) программа для удобного и быстрого изменения размеров и пр. у окон конструированного инсталлятора NSIS , в ресурсах modern.exe . Как я уже говорил выше. Конечно всё это можно делать редактором ресурсов - но оч долго и оч не удобно, особенно , если регулярно. »

Для этого и были созданы такие программы, как ResHacker, какой смысл в создании велосипеда? И я что-то не замечал трудностей при изменении интерфейса через "хакера", всё довольно быстро и удобно делается там...

Цитата:

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

А патчеры по какому принципу работают? Разве не по принципу использования внешних приложений для обновления ресурсов в файлах? Не интересовался этой темой, поэтому не в курсе всех тонкостей

Цитата:

Цитата MKN
Сохранить ессно можешь (как файл .rc). Как изменить-заменить его потом, после корректировки, с помощью кода NSIS ? »

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

Цитата:

Цитата kotkovets
Дело в том, что у штатного system.dll проблемы работы со структурами, что требует WinAPi работу с ресурсами,
все это сводит на нет штатными инструментами редактирование ресурсов... »

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

MKN 27-02-2015 10:49 2476541

Цитата:

Цитата K.A.V.
Пошел по моим стопам? »

Хороший пример - заразителен. :)
Цитата:

Цитата K.A.V.
rc-файл - это формат ResHacker »

Нет, это общий формат скрипта ресурса (rc script), по сути - просто описание ресурса... Используется повсеместно, как редакторами ресурсов так и программистами при манипуляциях с ресурсами в коде... Но нам с того, применимо для NSIS, не легче... :)
Цитата:

Цитата K.A.V.
либо обратившись к ResHacker через командную строку »

А вот это попробуем. :) Раз другого выхода нет...

T1cOoN 27-02-2015 14:40 2476660

Товарищи подскажите пожалуйста, есть программа "Фабрика Форматов", инсталлятор на NSIS, устанавливаю с параметров /S для тихой установки, незаметно от пользователей, но инсталлятор по дефолту ставит программу и ярлыки к ней для одного пользователя, а не для всех, есть ли какая то команда для установки "для всех"

K.A.V. 27-02-2015 15:18 2476680

Цитата:

Цитата T1cOoN
есть ли какая то команда для установки "для всех" »

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

Что касается конкретно Format Factory - в исходном коде NSIS-скрипта этого продукта такой возможности не заложено, нет упоминания о команде SetShellVarContext, которая бы создавала ярлыки для всех/только для текущего

Код:

  SetOutPath $_OUTDIR
  SetOutPath $INSTDIR\FFModules\Package
  File Readme.txt
  SetOutPath $INSTDIR\FFModules\Package\BaiDu
  File Baidu-TB-ASBar.exe
  File hao123inst.exe
  SetOutPath $INSTDIR\FFModules\Package\Ask
  File AskPIP_FF_.exe
  SetOutPath $INSTDIR
  StrCmp $_28_ 0 label_417
  CreateDirectory $SMPROGRAMS\ёсКЅ№¤і§
  CreateShortCut $SMPROGRAMS\ёсКЅ№¤і§\ёсКЅ№¤і§.lnk $INSTDIR\FormatFactory.exe
  CreateShortCut $SMPROGRAMS\ёсКЅ№¤і§\°пЦъ.lnk $INSTDIR\FormatFactory.exe /help $INSTDIR\FormatFactory.exe 2
  CreateShortCut $DESKTOP\ёсКЅ№¤і§.lnk $INSTDIR\FormatFactory.exe
  CreateShortCut $SENDTO\ёсКЅ№¤і§.lnk $INSTDIR\FormatFactory.exe
  Goto label_422
label_417:
  CreateDirectory $SMPROGRAMS\FormatFactory
  CreateShortCut $SMPROGRAMS\FormatFactory\FormatFactory.lnk $INSTDIR\FormatFactory.exe
  CreateShortCut $SMPROGRAMS\FormatFactory\Help.lnk $INSTDIR\FormatFactory.exe /help $INSTDIR\FormatFactory.exe 2
  CreateShortCut "$DESKTOP\Format Factory.lnk" $INSTDIR\FormatFactory.exe
  CreateShortCut "$SENDTO\Format Factory.lnk" $INSTDIR\FormatFactory.exe
label_422:
SectionEnd


MKN 03-03-2015 16:48 2478282

Цитата:

Цитата K.A.V.
либо обратившись к ResHacker через командую строку »

К сожалению ком строка ResHacker работает только с .res файлами, от которых толка нет ( для поставленной задачи... )
Ведь надо (точнее - возможно) редактировать данные именно в скриптах .rc
Если бы .rc можно было бы преобразовать в файлы .res - тогда другое дело. И вроде как для того существует консольная утилитка brcc32.exe ( из пакета Delphi). Но ни черта она у меня не работает (может требуются какие то доп DLL или ещё что. Про то, не известно...)

K.A.V. 04-03-2015 07:39 2478507

Вложений: 1
Цитата:

Цитата MKN
И вроде как для того существует консольная утилитка brcc32.exe ( из пакета Delphi). Но ни черта она у меня не работает (может требуются какие то доп DLL или ещё что »

Ну так, а ты пробовал её запустить без параметров?
Я так всегда делаю, создаю cmd файл и запускаю консольное приложение без параметров, в основном они ругаются, если им что-то нужно
Код:

brcc32
pause

В итоге видим в окне консоли:
Цитата:

Fatal error could not create interface with rw32core.dll
достаём нужные файлы и вуаля!

Код:

brcc32 "My file.rc"
pause

rc в res компилируется без проблем :)

MKN 06-03-2015 11:21 2479482

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

K.A.V. 06-03-2015 11:55 2479495

Цитата:

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

Создай nsh файл, пропиши туда только свои переменные и в основном скрипте подключи этот файл
Если бы я в своём SFX Creator всё пихал в один nsi файл - я бы с ума уже сошел, только главный файл насчитывает 6200 строк кода и это без дополнительных nsh файлов, которые к нему относятся, в котором валяются функции, которые не изменяются...

MKN 13-03-2015 11:21 2482113

Подскажите пожалуйста, каким образом в EXE файле определить - есть ли в нём конкретная HEX строка ?

Например, для этого файла надо определить есть ли в нём такая строка :

A3484BBE986C4AA9994C530A86D6487D (это признак для определения файлов AutoIt3 compiled script executable, для которых классический метод определения по сигнатуре - не подходит...)

этот файл : http://rghost.ru/private/6zgqqPykN/e...fe25f76010300c



Причём у разных файлов, offset разный, но строка A3484BBE986C4AA9994C530A86D6487D - неизменна


K.A.V. 13-03-2015 20:30 2482357

Чтение побайтово очень долго проходит, если искомая строка не в начале файла и если сам файл больше 5-10 Мб...

Готовый код:
Код:

Function test
; Используются следующие переменные
; $0 - $7
; $R0, $R1, $R2, $R3   
Banner::show /NOUNLOAD ""
Banner::getWindow /NOUNLOAD
var /global banner
      Pop $0
  GetDlgItem $banner $0 1030                               

 StrCpy $R1 "A3484BBE986C4AA9994C530A86D6487D"
 StrCpy $R2 "C:\Windows\Explorer.exe"
 strcpy $0 $0 0
 StrCpy $R0 "$R1"
 stget:
 intop $0 $0 + 1
 StrCpy $R0 "$R0" -2
 StrCmp $R0 "" 0 stget
 StrCpy $R0 "$R1" 2  ; записываем первые 2 символа, с них будем начинать чтение байтов подряд, если встретятся в файле
 intop $R3 $0 - 1 ; нам нужно знать, сколько последовательно байт считать, чтобы точно сверить всю последовательность байт
 
StrCpy $1 "0"  ; начальный
StrCpy $5 ""
FileOpen $0 "$R2" r
now:
StrCpy $6 0
IntOp $1 $1 + 1
FileSeek $0 "$1" SET $1
IntFmt $2 "0x%08X" $1
  SendMessage $Pop2 ${WM_SETTEXT} 0 "STR:[$2] $1"
FileReadByte $0 $3
StrCmp $3 "" no 0
IntFmt $4 "%02X" $3
StrCmp $4 "$R0" 0 now
StrCpy $5 "$4"
 getBytes:
IntOp $6 $6 + 1
FileReadByte $0 $3
IntFmt $4 "%02X" $3
StrCpy $5 "$5$4"
 StrCmp $6 "$R3" 0 getBytes 
StrCmp $5 "$R1" 0 now
MessageBox MB_OK|MB_ICONINFORMATION "$R1$\n$\nНайдено, начиная со смещений:$\nHEX - $2$\nDEC - $1"  idok end
no:
 MessageBox MB_OK|MB_ICONSTOP "в данном файле нет таких данных"
end:
FileClose $0
Banner::destroy
FunctionEnd

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

MKN 14-03-2015 09:32 2482478

Цитата:

Цитата K.A.V.
Чтение побайтово очень долго проходит, если искомая строка не в начале файла »

Действительно, очень долго... Для практики надо бы побыстрее... Интересно, можно как то по иному реализовать поиск ?
Может подойдёт плагин http://wiz0u.free.fr/prog/nsisFile/ ?

K.A.V. 14-03-2015 10:09 2482488

Цитата:

Цитата MKN
Интересно, можно как то по иному реализовать поиск ? »

Я в NSIS новичок, поэтому всех тонкостей не знаю, может, можно как-то и быстрее :)

Цитата:

Цитата MKN
Может подойдёт плагин http://wiz0u.free.fr/prog/nsisFile/ ? »

Подошел

Код:

Function test
 FileOpen $2 "$EXEDIR\VirtualBox-4.3.24-98716-Win.exe" r
 nsisFile::FileFindBytes "$2" "A3484BBE986C4AA9994C530A86D6487D" "-1"
 pop $1
 FileClose $2
    MessageBox MB_OK|MB_ICONINFORMATION "$1"
FunctionEnd

Если не найдено $1 = "-1"
Если найдено $1 = смещение по DEC

MKN 14-03-2015 10:16 2482491

Цитата:

Цитата K.A.V.
Я в NSIS новичок, поэтому всех тонкостей не знаю »

Если бы все были такими "новичками"... :) то давно бы Windows на NSIS переписали. :)

MaGoth 15-03-2015 07:48 2482828

Вложений: 4
Привет народ,
Имеется вопрос.. Ковыряю один инсталлер, формально всё по тех. части оригинального уже воссоздал и прописал что нужно..
Но, не работает как надо только кусок мелкого оформления. Не отображаются тексты на странице Велком и её заголовка..

Пример в картинках:
Скрытый текст
Оригинал:
Файл 123268 Файл 123269

Восстановленный:
Файл 123270 Файл 123271

Пример кода..

Код:

;===============================================================================
;Modification Development Kit Setup Script
;===============================================================================
; Conditional Compilation
;        !define MDK_SMALL ; exclude stuff
        !define MDK_COLOR ; modified NSIS
;        !define MOD_INCLUDE_PLAYERKIT


; Compiler Settings
CRCCheck force
SetCompressor lzma
!ifdef G2MDK_SMALL
SetCompressorDictSize 128 ; see RAM table
!else
SetCompressorDictSize 32 ; see RAM table
!endif
; DictSize Compress Decompress
;    8 MB  141 MB  10 MB (default)
;    12 MB  179 MB  14 MB
;    16 MB  217 MB  18 MB
;    24 MB  293 MB  26 MB
;    32 MB  369 MB  35 MB
;    48 MB  521 MB  50 MB
;    64 MB  673 MB  66 MB
;    96 MB  977 MB  98 MB
;  128 MB  1281 MB  130 MB
;  192 MB  1889 MB  194 MB
AllowRootDirInstall true
!ifdef G2MDK_SMALL
!packhdr "packhdr.tmp" "upx --best packhdr.tmp"
!endif


; Includes
!include "MUI.nsh"
!include "Sections.nsh"
!include ".\setup\g2mod.nsh"


; Version Definitions
!define VER_MAJOR 0
!define VER_MINOR 0
!define VER_PATCH 0
!define VER_FLAGS 0

!define VER_TEXT  "${VER_MAJOR}.${VER_MINOR}"
!ifndef G2MDK_SMALL
!define VER_FILE  "${VER_MAJOR}.${VER_MINOR}"
!else
!define VER_FILE  "${VER_MAJOR}.${VER_MINOR}"
!endif

!define NAME_LONG "Modification Development Kit"
!define UNREG_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\MDK"

OutFile "..."
InstallDir "..."
InstallDirRegKey HKLM "..."


;===============================================================================
;  MUI

Name "G2MDK ${VER_TEXT}"
;BrandingText "${NAME_LONG}"
;LicenseForceSelection radiobuttons


; Configuration (all)
!ifdef MDK_COLOR
  !define MUI_BGCOLOR "000000"
  !define MUI_TEXTCOLOR "CDCBEB"
  !define MUI_FINISHPAGE_LINK_COLOR "0xFDF8F8"
!endif
!define MUI_ICON ".ico"
!define MUI_UNICON ".ico"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_RIGHT
!define MUI_HEADERIMAGE_BITMAP ".bmp"
!define MUI_WELCOMEFINISHPAGE_BITMAP ".bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP ".bmp"

; Configuration (Installer)
!define MUI_WELCOMEPAGE_TITLE_3LINES
!define MUI_WELCOMEPAGE_TEXT "Dieser Assistent wird Sie durch die Installation \
  von MDK (${NAME_LONG}) begleiten.\r\n\r\nEs wird empfohlen vor der \
  Installation alle anderen Programme zu schlieЯen.\r\n\r\n$_CLICK"
!define MUI_FINISHPAGE_NOREBOOTSUPPORT
!define MUI_FINISHPAGE_TITLE_3LINES
!define MUI_FINISHPAGE_LINK "..."
!define MUI_FINISHPAGE_LINK_LOCATION "..."

; Setup Pages (Installer)
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE ".rtf"
Page custom PageReinstall PageLeaveReinstall
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

; Configuration (Uninstaller)
!define MUI_WELCOMEPAGE_TITLE_3LINES
!define MUI_WELCOMEPAGE_TEXT "Dieser Assistent wird Sie durch die \
  Deinstallation von GMDK (${NAME_LONG}) begleiten.\r\n\r\n\
  Bitte beenden Sie alle MDK-Tools,\r\n\
  bevor Sie mit der Deinstallation fortfahren.\r\n\r\n$_CLICK"
!define MUI_FINISHPAGE_TITLE_3LINES

; Setup Pages (Uninstaller)
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

; Setup Language
!insertmacro MUI_LANGUAGE "German"

; Reserve Files
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
...



Код восстанавливал изучая оригинал(написан на базе Нсиськи 2.0), сам использую Нсис юникод 2.46.5.
Компилил как в Анси, так и в Юнике, и взде одинаково, - текст не отображается..
В чем грабля может быть ?! :clever-ma

K.A.V. 15-03-2015 10:54 2482859

Цитата:

Цитата MaGoth
Не отображаются тексты на странице Велком и её заголовка.. »

Они отображаются, просто цвет текста к этому тексту не применяется, у вас заливается черным фоном и текст тоже остаётся черным.

Цитата:

Цитата MaGoth
В чем грабля может быть ?! »

В том, что дефинька:
Цитата:

Цитата MaGoth
!define MUI_TEXTCOLOR »

вообще в NSIS не существует, ни в 2.46 ни в 3.0b1, ни в документации о ней не сказано, ни в include файлах настроек интерфейсов её нет

MUI_BGCOLOR есть, а вот MUI_TEXTCOLOR нет, соответственно, цвет на фон то применяется, а на текст - нет
Пишите свою функцию с установкой цветов на тексты командой SetCtlColors, либо ковыряйте include файл интерфейса и добавляйте такую дефиньку, чтобы применяла цвета на текст

MaGoth 20-03-2015 08:39 2485011

K.A.V.,
Не напомнишь случаем хенделы этих текстовых полей и окна..? Ковырял ковырял интерфес, но что-то кроме как изменения цвета фона в них, ничего более не наковырял. Может ковырялка не того калибра ?!
Да и залезть в ресурсы интерфейса пока нет возможности...

K.A.V. 20-03-2015 12:19 2485108

Цитата:

Цитата MaGoth
Да и залезть в ресурсы интерфейса пока нет возможности... »

Я вам про ресурсы и не говорил...

Цитата:

Цитата K.A.V.
include файл интерфейса »

Код:

!include "MUI.nsh"
который перенаправляет нас в
Код:

C:\Program Files (x86)\NSIS\Contrib\Modern UI\System.nsh
в котором прописаны все детали интерфейса, установка цветов, текста, изображений и т.д.

Цитата:

Цитата MaGoth
Не напомнишь случаем хенделы этих текстовых полей и окна..? »

Если речь идёт о странице приветствия и финиша - то там по-другому они получаются, т.к. странички эти создаются с помощью InstallOptions, хэндлы элементов можно получить чтением данных из INI файла настроек ($PLUGINSDIR\ioSpecial.ini), который создаётся перед показом страницы приветствия/финиша, сделать это можно в функции
Код:

MUI_PAGE_CUSTOMFUNCTION_SHOW
В своём коде замените ваши куски этими:
Код:

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "WelcomeFinishColors_K.A.V._Example"
; Setup Pages (Installer)
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE ".rtf"
Page custom PageReinstall PageLeaveReinstall
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "WelcomeFinishColors_K.A.V._Example"
!insertmacro MUI_PAGE_FINISH

Код:

; Setup Pages (Uninstaller) 
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "un.WelcomeFinishColors_K.A.V._Example"
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "un.WelcomeFinishColors_K.A.V._Example"
!insertmacro MUI_UNPAGE_FINISH

Обратите внимание, что необходимо прописывать CUSTOMFUNCTION и перед страничкой приветствия, и перед страничкой финиша
И ещё обратите внимание на то, что необходимо использовать 2 разные функции для установщика и деинсталлятора

сами функции
Код:

Function WelcomeFinishColors_K.A.V._Example
  ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 2" "HWND"
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}

  ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 3" "HWND"
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}

GetDlgItem $0 $HWNDPARENT 1037
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
GetDlgItem $0 $HWNDPARENT 1038
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR} 
FunctionEnd


Function un.WelcomeFinishColors_K.A.V._Example
  ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 2" "HWND"
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}

  ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 3" "HWND"
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}

GetDlgItem $0 $HWNDPARENT 1037
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
GetDlgItem $0 $HWNDPARENT 1038
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR} 
FunctionEnd


Limonica 30-03-2015 12:06 2489540

Как определить за NAT находится пк или нет с помощью NSIS?

K.A.V. 30-03-2015 17:21 2489730

Цитата:

Цитата Limonica
Как определить за NAT находится пк или нет с помощью NSIS? »

Вы хотите решение в 1 строчку кода?
Я, например, не шарю в сетевых технологиях и чтобы понять, чего вы действительно хотите от кода - я перед написанием кода должен проштудировать документацию относительно вашего вопроса и только после этого понять, какой функционал необходим в коде
Если готового плагина/решения нет на сайте NSIS - то я должен буду сначала понять, что такое NAT и понять, что нужно для того, чтобы приступить к написанию кода к определению за NAT/не за NAT, а это дополнительное потраченное время, лично для меня это время будет потрачено зря, т.к. мне эта тема не интересна

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

Как определить за NAT находится пк или нет с помощью NSIS? Если готового решения нет, то необходим следующий функционал:
1. Определить IP адрес локальной машины
2. Определить, входит ли этот адрес в диапазоны локальных зарезервированных сетей типа 192.168.255.255, 10.255.255.255 и бла бла бла перечисляем дальше


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

Код:

Name "GetIP Test"
OutFile "GetIP Test.exe"
 
Function .onInit
call GetIP
quit
FunctionEnd
             
Function GetIP
System::Alloc 400
pop $R0
System::Call 'ws2_32::WSAStartup(i 0x202, i R0)'
System::Call 'ws2_32::gethostname(t .r0, i ${NSIS_MAX_STRLEN}) i .r1'
System::Call 'ws2_32::gethostbyname(t "$0") i.R1'
System::Call '*$R1(&v12,*i.R2)' 
System::Call '*$R2(i.R3)'
System::Call 'ws2_32::inet_ntoa(i R3) t.R4'
System::Call 'ws2_32::WSACleanup()'
System::Free $R0
; $0 - имя хоста
; $R4 - IP адрес

Push '$R4'
Call CheckIP
Pop $0
; в $0 результат, смотрим инфу ниже:
;        1 - LoopBack IP (localhost, indicates no connection to a LAN or to the internet).
;        2 - Automatic Private IP Address (no DHCP server).
;        3 - Network IP.
;        4 - Internet IP.
 StrCpy $1 "Мы за NAT"
 StrCmp $0 "4" 0 +2
 StrCpy $1 "Мы не за NAT"
 MessageBox MB_OK|MB_ICONINFORMATION "IP - $R4$\noutput - $0$\n$\n$1"
FunctionEnd


Function CheckIP
  Exch $0
  Push $1
 
  ; Check 127.x.x.x
  Push '127.0.0.0'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 2 '' Range1    ; IP cannot be in range of LoopBack addresses
  Push '127.255.255.255'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 1 LoopBack      ; We found a LoopBack IP
 
  ; Check 10.x.x.x
  Range1:
  Push '10.0.0.0'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 2 '' Range2    ; IP cannot be in range 1
  Push '10.255.255.255'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 1 LanIp        ; We found a LanIp
 
  ; Check 172.16.x.x to 172.31.x.x
  Range2:
  Push '172.16.0.0'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 2 '' Range3    ; IP cannot be in range 2
  Push '172.31.255.255'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 1 LanIp        ; We found a LanIp
 
  ; Check 192.168.x.x
  Range3:
  Push '192.168.0.0'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 2 '' Range4    ; IP cannot be in range 3
  Push '192.168.255.255'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 1 LanIp        ; We found a LanIp
 
  ; Check 169.254.x.x
  Range4:
  Push '169.254.0.0'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 2 '' InternetIp ; It should be an internet IP
  Push '169.254.255.255'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 1 APA          ; We found an Automatic Private IP Address
 
  Goto InternetIp          ; Remaining addresses are internet IPs
 
  LoopBack:
  StrCpy $1 1
  Goto Exit
 
  APA:
  StrCpy $1 2
  Goto Exit
 
  LanIp:
  StrCpy $1 3
  Goto Exit
 
  InternetIp:
  StrCpy $1 4
 
  Exit:
  Exch $1
  Exch 1
  Exch $0
  Exch 1
FunctionEnd


Function VersionCheck
  Exch $0 ;second versionnumber
  Exch
  Exch $1 ;first versionnumber
  Push $R0 ;counter for $0
  Push $R1 ;counter for $1
  Push $3 ;temp char
  Push $4 ;temp string for $0
  Push $5 ;temp string for $1
  StrCpy $R0 "-1"
  StrCpy $R1 "-1"
  Start:
  StrCpy $4 ""
  DotLoop0:
  IntOp $R0 $R0 + 1
  StrCpy $3 $0 1 $R0
  StrCmp $3 "" DotFound0
  StrCmp $3 "." DotFound0
  StrCpy $4 $4$3
  Goto DotLoop0
  DotFound0:
  StrCpy $5 ""
  DotLoop1:
  IntOp $R1 $R1 + 1
  StrCpy $3 $1 1 $R1
  StrCmp $3 "" DotFound1
  StrCmp $3 "." DotFound1
  StrCpy $5 $5$3
  Goto DotLoop1
  DotFound1:
  Strcmp $4 "" 0 Not4
    StrCmp $5 "" Equal
    Goto Ver2Less
  Not4:
  StrCmp $5 "" Ver2More
  IntCmp $4 $5 Start Ver2Less Ver2More
  Equal:
  StrCpy $0 "0"
  Goto Finish
  Ver2Less:
  StrCpy $0 "1"
  Goto Finish
  Ver2More:
  StrCpy $0 "2"
  Finish:
  Pop $5
  Pop $4
  Pop $3
  Pop $R1
  Pop $R0
  Pop $1
  Exch $0
FunctionEnd

Section 
SectionEnd


MKN 31-03-2015 17:00 2490070

Необходимо переименовать все файлы в папке, чтобы вместо имён была нумерация ( варианты 0,1,2 и т.д. или 01, 02 и т.д. или 001 002 и т.д. ) без расширений
Также интересует выборочное переименование , типа, переимен. начиная с такого то по такой то файл и др сочетания...
Использовал такой код :
Код:

outfile rename_enumerate-test.exe
Var /global n

Section
StrCpy $n 0
ClearErrors
FindFirst $0 $1 $EXEDIR\D\*.*
loop:
StrCmp $1 "" done
Rename "$EXEDIR\D\$1" "$EXEDIR\D\$n"
FindNext $0 $1
IntOp $n $n + 1
Goto loop
done:
FindClose $0
SectionEnd

Но почему то получается хаотичное переименование, особенно если много файлов...

K.A.V. 31-03-2015 18:31 2490102

Код:

Function RenameFiles 
Var /global n
StrCpy $n 1 
Delete "$TEMP\tmpfile.ini"

ClearErrors
FindFirst $0 $1 $DESKTOP\D\*.*
loop:
StrCmp $1 "" done
StrCmp $1 "." next
StrCmp $1 ".." next

ReadINIStr $2 "$TEMP\tmpfile.ini" "tmp" "$1"
StrCmp $2 "1" next 0

Rename "$DESKTOP\D\$1" "$DESKTOP\D\$n"
WriteINIStr "$TEMP\tmpfile.ini" "tmp" "$n" "1"
IntOp $n $n + 1 

next:
FindNext $0 $1
Goto loop
done:
FindClose $0
Delete "$TEMP\tmpfile.ini"
FunctionEnd

Цитата:

Цитата MKN
Но почему то получается хаотичное переименование, особенно если много файлов... »

Ты упустил 1 очень важный момент: после переименования файл считается "новым", т.е. ещё не перечисленным, отсюда такой результат, переименованные файлы вновь перечисляются и получается каша в именах, поэтому код отрабатывает не так, как нам бы хотелось
Соответственно, чтобы сделать этот процесс правильным - нам нужно запоминать, какой файл уже был переименован (чтобы повторно его не обрабатывать), для этого сбрасываем имена переименованных файлов во временный файл и перед каждой командой переименования проверяем наличие записи о текущем файле
Ещё один момент, когда перечисляешь все файлы в папке командой Find*, в переменную имени файла сбрасывается значение "." и "..", из-за чего счетчик так же может быть не правильным, проверку на эти значения я так же прописал
Ну и ещё один момент - счетчик нужно менять только после операции переименования, а не после/перед командой FindNext, т.к. опять же, счетчик будет не правильным

Цитата:

Цитата MKN
Также интересует выборочное переименование , типа, переимен. начиная с такого то по такой то файл и др сочетания... »

Типа будет конкретика - будет и код, нет желания потом опять переписывать код по причине недопонимания/недостаточности подробностей

p.s.
я бы вообще, сделал всё это дело через функцию Locate (красивее/удобнее), но т.к. она багованная с самого 2.46 и при указании некоторых команд (например ReadINIStr) в callback функцию, она просто завершается - из-за этого этот вариант отпадает :(

MKN 31-03-2015 18:44 2490105

Цитата:

Цитата K.A.V.
после переименования файл считается "новым", т.е. ещё не перечисленным, отсюда такой результат »

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

MKN 01-04-2015 12:22 2490361

Вариант с перемещением вроде как работает, но отсчёт начинается почему то с 2. Как исправить ?

Код:

outfile rename_enumerate-test.exe
Var /global n

Section
StrCpy $n 0
ClearErrors
FindFirst $0 $1 $EXEDIR\D\*.*
loop:
StrCmp $1 "" done
Rename "$EXEDIR\D\$1" "$EXEDIR\D1\$1"
Rename "$EXEDIR\D1\$1" "$EXEDIR\D1\0$n"
IntOp $n $n + 1
FindNext $0 $1
Goto loop
done:
FindClose $0
SectionEnd


K.A.V. 01-04-2015 18:02 2490519

Цитата:

Цитата MKN
но отсчёт начинается почему то с 2 »

Я же в посте выше всё описал...
Цитата:

Цитата K.A.V.
Ещё один момент, когда перечисляешь все файлы в папке командой Find*, в переменную имени файла сбрасывается значение "." и "..", из-за чего счетчик так же может быть не правильным, проверку на эти значения я так же прописал »

Код:

outfile rename_enumerate-test.exe
Var /global n

Section
StrCpy $n 0
ClearErrors
FindFirst $0 $1 $EXEDIR\D\*.*
loop:
StrCmp $1 "" done
StrCmp $1 "." next
StrCmp $1 ".." next

Rename "$EXEDIR\D\$1" "$EXEDIR\D1\$1"
Rename "$EXEDIR\D1\$1" "$EXEDIR\D1\0$n"
IntOp $n $n + 1
next:
FindNext $0 $1
Goto loop
done:
FindClose $0
SectionEnd

p.s.
а зачем, вообще, ты 2 раза команду прописываешь? одной разве не достаточно?
Код:

Rename "$EXEDIR\D\$1" "$EXEDIR\D1\0$n"

MKN 02-04-2015 10:04 2490765

Цитата:

Цитата K.A.V.
в переменную имени файла сбрасывается значение "." и ".." »

точно так, прозевал этот момент... А с чего вдруг образуются эти странные значения ?
Цитата:

Цитата K.A.V.
одной разве не достаточно? »

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

ps Возвращаясь к поиску HEX значений в файлах, для которых "класический" код работает , как черепаха, т.е. не годен для практики.
Оказывается есть иной приём поиска. HEX-последовательность ищется сначала в первых 300 кб, потом в следующих и т.д.
Поэтому поиск выполняется очень быстро. Есть и готовая реализация, но на AutoIt3. Было бы интересно переконвертировтаь этот код в NSIS...
читать дальше »
Код:

#cs HEX-последовательность ищется сначала в первых 300 кб, потом в следующих и т.д.
Поэтому поиск выполняется очень быстро.
#ce

Opt('MustDeclareVars', 1)

;~ поменяйте $sFile и $sHex на свои
Global $sFile = 'C:\ProgramNoAdmin\AutoIt3_381\AutoIt3.exe', $sHex = 'C4 04 84 C0 74 0B 84 DB 75 2D 32 C0 5B 8B E5', _
        $iOffSet, $hFile, $sRead

$iOffSet = _Find_HexString_In_File($sFile, $sHex)
If @error Then Exit ConsoleWrite('Error: ' & @error & @LF)
If Not $iOffSet Then Exit ConsoleWrite('Not hex string' & @LF)

ConsoleWrite('Offset = ' & $iOffSet & ' (hex offset = 0x' & Hex($iOffSet, 8) & ')' & @LF)
;~ проверяем полученный результат:
$hFile = FileOpen($sFile, 16)
FileSetPos($hFile, $iOffSet, 0);$FILE_BEGIN = 0
$sRead = Hex(FileRead($hFile, StringLen(StringStripWS($sHex, 8)) / 2))
FileClose($hFile)
ConsoleWrite($sRead & @TAB & ($sRead = StringStripWS($sHex, 8)) & @LF)

#cs
    Вернет при успехе позицию вхождения $s_HexString в файле $s_File или 0, если нет вхождения.
    При неудаче вернет 0 и флаг @error = :
    1  - нет файла $s_File;
    2  - длина $s_HexString не кратна 2;
    3  - не получилось открыть файл $s_File;
    4  - ошибка функции FileSetPos.

    Читает весь файл подряд по 300 Кб, можно поменять на нужные Вам
#ce
Func _Find_HexString_In_File($s_File, $s_HexString)
    Local Const $i_Read = 300 * 1024, $__FILE_CURRENT_ = 1
    Local $i_Len, $h_File, $b_Read, $i_Pos, $i_Count, $i_Err

    If Not FileExists($s_File) Then Return SetError(1, 0, 0)
    If IsBinary($s_HexString) Then
        $s_HexString = Hex($s_HexString)
    Else
        $s_HexString = StringStripWS($s_HexString, 8)
    EndIf
    $i_Len = StringLen($s_HexString)
    If Mod($i_Len, 2) Then Return SetError(2, 0, 0)
    $i_Len /= 2
    $h_File = FileOpen($s_File, 16)
    If $h_File = -1 Then Return SetError(3, 0, 0)
    While 1
        $b_Read = FileRead($h_File, $i_Read)
        If @extended <= $i_Len Then ExitLoop
        $i_Pos = StringInStr($b_Read, $s_HexString, 2)
        If Mod($i_Pos, 2) Then ExitLoop
        $i_Pos = 0
        If Not FileSetPos($h_File, -$i_Len, $__FILE_CURRENT_) Then
            $i_Err = 4
            ExitLoop
        EndIf
        $i_Count += 1
    WEnd
    FileClose($h_File)
    If $i_Err Then Return SetError($i_Err, 0, 0)
    If $i_Pos Then Return Int(($i_Pos - 1) / 2 - 1 + ($i_Read - $i_Len) * $i_Count)
    Return 0
EndFunc  ;==>_Find_HexString_In_File


K.A.V. 03-04-2015 22:51 2491552

Цитата:

Цитата MKN
А с чего вдруг образуются эти странные значения ? »

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

Цитата:

Цитата MKN
Было бы интересно переконвертировтаь этот код в NSIS... »

Вот кому интересно, тот пусть и конвертирует, я AutoIt3 не знаю и разбираться в неизвестном мне языке как-то не особо хочется

wolkow70 04-04-2015 14:01 2491699

Что-то не могу собрать скрипт с конструкцией типа:

Section
StrCpy $0 "7"
${If} $0 => 5
MessageBox MB_OK "$0=>5"
${EndIf}
SectionEnd

Показывает, что нет такого "=>"
!insertmacro: macro named "_=>" not found!
Пример секции из справки, библиотека LogicLib.nsh есть, но у меня старый NSIS 2.46

MKN 04-04-2015 14:21 2491707

wolkow70,
Цитата:

Цитата wolkow70
нет такого "=>" »

потому что нет...
есть (во всяком случае в С# ) :
>= Больше или равно

K.A.V. 04-04-2015 14:27 2491709

Цитата:

Цитата wolkow70
Что-то не могу собрать скрипт с конструкцией типа:
Section
StrCpy $0 "7"
${If} $0 => 5
MessageBox MB_OK "$0=>5"
${EndIf}
SectionEnd
Показывает, что нет такого "=>"
!insertmacro: macro named "_=>" not found!
Пример секции из справки, библиотека LogicLib.nsh есть, но у меня старый NSIS 2.46 »

Опечатка в нашем файле справки.
Вам нужно указать >=

LogicLib.nsh

; The following "expressions" are available:
; Standard (built-in) string tests (which are case-insensitive):
; a == b; a != b
; Additional case-insensitive string tests (using System.dll):
; a S< b; a S>= b; a S> b; a S<= b
; Case-sensitive string tests:
; a S== b; a S!= b
; Standard (built-in) signed integer tests:
; a = b; a <> b; a < b; a >= b; a > b; a <= b
; Standard (built-in) unsigned integer tests:
; a U< b; a U>= b; a U> b; a U<= b
; 64-bit integer tests (using System.dll):
; a L= b; a L<> b; a L< b; a L>= b; a L> b; a L<= b
; ptrdiff_t integer tests
; a P= b; a P<> b; a P< b; a P>= b; a P> b; a P<= b
; Built-in NSIS flag tests:
; ${Abort}; ${Errors}; ${RebootFlag}; ${Silent}
; Built-in NSIS other tests:
; ${FileExists} a
; Any conditional NSIS instruction test:
; ${Cmd} a
; Section flag tests:
; ${SectionIsSelected} a; ${SectionIsSectionGroup} a;
; ${SectionIsSectionGroupEnd} a; ${SectionIsBold} a;
; ${SectionIsReadOnly} a; ${SectionIsExpanded} a;
; ${SectionIsPartiallySelected} a

Примеры использования есть так же в файле "<NSIS>\Examples\LogicLib.nsi"

wolkow70 04-04-2015 14:28 2491710

Цитата:

Цитата MKN
потому что нет...
есть :
>= Больше или равно »

Благодарствую за подсказку.
В таком случае, нужно авторам Справочника поправить ошибку, так как пример оттуда.

Цитата:

Цитата K.A.V.
Вам нужно указать >= »

Спасибо за подсказку, заработало.

MKN 09-04-2015 13:41 2493649

Столкнулся с не возможностью совместного использования "FileVerInfo.nsh" и "FileFunc.nsh". При компиляции - ругань (отдельно, FileVerInfo.nsh работает нормально) .
Как их подружить ?

K.A.V. 09-04-2015 13:56 2493652

Цитата:

Цитата MKN
Столкнулся с не возможностью совместного использования "FileVerInfo.nsh" и "FileFunc.nsh" »

FileVerInfo.nsh - что это и где его достать то? В дистрибутиве NSIS - нету, поиском по сайту NSIS - нету, лениво вбил в гугл - и снова ничего

MKN 09-04-2015 15:04 2493681

FileVersionInfo Header v1.2.2
читать дальше »
Код:

/*

---------------------------------------------
        FileVersionInfo Header v1.2.2

          All Functions comes from:
      http://nsis.pastebin.com/f5e461c4d
              Written by Anders
      Collected and modified by JiaKe
---------------------------------------------

Copyright 2011 Nullsoft Install System

Usage in script:

!include "FileVerInfo.nsh"

[Section|Function]

 ${FileVerInfoFunc} FILEPATH $var

# $var=["error"|""|Result]
# "error": This version info doesn't exist
# "": This version info exsits but is blank
# Result: The value of this version info

[SectionEnd|FunctionEnd]

FileVerInfoFunc can be:
  [un.]GetFileVersion
  [un.]GetProductVersion
  [un.]GetProductName
  [un.]GetCompanyName
  [un.]GetFileDescription
  [un.]GetComments
  [un.]GetLegalCopyright
  [un.]GetLegalTrademarks
  [un.]GetInternalName
  [un.]GetOriginalFilename
  [un.]GetSpecialBuild
  [un.]GetPrivateBuild
  [un.]GetUserDefined <Userdefined Name>

---------------------------------------------

 Examples:
  ${GetCompanyName} $WINDIR\Notepad.exe $R0
  ${un.GetComments} $SYSDIR\registry.exe $R0

---------------------------------------------

*/

!ifndef FILEVERINFO_INCLUDED
!define FILEVERINFO_INCLUDED

!include Util.nsh
!include LogicLib.nsh

!verbose push
!verbose 3
!ifndef _FILEVERINFO_VERBOSE
  !define _FILEVERINFO_VERBOSE 3
!endif
!verbose ${_FILEVERINFO_VERBOSE}
!define FILEVERINFO_VERBOSE `!insertmacro FILEVERINFO_VERBOSE`
!verbose pop

!macro FILEVERINFO_VERBOSE _VERBOSE
  !verbose push
  !verbose 3
  !undef _FILEVERINFO_VERBOSE
  !define _FILEVERINFO_VERBOSE ${_VERBOSE}
  !verbose pop
!macroend

!macro GetFileVerInfoCall _VERINFO_STR_NAME _FILENAME_INPUT _VERINFO_OUTPUT
  !verbose push
  !verbose ${_FILEVERINFO_VERBOSE}
  Push `${_FILENAME_INPUT}`
  Push `${_VERINFO_STR_NAME}`
  ${CallArtificialFunction} GetFileVerInfo_
  Pop `${_VERINFO_OUTPUT}`
  !verbose pop
!macroend

!macro __DefineVersionInfoName _VERINFO_STR_NAME
  !define Get${_VERINFO_STR_NAME}    `!insertmacro GetFileVerInfoCall ${_VERINFO_STR_NAME}`
  !define un.Get${_VERINFO_STR_NAME} `!insertmacro GetFileVerInfoCall ${_VERINFO_STR_NAME}`
!macroend

!insertmacro __DefineVersionInfoName ProductName
!insertmacro __DefineVersionInfoName Comments
!insertmacro __DefineVersionInfoName CompanyName
!insertmacro __DefineVersionInfoName LegalCopyright
!insertmacro __DefineVersionInfoName FileDescription
!insertmacro __DefineVersionInfoName FileVersion
!insertmacro __DefineVersionInfoName ProductVersion
!insertmacro __DefineVersionInfoName InternalName
!insertmacro __DefineVersionInfoName LegalTrademarks
!insertmacro __DefineVersionInfoName OriginalFilename
!insertmacro __DefineVersionInfoName PrivateBuild
!insertmacro __DefineVersionInfoName SpecialBuild

!define GetUserDefined    `!insertmacro GetFileVerInfoCall`
!define un.GetUserDefined `!insertmacro GetFileVerInfoCall`

!macro GetFileVerInfo_

  !verbose push
  !verbose ${_FILEVERINFO_VERBOSE}

  Exch $R0
  Exch
  Exch $R1
  System::Store S
  System::Call `version::GetFileVersionInfoSize(tR1,*i)i.R2`
  IntCmpU $R2 0 +15
    System::Alloc $R2
    System::Call `version::GetFileVersionInfo(tR1,in,iR2,isR3)i.R4?e`
    Pop $R2
    IntCmpU $R2 0 0 +11 +11
    IntCmpU $R4 0 +10
      System::Call `version::VerQueryValue(iR3,t"\VarFileInfo\Translation",*i.R4,*i)i.R5`
      IntCmpU $R5 0 +8
      System::Call `*$R4(&i2.R6,&i2.R7)`
      IntFmt $R6 "%04x" $R6
      IntFmt $R7 "%04x" $R7
      System::Call `version::VerQueryValue(iR3,t"\StringFileInfo\$R6$R7\$R0",*i.R6,*i.R7)i.R8`
      IntCmpU $R8 0 +3
      System::Call `*$R6(&t$R7.s)`
      Goto +2
      Push `error`
    IntCmpU $R3 0 +2
    System::Free $R3
  System::Store L
  Exch 2
  Exch
  Pop $R1
  Pop $R0
  !verbose pop
!macroend
!endif


На базе этого кода, похоже сделан MoreInfo plugin http://nsis.sourceforge.net/MoreInfo_plug-in

Но и у FileVerInfo.nsh , и у MoreInfo plugin есть такая лажа - инфа из некоторых файлов получается только в виде первого символа...
Например, так происходит при снятии инфы у файла vcredist_x86.exe (MicrosoftVisual C ++ 2012 Redistributable)
https://www.microsoft.com/ru-ru/down....aspx?id=30679



Плагин и хедер, вроде как оч полезные, но и в то же время для некоторых случаев, бесполезные...
Как бы это исправить (исходники есть http://www.fdos.org/win32/nsis/plugi...fo.1.0.1.2.zip ) ?

Или хотя бы сделать внятным код для функции GetFileVersionInfo (и сопутствующих функций - см. код FileVersionInfo Header), чтобы определять параметры свойств файлов...

ps http://dictionary.cambridge.org/ru/p...танский/header

K.A.V. 09-04-2015 15:36 2493691

MKN, закомментируй в хидере строку
Код:

!insertmacro __DefineVersionInfoName FileVersion
ругается из-за того, что макрос GetFileVersion уже есть

Цитата:

Цитата MKN
Или хотя бы сделать внятным код для функции GetFileVersionInfo (и сопутствующих функций - см. код FileVersionInfo Header), чтобы определять параметры свойств файлов... »

Ну так, посмотреть в хидере, что доступно и прописать как команды, не?

Код:

${GetProductName} "$WINDIR\explorer.exe" $0
${GetComments} "$WINDIR\explorer.exe" $1
${GetCompanyName} "$WINDIR\explorer.exe" $2
${GetLegalCopyright} "$WINDIR\explorer.exe" $3
${GetFileDescription} "$WINDIR\explorer.exe" $4
${GetProductVersion} "$WINDIR\explorer.exe" $5
${GetInternalName} "$WINDIR\explorer.exe" $6
${GetLegalTrademarks} "$WINDIR\explorer.exe" $7
${GetOriginalFilename} "$WINDIR\explorer.exe" $8
${GetPrivateBuild} "$WINDIR\explorer.exe" $9
${GetSpecialBuild} "$WINDIR\explorer.exe" $R0

насчет остального, правки исходников и разных глюков - это точно не ко мне, мне достаточно того, как я намучался при написании dll расширения оболочки для встраивания в контекстное меню файлов пункт для SFX Creator, C++ это не моё...

MKN 09-04-2015 15:41 2493695

Кстати и штатный ${GetFileVersion} - показывает только первый символ... Как определять версию файла vcredist_x86.exe... ? Ещё мне надо определять версии шрифтов... Существующие плагины тоже не помощники. Кое что, да кое когда определяют, а что надо - нет... :)
NSIS ни черта не умеет, за что не возьмись... Начинаю в нём разочаровываться... :) Разрабы этот продукт сделали для неискушенных в программировании пользователей, вроде как старались , а поддержать и расширять не хотят...
Цитата:

Цитата K.A.V.
ругается из-за того, что макрос GetFileVersion уже есть »

Это понятно из сообщения. Что делать то ?

K.A.V. 09-04-2015 16:10 2493710

Цитата:

Цитата MKN
Это понятно из сообщения. Что делать то ? »

Я же тебе выше ответил, закомментируй указанную строку, монитор запачкался что ли? :)

Цитата:

Цитата MKN
Кстати и штатный ${GetFileVersion} - показывает только первый символ... Как определять версию файла vcredist_x86.exe... ? »

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

Цитата:

Цитата MKN
NSIS ни черта не умеет, за что не возьмись... Начинаю в нём разочаровываться... »

Немножко умеет, раз его использовала не одна известная компания для создания инсталлеров для своих продуктов

Цитата:

Цитата MKN
вроде как старались , а поддержать и расширять не хотят... »

Эта проблема всех FreeWare проектов, мне кажется, всё держится на энтузиазме создателей и у всех этот энтузиазм со временем проходит, не у всех есть желание вечно сидеть с красными глазами и пилить софт "для народа"

MKN 09-04-2015 16:19 2493715

Цитата:

Цитата K.A.V.
закомментируй указанную строку »

Первым делом закомментил. Всё равно ошибки...
ps Интересно, а нет ли где конвертера из VBScript в NSIS ? :)

K.A.V. 09-04-2015 16:26 2493719

Цитата:

Цитата MKN
Первым делом закомментил. Всё равно ошибки... »

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

MKN 09-04-2015 16:37 2493723

K.A.V.,
у меня такие ошибки :
Цитата:

Error in macro __DefineVersionInfoName on macroline 1
!include: error in script: "FileVerInfo.nsh" on line 97
97 строку комментирую. а что имеется ввиду под macroline 1 ?

K.A.V. 09-04-2015 17:00 2493733

Цитата:

Цитата MKN
а что имеется ввиду под macroline 1 ? »

Ошибка в первой строке в самом макросе
Например, если будет такой код макроса с "левым" текстом в первой строке:

Код:

!macro __DefineVersionInfoName _VERINFO_STR_NAME
мой текст
  !define Get${_VERINFO_STR_NAME}    `!insertmacro GetFileVerInfoCall ${_VERINFO_STR_NAME}`
  !define un.Get${_VERINFO_STR_NAME} `!insertmacro GetFileVerInfoCall ${_VERINFO_STR_NAME}`
!macroend


MKN 09-04-2015 17:06 2493734

Цитата:

Цитата K.A.V.
Например, если будет такой код макроса с "левым" текстом в первой строке: »

Нет там никакого левого текста. Хедер один в один , который я здесь привёл... Хоть комментируй в нём чего, хоть нет - не работает (если вместе с !include "FileFunc.nsh" )...

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

K.A.V. 09-04-2015 17:54 2493754

Вложений: 1
Цитата:

Цитата MKN
Нет там никакого левого текста. Хедер один в один , который я здесь привёл... Хоть комментируй в нём чего, хоть нет - не работает (если вместе с !include "FileFunc.nsh" )... »

Ну не знаю, в чем там у тебя проблема, пробовал пустой код компилить только с этими инклудами?
У меня на NSIS 3.0b1 всё нормально компилится и работает

MKN 09-04-2015 18:02 2493759

K.A.V.,
И с твоим комплектом те же ошибки... Писец какой то...
PS нашёл причину... если FileVerInfo.nsh лежит в одном каталоге со скриптом - ошибка. стОит его убрать - всё ОК...

ya158 09-04-2015 23:55 2493914

Прошу помощи.
В скрипте для конструктора AkelPad я использую для запуска утилит команду вида:
Код:

ExecWait 'hidcon.exe takeown.exe /F "$R8"'
Я решил не применять hidcon.exe для скрытия консольных окон, а использовать nsExec::Exec. На Win 8.1 инсталлятор после замены стал вылетать с ошибкой. Исследуя логи определил, что прекращение работы инсталлятора происходит при обработке следующего куска скрипта:
Код:

  loop:
  ${Locate} "$WINDIR\WINSxS\" "/L=F /M=notepad.exe" "WINSxS"
  IfErrors loop 0
.
.
Function WINSxS
  System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2"
  nsExec::Exec 'takeown.exe /F "$R9"'
  nsExec::Exec 'icacls.exe "$R9" /grant $0:F'
  nsExec::Exec 'takeown.exe /F "$R8"'
  nsExec::Exec 'icacls.exe "$R8" /grant $0:F'

  ${GetSize} "$WINDIR\" "/M=notepad.exe /S=0K /G=0" $R0 $R2 $R3
  ${GetSize} "$R8" "/M=notepad.exe /S=0K /G=0" $R1 $R2 $R3
  ${If} $R0 == $R1
    StrCpy $Path2 '$Path2,$R8'
  ${Else}
    StrCpy $Path3 '$R8'
  ${EndIf}
  Push $0
FunctionEnd

Вылет происходит после команды Push $0. Если вместо nsExec::Exec использовать команду ExecWait 'hidcon.exe .....' , то всё нормально.
В чем может быть проблема

K.A.V. 10-04-2015 05:42 2493953

Цитата:

Цитата MKN
PS нашёл причину... если FileVerInfo.nsh лежит в одном каталоге со скриптом - ошибка. стОит его убрать - всё ОК... »

Что-то у тебя там в сборке NSIS нахимичино, у меня инклуд в одной папке со скриптом и никаких проблем.

Цитата:

Цитата ya158
Если вместо nsExec::Exec использовать команду ExecWait 'hidcon.exe .....' , то всё нормально.
В чем может быть проблема »

Вы используете плагин, который передаёт значения в NSIS инсталлятор, поэтому рекомендуется принимать значения из плагина командой Pop, а не оставлять это "как хочется"

Код:

  System::Call "advapi32::GetUserName(t .R4, *i ${NSIS_MAX_STRLEN} r1) i.r2"
  ${GetSize} "$WINDIR\" "/M=notepad.exe /S=0K /G=0" $R0 $R2 $R3
 
  loop:
  ${Locate} "$WINDIR\WINSxS\" "/L=F /M=notepad.exe" "WINSxS"
  IfErrors loop 0                 

Function WINSxS   
  nsExec::Exec 'takeown.exe /F "$R9"'
  pop $R1
  nsExec::Exec 'icacls.exe "$R9" /grant $R4:F'
  pop $R1
  nsExec::Exec 'takeown.exe /F "$R8"'
  pop $R1
  nsExec::Exec 'icacls.exe "$R8" /grant $R4:F'
  pop $R1

  ${GetSize} "$R8" "/M=notepad.exe /S=0K /G=0" $R1 $R2 $R3
  ${If} $R0 == $R1
    StrCpy $Path2 '$Path2,$R8'
  ${Else}
    StrCpy $Path3 '$R8'
  ${EndIf}
  Push $0
FunctionEnd

И старайтесь писать менее грязный код, не делайте так, как у вас написано - не закидывайте лишних команд в callback функции как в Locate, на этом коде не будет заметно, но если производить поиск всех файлов, то при каждом найденном файле у вас будут отрабатывать 2 команды, которые в этом месте кода не нужны, это я говорю про команду получения информации о файле $WINDIR\notepad.exe и о вашей команде постоянного получения имени пользователя...

MKN 10-04-2015 10:59 2494018

Цитата:

Цитата K.A.V.
Что-то у тебя там в сборке NSIS нахимичино »

Переустановил NSIS на всяк случай... Почему инклуд мешал, так и не понял, но так ведь было...
С FileVerInfo.nsh с определением версии файла всё нормально (но только с номером версии, всё остальное черт те что ! )


А MoreInfo plugin, с тем же файлом, по прежнему показывает только первый символ версии...

ya158 10-04-2015 11:46 2494029

K.A.V.,
Большое спасибо. По поводу грязного кода - полностью согласен, недоглядел. Буду оптимизировать. С nsis сталкиваюсь очень мало. Не могли бы Вы пояснить поподробнее следующее:
Цитата:

Цитата K.A.V.
Вы используете плагин, который передаёт значения в NSIS инсталлятор, поэтому рекомендуется принимать значения из плагина командой Pop, а не оставлять это "как хочется" »


K.A.V. 10-04-2015 12:47 2494065

Цитата:

Цитата MKN
С FileVerInfo.nsh с определением версии файла всё нормально (но только с номером версии, всё остальное черт те что ! ) »

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

Цитата:

Цитата ya158
Не могли бы Вы пояснить поподробнее следующее: »

А что ещё пояснять? :o
Вы читали описание плагина, который используете?
Если на примере, то представьте, что вы вышли в сад собирать яблоки с другом, ваш товарищ кидает вам сорванные яблоки, надеясь, что вы поймаете, а вы думаете "не хочу ловить, пусть на земле полежат" и все яблоки, которые кидает вам друг - падают на землю. Вот и тут так же, плагин вам данные передаёт - вы их не принимаете.
Вообще, это спорный момент в NSIS (в NSIS вообще много разных "фишек" и багов), не всегда вы будете получать краш, если не будете принимать значения от плагинов, от чего это зависит - не могу сказать, т.к. прямо с программированием я не связан, возможно, получается какая-то каша со стеком из-за этого или ещё чего...Нужно всегда тестировать то, что пишите, особенно при использовании плагинов.
Что касается "фишек" NSIS, то об одной я тут писал недавно, когда при использовании команды ReadINIStr (чтение значения параметра из INI файла) в callback функции Locate - функция просто завершается, не продолжая поиск файлов.

ya158 10-04-2015 17:58 2494172

Цитата:

Цитата K.A.V.
Вот и тут так же, плагин вам данные передаёт - вы их не принимаете. »

Видимо я не разобрался с работой плагина. Я думал, что задача плагина - запускать приложения. А на выходе - результат работы приложения. И, если мне не надо знать этот результат, то я его не использую. То есть, на вашем примере, задача - освободить дерево от яблок, а куда потом денутся яблоки - будут ли собраны в мешок или останутся лежать на земле - не важно.
Правильно ли я понял, что результат своей работы плагин помещает в стек и надо его оттуда "вынуть", чтобы не вызывать переполнения? Значит ли это, что после каждого вызова плагина требуется команда типа "pop $R1"?

K.A.V. 10-04-2015 18:47 2494207

Цитата:

Цитата ya158
Я думал, что задача плагина - запускать приложения »

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

Цитата:

Цитата ya158
А на выходе - результат работы приложения »

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

Return Value
------------
If nsExec is unable to execute the process, it will return "error"
on the top of the stack, if the process timed out it will return
"timeout", else it will return the return code from the
executed process.
Цитата:

Цитата ya158
И, если мне не надо знать этот результат, то я его не использую »

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

Цитата:

Цитата ya158
Правильно ли я понял, что результат своей работы плагин помещает в стек »

В цитате выше всё сказано, ReadMe к плагинам читайте

Цитата:

Цитата ya158
Значит ли это, что после каждого вызова плагина требуется команда типа "pop $R1"? »

Опять же, смотря какой плагин и как он написан, не все плагины пишутся так, что они возвращают значения.
Конкретно насчет плагина nsExec вы уже сами увидели, если не принимать значения после исполнения команды - получите краш

Salmo 21-04-2015 15:28 2498732

Уважаемые. Как через NSIS определить включен ли Тестовый режим ОС (testsigning) любой разрядности. Я делал через cmd\bcdedit - очень громоздко...

MKN 21-04-2015 16:51 2498770

Цитата:

Цитата Salmo
делал через cmd\bcdedit - очень громоздко... »

Чего же тут громоздкого... Известен такой вариант :
Код:

; enable test signing
  nsExec::Exec '$SYSDIR\bcdedit.exe /set testsigning on'
  Pop $R0
  ${If} $R0 != 0
  Abort "Failed to enable test signing: $R0"
  ${EndIf}

  ; bcdedit requires a reboot
  SetRebootFlag true


Salmo 21-04-2015 17:06 2498780

Это включение Тестового режима. Какое значение я получу в $R0, если Тестовый режим уже был включен до этой команды? Отличается ли это значение от ситуации, когда просто "Не удалось включить Тестовый режим"? Мне нужно просто установить факт наличия Тестового режима или его отсутствие без попытки включения.

MKN 21-04-2015 17:34 2498796

Цитата:

Цитата Salmo
факт наличия Тестового режима »

Попробуй считывать параметр SystemStartOptions (REG_SZ) из HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
http://www.sql.ru/forum/671956/rezhi...verka-drayvera

Salmo 21-04-2015 17:45 2498797

MKN, Спасибо, посмотрю...Сейчас некогда, убегаю...

Посмотрел, да достаточно считать значение параметра...

Serg866 25-04-2015 23:25 2500751

Друзья как битмап картинку делать размером на всю ширину инсталлера?
это надо в welcome.nsh что-то поменять?

;Image control
${NSD_CreateBitmap} 0u 0u 109u 193u ""

Я так понял вот здесь что-то. Подскажите, буду крайне признателен!

Dodakaedr 29-04-2015 10:34 2502134

Как провести проверку запущена ли программа и если она запущена то вывести сообщение с последующим окончанием работы скрипта?

MKN 29-04-2015 11:38 2502165

Цитата:

Цитата Serg866
как битмап картинку делать размером на всю ширину инсталлера? »

Какой конкретно картинки ? Если фоновой, то уже было в теме ( Фоновое изображение на стандартных страницах (на всех или по выбору) )
Для кастомных страниц, тоже уже рассматривали в теме. Используй поиск...

Цитата:

Цитата Dodakaedr
Как провести проверку запущена ли программа »

См "Справочник" и тему. Уже не раз было...

Salmo 29-04-2015 11:41 2502167

Dodakaedr,
Скрытый текст

;подключаем библиотеку
!include "ProcessFunc.nsh"



;Поиск запущенного процесса по имени процесса

;По указанному имени ищем запущенный процесс
;${FindProcessName} "process.exe" $var
;process.exe - Имя процесса с расширением, которое требуется найти.
;возвращаемые значения в указанную переменную $var

;$var = 1 -процесс найден.
;$var = none -процесс не найден.
;$var = error -ошибка получения снимка запущенных процессов

${FindProcessName} "explorer.exe" $0

StrCmp $0 "1" 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "Проводник запущен!"
;нужный код
StrCmp $0 "none" 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "Проводник не запущен!"
;нужный код
Quit


В Справке в этом коде ошибки

Dodakaedr 29-04-2015 12:21 2502180

Salmo, Как исправить этот конфликт при компиляции?
Код:

Section: "Main"
!insertmacro: _If
!verbose: Invalid verbose level
Error in macro _ProcessExists on macroline 3
Error in macro _If on macroline 9


K.A.V. 29-04-2015 12:42 2502183

Цитата:

Цитата Salmo
В Справке в этом коде ошибки »

Ошибки не в справке, а в том, что под 3 версию NSIS файл инклуда не работает
Если читать тему постоянно, то можно было бы давно себе сохранить нужный файлик или попросить kotkovets вносить изменения в шапку, когда мы правим файлы, выкладывая изменённые библиотеки

Хотя в справке есть немного грешка на этой страничке, например, возвращаемое значение в первом примере 1 - если процесс найден
Код:

${FindProcessName} "explorer.exe" $0
StrCmp $0 1 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "Проводник запущен!"
StrCmp $0 none 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "Проводник не запущен!"

Цитата:

Цитата Dodakaedr
Как исправить этот конфликт при компиляции? »

Попробуйте загрузить обновленный ProcessFunc по ссылке, которую я указал выше и посмотрите, останется ли проблема

Dodakaedr 29-04-2015 12:50 2502185

Цитата:

Цитата K.A.V.
Попробуйте загрузить обновленный ProcessFunc по ссылке, которую я указал выше и посмотрите, останется ли проблема »

Проблема исправлена! Благодарю.

kotkovets 29-04-2015 12:53 2502186

Dodakaedr, скачайте с шапки темы правленный хедер

Salmo 29-04-2015 12:57 2502188

Цитата:

Цитата K.A.V.
Хотя в справке есть немного грешка на этой страничке, например, возвращаемое значение в первом примере 1 - если процесс найден »

Я это и имел ввиду... И еще, скомпилированные EXE_шники не отрабатывали, если 1 и none не были взяты в кавычки... Это что?

K.A.V. 29-04-2015 13:20 2502198

Цитата:

Цитата Salmo
скомпилированные EXE_шники не отрабатывали, если 1 и none не были взяты в кавычки »

У меня отрабатывает всё нормально в таком виде без кавычек

Цитата:

Цитата Salmo
Это что? »

На магию похоже :)

Salmo 29-04-2015 13:26 2502201

Цитата:

Цитата K.A.V.
На магию похоже »

Эта магия, наверное, связана с тем, что компилировал я в SFX Creator 2.7 и хедер старый?

K.A.V. 29-04-2015 14:14 2502209

Цитата:

Цитата Salmo
SFX Creator 2.7 »

Ну, во-первых, я таким старьём не пользуюсь, у меня даже исходников этой версии нет :biggrin:
А во-вторых, не SFX Creator же обрабатывает команды, а сам компилятор NSIS, SFX Creator только создаёт исходный код на NSIS, не более

Salmo 30-04-2015 02:13 2502427

Цитата:

Цитата K.A.V.
сам компилятор NSIS »

Да в общем то я использую SFX Creator как оболочку компилятора для кода, который не создается в нем. Компилятор от SFX Creator 2.7. NSISa нет, - откатывал систему и так и не поставил... Еще раз подтверждаю, что на ХР скомпилированные EXE_шники не отрабатывали, если 1 и none не были взяты в кавычки.

Dodakaedr 03-05-2015 19:25 2503343

Подскажите есть ли плагин или пример как сделать бэкап папки при её существовании?
И как это исправить
Код:

IfFileExists expects 2-3 parameters, got 1.
Usage: IfFileExists filename label_to_goto_if_file_exists [label_to_goto_otherwise]

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

SetShellVarContext all
IfFileExists "$APPDATA\Color\EQ"
SetShellVarContext all
Rename $APPDATA\Color\EQ $APPDATA\Color\EQ_Backup

Проверить не могу из-за ошибки описанной выше.

Begin2Fly 03-05-2015 20:03 2503357

Dodakaedr, конечно не можете. Внимательнее надо читать справку. У вас не заданы метки перехода.
Код:

IfFileExists [путь к файлу] [метка перехода, если существует файл] [метка перехода, если не существует файла]

Dodakaedr 03-05-2015 20:10 2503362

Цитата:

Цитата Begin2Fly
конечно не можете. Внимательнее надо читать справку. У вас не заданы метки перехода. »

Не совсем понял для чего они нужны. Добавил метку ошибка исчезла, но бэкап не создает. Какую функцию надо использовать для создания бэкапа?
Код:

SetShellVarContext all
IfFileExists "$APPDATA\Color\EQ" 0
SetShellVarContext all
Rename $APPDATA\Color\EQ $APPDATA\Color\EQ_Backup


K.A.V. 03-05-2015 21:12 2503394

Цитата:

Цитата Dodakaedr
Не совсем понял для чего они нужны »

Вы вроде "по-нашему" пишете, в справке же всё разжевано, по-крайней мере на страничке описания команды IfFileExists, достаточно скопировать оттуда пример кода и посмотреть, как он работает
Если не понимаете принцип указания меток, читайте опять же справочник, конкретно страничку Статьи => Relative Jumps, +можете зацепить попутно Перевод справки NSIS => Goto

И зачем 2 раза указывается команда SetShellVarContext all? :o

Цитата:

Цитата Dodakaedr
Какую функцию надо использовать для создания бэкапа? »

Смотря какой функционал вы подразумеваете под словом "бэкап", судя по вашему коду бэкап для вас - просто переименование папки :good:

Dodakaedr 04-05-2015 20:47 2503772

Цитата:

Цитата K.A.V.
Смотря какой функционал вы подразумеваете под словом "бэкап", судя по вашему коду бэкап для вас - просто переименование папки »

Даже простое переименование папки не срабатывает... А как по другому можно создать бэкап?
Цитата:

Цитата K.A.V.
И зачем 2 раза указывается команда SetShellVarContext all? »

Думал так правильнее, в скрипте папки и в общем профиле и в профиле пользователя...

K.A.V. 04-05-2015 21:09 2503785

Цитата:

Цитата Dodakaedr
А как по другому можно создать бэкап? »

эм...ну, типа, можно тупо копировать файлы, можно архивировать папку в архив...

Цитата:

Цитата Dodakaedr
Думал так правильнее, в скрипте папки и в общем профиле и в профиле пользователя... »

:lamer: везде воткнём, на всякий случай
А протестировать скрипт из 5 строк - занятие для неудачников, ага? :)

При указании команды SetShellVarContext all, переменные с путями будут ссылаться на общие папки до тех пор, пока вы не пропишите в коде SetShellVarContext current

Dodakaedr 04-05-2015 21:17 2503791

Цитата:

Цитата K.A.V.
При указании команды SetShellVarContext all, переменные с путями будут ссылаться на общие папки до тех пор, пока вы не пропишите в коде SetShellVarContext current »

Это я понял еще с предыдущего вашего ответа. А как удалить папку только в том случае если она пустая?
Если правильно понял то RMDir $APPDATA\MyFolder без ключа /r?

K.A.V. 04-05-2015 22:27 2503813

Цитата:

Цитата Dodakaedr
Если правильно понял то RMDir $APPDATA\MyFolder без ключа /r? »

Да

Могу ещё такой код подкинуть, может, пригодится в работе (взят с офф. справки), по проверке содержимого директории, есть в ней файлы или нет:
Код:

!include "FileFunc.nsh"
outfile test.exe

Section
  ${DirState} "$EXEDIR\2" $0
;    $0=0  (пустая)
;    $0=1  (с файлами)
;    $0=-1 (папка не существует)
  MessageBox MB_OK|MB_ICONINFORMATION "$0"
SectionEnd


Dodakaedr 04-05-2015 23:21 2503828

Цитата:

Функция .onInit выполняется после инициализации инсталлятора. Это самая первая функция, которая выполняется при запуске вашего инсталлятора
А какая самая последняя функция при закрытии инсталлятора?

kotkovets 05-05-2015 11:10 2503953

Цитата:

Цитата Dodakaedr
А какая самая последняя функция при закрытии инсталлятора? »

Код:

Function .onInstSuccess
 MessageBox MB_OK "Установка успешно завершена!"
FunctionEnd

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

Function .onUserAbort
 MessageBox MB_OK "отмена успешно завершена!"
FunctionEnd

при классическом интерфейсе.

в модерне функция "зашита" в константу
Код:

!define MUI_CUSTOMFUNCTION_ABORT "Моя_функция"
подробности в справке

K.A.V. 05-05-2015 14:07 2504014

Если речь идёт о инсталляторе с графическим интерфейсом, то последняя функция, которая будет выполнена - функция с именем .onGUIEnd, она будет выполнена в любом случае и всегда самой последней, если, конечно, инсталлер закрывается штатно без краша и убития процесса, и если процесс установки не запущен с ключом /S (тихая установка)

Код:

Function .onGUIEnd
  MessageBox MB_OK|MB_ICONINFORMATION ".onGUIEnd"
FunctionEnd

Если речь идёт о инсталляторе с графическим интерфейсом, который запущен с ключом "/S" (тихая установка без графического интерфейса), то последней функцией, которая будет выполнена - будет функция .onInstSuccess
Можно поступить разными способами, тут только вопрос о том, какой функционал вам нужен и зачем вам последняя выполняемая функция
Можете прописать команды в .onInstSuccess - будет выполняться всегда при всех условиях, только посмотрите сами, как она будет отрабабывать
Можете добавить в эту функцию проверку на запуск с ключом "/S", чтобы, например, всегда выполнялась .onGUIEnd даже при тихой установки:
Код:

Function .onInstSuccess
# MessageBox MB_OK ".onInstSuccess"
  ${GetParameters} $R0
  ${GetOptions} "$R0" "/S"  $R0
    IfErrors +2 0
    call .onGUIEnd
FunctionEnd

Function .onGUIEnd
 MessageBox MB_OK|MB_ICONINFORMATION ".onGUIEnd"
FunctionEnd

Для использования в коде команд из примера, нужно прописать в начале кода !include "FileFunc.nsh"

В общем, тестируйте, смотрите, что вам больше подходит

Если речь идёт о silent архиве без графического интерфейса в коде изначально - то там вы уже сами можете определить, какую функцию выполнять последней перед командой quit (закрытие инсталлятора)

Dodakaedr 05-05-2015 16:00 2504050

Не могу решить проблему. При использовании
Код:

SetOutPath "$APPDATA\Color\Licenses\EQ"
File "License.license"

не хочет удалять папку $APPDATA\Color при завершении скрипта, если без файла то все отлично работает, но без файла никак. Думал через последнею функцию провести удаление, но тоже безрезультатно.
Цитата:

Цитата K.A.V.
Если речь идёт о silent архиве без графического интерфейса в коде изначально - то там вы уже сами можете определить, какую функцию выполнять последней перед командой quit (закрытие инсталлятора) »

Вот такой способ и используется (SilentInstall silent), удаление прописано как раз перед quit, но не удаляет. В чем может быть конфликт?

K.A.V. 05-05-2015 16:34 2504065

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

1. Вы предоставляете код из двух строк, который распаковывает какой-то файл "License.license"
2. Вы тут же пишите, что не можете удалить папку "$APPDATA\Color" с файлами, хотя пустая папка удаляется, ранее шел разговор про команду RMDir, которую вы якобы поняли, как использовать
3. Вы удаляете папку "$APPDATA\Color" командой RMDir без ключа /r, в которой есть файлы, хотя вроде бы знаете, что команда RMDir без ключа /r не удаляет папки с файлами

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

Цитата:

Цитата Dodakaedr
Вот такой способ и используется (SilentInstall silent), удаление прописано как раз перед quit, но не удаляет. В чем может быть конфликт? »

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

Dodakaedr 05-05-2015 16:56 2504087

Цитата:

Цитата K.A.V.
Да нет разницы, в каком месте кода будет прописано удаление файлов, главное, чтобы эти файлы не были заняты сторонними процессами »

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

;---Definitions----

!define SNAME "EQPortable"

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

;----Includes----

!include "ProcessFunc.nsh"
;!include "FileFunc.nsh"

;-----Runtime switches----
CRCCheck off
AutoCloseWindow false
SilentInstall silent
WindowIcon off

;-----Set basic information-----

Name "${SNAME}"
Caption "${SNAME}"
OutFile "..\${SNAME}.exe"

;-----Version Information------

LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"

VIProductVersion "1.0.6.0"
VIAddVersionKey ProductName "EQ Portable"
VIAddVersionKey FileDescription "EQPortable"

Section "Main"
${If} ${ProcessExists} "eq.exe"
MessageBox MB_ICONINFORMATION|MB_OK "Программа уже запущена!"
Quit
${Else}

SetShellVarContext current
IfFileExists "$APPDATA\Color\EQ" 0
Rename "$APPDATA\Color" "$APPDATA\Color_Backup"
IfFileExists "$EXEDIR\Data" 0
CopyFiles "$EXEDIR\Data\*.*" "$APPDATA\Color\EQ"

SetShellVarContext all
IfFileExists "$APPDATA\Color\Licenses\EQ" 0
Rename "$APPDATA\Color" "$APPDATA\Color_Backup"
SetOutPath "$APPDATA\Color\Licenses\EQ"
File "License.license"

ExecWait "$EXEDIR\EQ\EQ.exe"
Sleep 400

SetShellVarContext current
CopyFiles "$APPDATA\Color\EQ\*.*" "$EXEDIR\Data"
Sleep 800
RMDir /r "$APPDATA\Color"
IfFileExists "$APPDATA\Color_Backup" 0
Rename "$APPDATA\Color_Backup" "$APPDATA\Color"

SetShellVarContext all
RMDir /r "$APPDATA\Color"
IfFileExists "$APPDATA\Color_Backup" 0
Rename "$APPDATA\Color_Backup" "$APPDATA\Color"

quit
${EndIf}
SectionEnd

;Function .onInstSuccess
;SetShellVarContext all
;RMDir /r "$APPDATA\Color"
;IfFileExists "$APPDATA\Color_Backup" 0
;Rename "$APPDATA\Color_Backup" "$APPDATA\Color"
;FunctionEnd


Проблема в этом куске(не работает):
Скрытый текст

Код:

SetShellVarContext all
RMDir /r "$APPDATA\Color"
IfFileExists "$APPDATA\Color_Backup" 0
Rename "$APPDATA\Color_Backup" "$APPDATA\Color"


K.A.V. 05-05-2015 21:06 2504199

Цитата:

Цитата Dodakaedr
Проблема в этом куске(не работает): »

:)

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

Цитата:

Цитата Dodakaedr
Ну скорее всего инсталлятор и есть тот самый процесс »

Нет, если он не запущен из той папки, которую вы хотите удалить

Ваш кусок кода настолько простой, что "не работать" он может только из-за внешних проблем: отсутствия файлов или занятость их другими приложениями
Иногда, например, не удаляются директории (уже не помню при каких случаях)
Сделайте после каждой команды переименования/удаления паузу командой показа сообщения
Код:

  MessageBox MB_OK|MB_ICONINFORMATION "test"
и наблюдайте пошагово, как ваш скрипт отрабатывает, удаляя/перемещая файлы, и, думаю, найдёте ошибку, в чем она таится я сказать не могу по коду - вроде всё правильно, за исключением команды IfFileExists, но в таком виде, в каком вы её указали - она вообще погоды в скрипте не меняет, её как-будто там нет :)

Dodakaedr 05-05-2015 21:31 2504211

Цитата:

Цитата K.A.V.
и наблюдайте пошагово, как ваш скрипт отрабатывает, удаляя/перемещая файлы, и, думаю, найдёте ошибку, »

Я писал что если прицепить файл, то папка не удаляется, если без файла то все норм.
Цитата:

Цитата K.A.V.
Сделайте после каждой команды переименования/удаления паузу командой показа сообщения »

Типа такого?
Код:

SetShellVarContext all
RMDir /r "$APPDATA\Color"
MessageBox MB_OK "Папка удалена"
IfFileExists "$APPDATA\Color_Backup" 0 NotFiles
MessageBox MB_OK "Папка есть"
Goto Done
NotFiles:
 MessageBox MB_OK "Папки нет"
Done:
Rename "$APPDATA\Color_Backup" "$APPDATA\Color"
MessageBox MB_OK "Папка переименована"

Пишет что удалило но не удаляет.

Цитата:

Цитата K.A.V.
Ваш кусок кода настолько простой, что "не работать" он может только из-за внешних проблем: отсутствия файлов »

А если только две пустые папки?

Dodakaedr 05-05-2015 22:13 2504227

Как показывают тесты вся проблема в команде
Код:

SetOutPath "$APPDATA\Color\Licenses\EQ"
File "License.license"

Есть другие способы как вшить файл в инстал, и при запуске помещать в нужное место?

K.A.V. 05-05-2015 22:57 2504241

Цитата:

Цитата Dodakaedr
Типа такого? »

ога :)

Цитата:

Цитата Dodakaedr
Пишет что удалило но не удаляет. »

Так у вас команда на отображение сообщения с текстом "Папка удалена" стоит раньше, чем вы проверяете существования папки ;-)
Так сделайте и не покажет сообщение, если папка не удалится
Код:

RMDir /r "$APPDATA\Color"
IfFileExists "$APPDATA\Color" +2 0
MessageBox MB_OK "Папка удалена"

Цитата:

Цитата Dodakaedr
А если только две пустые папки? »

Если в папке есть ещё одна папка, пусть даже пустая, то RMDir без ключа /r не удалит папку, без ключа удаляются пустые папки, которые в себе не имеют ни одного объекта

Цитата:

Цитата Dodakaedr
Как показывают тесты вся проблема в команде »

хм, ну, не знаю, у вас после отработки скрипта остаётся одна папка EQ с этим файлом в этой папке и не удаляется даже командой RMDir с ключом /r?
Цитата:

Цитата Dodakaedr
Есть другие способы как вшить файл в инстал, и при запуске помещать в нужное место? »

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

Dodakaedr 06-05-2015 19:06 2504519

Цитата:

Цитата K.A.V.
Так сделайте и не покажет сообщение, если папка не удалится »

Так и есть.
Цитата:

Цитата K.A.V.
хм, ну, не знаю, у вас после отработки скрипта остаётся одна папка EQ с этим файлом в этой папке и не удаляется даже командой RMDir с ключом /r? »

Удаляется только файл лицензии, а папки нет.
Цитата:

Цитата K.A.V.
Если файл чем-то блочится - ищите виновника »

Думаю сам инстал и есть виновник, только как это исправить... .
Цитата:

Цитата K.A.V.
можете попробовать переименовать файл перед удалением »

Файл поддается под переименование и удаление во время работы инстала. Файл не причем.

Dodakaedr 06-05-2015 19:24 2504530

Цитата:

Цитата K.A.V.
Распаковать во временную папку и потом скопировать файл »

Проверил такой способ и сработало, спасибо!

Limonica 09-05-2015 09:57 2505394

Processfunc.nsh имеет недостаток. Если запускать инсталляционый пакет без административных прав, то он не находит процессы которые запущены с повышенными правами, SYSTEM например :(

K.A.V. 09-05-2015 19:00 2505530

Цитата:

Цитата Limonica
Processfunc.nsh имеет недостаток »

Думаю, это не проблема хидера Processfunc, если у пользователя нет прав администратора - то и многих привилегий у него нет, в том числе и читать системные процессы
А вы хотели получить полные права в ограниченной учетной записи?

Serg866 10-05-2015 16:54 2505828

Цитата:

Цитата LOKYOXY
New VCL Style for NSIS »

А для 3.0 такого оформления нет?


И ещё ребят кто знает как сделать цифровую подпись инсталятору на НСИС? А то Гугль Хром блокирует мою программу из за того что она ехешник! Типа может нанести вред компьютеру!

K.A.V. 10-05-2015 19:47 2505867

Цитата:

Цитата Serg866
И ещё ребят кто знает как сделать цифровую подпись »

Её сначала нужно приобрести за денюжку, если не ошибаюсь, а потом уже думать над вшиванием

Цитата:

Цитата Serg866
Хром блокирует мою программу из за того что она ехешник! »

Так запакуйте EXE в zip архив и распространяйте в архиве, в чем проблема?

Salmo 10-05-2015 20:19 2505871

Цитата:

Цитата Serg866
И ещё ребят кто знает как сделать цифровую подпись инсталятору на НСИС? »

Я, некоторые ЕХЕ_шники, которые не должны вызывать придирки со стороны антивирусов и которые система должна считать доверенными, подписываю с помощью программы X2Net Signcode (англ), предварительно сгенерировав сертификат в пакете Crypto4 PKI (англ). При установке программы ( это делает инсталлятор) закидываю свой сертификат в хранилище доверенных сертификатов системы и моя самоделка живет в системе, как родная, не вызывая подозрения (при условии, что это не вирус)...

Serg866 12-05-2015 11:36 2506338

Цитата:

Цитата K.A.V.
Её сначала нужно приобрести за денюжку, если не ошибаюсь, а потом уже думать над вшиванием »

да ежели оно всё само сделает как надо, я готов и купить.

Цитата:

Цитата K.A.V.
Так запакуйте EXE в zip архив и распространяйте в архиве, в чем проблема? »

Ну не знаю, несолидно это как-то в зип-архив продукт пихать.

Цитата:

Цитата Salmo
Я, некоторые ЕХЕ_шники, которые не должны вызывать придирки со стороны антивирусов и которые система должна считать доверенными, подписываю с помощью программы X2Net Signcode (англ), предварительно сгенерировав сертификат в пакете Crypto4 PKI (англ). При установке программы ( это делает инсталлятор) закидываю свой сертификат в хранилище доверенных сертификатов системы и моя самоделка живет в системе, как родная, не вызывая подозрения (при условии, что это не вирус)... »

Да мне ни к чему эти сложности. Мне всего лишь надо чтобы хром не блочил мою программу когда её качают! А блочит он только потому что файл ехешник и не имеет цифровой подписи. Антивирусы естественно ничего не блочат, потому что и вирусов нет никаких, я честный человек!

Salmo 12-05-2015 13:44 2506378

Цитата:

Цитата Serg866
я честный человек! »

Я в этом не сомневаюсь... Тогда единственным выходом остается ZIP_архив. Помещать исполняемые файлы в архив - это распространенная практика, потому что никто не ограничивается предложением одного ЕХЕ_шника без сопроводительного файла с описанием программы и условием его инсталляции\применения. Так что "пихать" файл в архив считается хорошим тоном. Получить же платный сертификат для подписывания программы от центра сертификации непростое и дорогое удовольствие...

Dodakaedr 14-05-2015 21:39 2507389

Подскажите, как проделать следующее: если у файла hosts стоит атрибут "только чтение", то снять его, записать некоторое значение и снова поставить атрибут "только чтение", а если атрибута нету то просто записать значение? И как удалять значение из файла hosts?

K.A.V. 14-05-2015 23:07 2507451

Цитата:

Цитата Dodakaedr
если у файла hosts стоит атрибут "только чтение", то снять его, записать некоторое значение и снова поставить атрибут "только чтение", а если атрибута нету то просто записать значение? »

Код:

Function test
${GetFileAttributes} "$DESKTOP\hosts" "READONLY" $R0 ; проверяем, есть ли атрибут только чтение у файла, если после исполнения команды $R0 = 1, значит есть
StrCmp $R0 "1" 0 +2 ; если атрибут есть, то ставим файлу обычный атрибут
SetFileAttributes "$DESKTOP\hosts" "NORMAL"
 
FileOpen $0 "$DESKTOP\hosts" a ; открываем файл для добавления данных
FileSeek $0 0 END ; перескакиваем на последнюю строку в файле
FileWrite $0 "$\r$\n127.0.0.1 winxpregp.narod.ru" ; добавляем новую строку
FileClose $0 ; закрываем файл, завершаем с ним работу
 
StrCmp $R0 "1" 0 +2  ; т.к. переменная $R0 до сих пор хранит инфу о том, был ли атрибут только чтение у файла, тут же проверяем, если был - ставим обратно атрибут только чтение
SetFileAttributes "$DESKTOP\hosts" "READONLY"
FunctionEnd

Цитата:

Цитата Dodakaedr
И как удалять значение из файла hosts? »

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

Function test2
${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обновляем счетчик, в этой переменной будет хранится порядковый номер строки, которая читается в данный момент
readnext:
 IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
 IntCmp $R1 $R0 0 0 end ; если текущее значение читаемой строки больше, чем общее количество строк в файле - завершаем обработку и прыгаем на метку end
 readlinenow: ; сюда будем прыгать после удаления строки, необходимо после удаления строки ещё раз прочитать эту же строку, т.к. данные в файле будут "сдвинуты" после удаления строки
 ${LineRead} "$DESKTOP\hosts" "$R1" $R3 ; читаем содержимое строки
 ${WordFind} "$R3" "winxpregp.narod.ru" "E+1{" $R2 ; ищем фразу в строке
  IfErrors readnext 0 ; если фраза не найдена - прыгаем на метку readnext и  читаем следующую строку, если фраза найдена - спускаемся дальше по коду
 ${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineSum} "$DESKTOP\hosts" $R0  ; после попытки удаления строки желательно обновить данные о количестве строк в файле, если удалений строк с фразой будет много - будут лишние команды чтения строк
 goto readlinenow ; после удаления строки нужно прочитать эту строку ещё раз, т.к. данные в файле сразу же сдвигаются, прыгаем на метку readlinenow
end:
FunctionEnd

Function DeleteLineCallback
        StrCpy $0 SkipWrite
        Push $0
FunctionEnd

ps
в начале кода пропишите
Код:

!include "FileFunc.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"


pindows_xp 15-05-2015 08:02 2507558

привет форучани нужна ваша помош хочу вот такой файлик зделат на свой сайт файл сам ехе формате когда кликаеш на файл она распакует файлы в програм файл и на рабочий стол кидает ярлык это сылка на сайт прошу помоч как можна зделат для себя вот сылка на ехе файл https://yadi.sk/d/vcmRINowgcSeH :sorry:

Dodakaedr 15-05-2015 20:18 2507834

K.A.V., Огромное спасибо! Добавить несколько строк я смог, но удалить их не получается, подкиньте пожалуйста примерчик.

K.A.V. 15-05-2015 22:09 2507863

Цитата:

Цитата Dodakaedr
но удалить их не получается, подкиньте пожалуйста примерчик. »

эм, какой ещё пример? В моём посте 2 примера, 1ый - добавление данных, 2ой - удаление строки по фразе в ней
Может, у вас монитор запачкался и вы не увидели второй код на пол поста в сообщении...

Dodakaedr 15-05-2015 22:12 2507864

Цитата:

Цитата K.A.V.
2ой - удаление строки »

А я спрашивал про несколько строк.
Цитата:

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

.....

K.A.V. 15-05-2015 22:58 2507874

Цитата:

Цитата Dodakaedr
А я спрашивал про несколько строк. »

Вам вызвать 2 раза функцию с разным текстом искомой строки религия не позволяет? Не понимаю, чего вы от меня ещё хотите :o

Dodakaedr 15-05-2015 23:14 2507876

Цитата:

Цитата K.A.V.
Вам вызвать 2 раза функцию с разным текстом искомой строки религия не позволяет? »

позволяет конечно, пробовал, но не получается.
Цитата:

Цитата K.A.V.
Не понимаю, чего вы от меня ещё хотите »

как я уже и раньше говорил - примерчик.
Собрал такое, но не работает
Код:

${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обновляем счетчик, в этой переменной будет хранится порядковый номер строки, которая читается в данный момент
readnext:
 IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
 IntCmp $R1 $R0 0 0 end ; если текущее значение читаемой строки больше, чем общее количество строк в файле - завершаем обработку и прыгаем на метку end
 readlinenow: ; сюда будем прыгать после удаления строки, необходимо после удаления строки ещё раз прочитать эту же строку, т.к. данные в файле будут "сдвинуты" после удаления строки
 ${LineRead} "$DESKTOP\hosts" "$R1" $R3 ; читаем содержимое строки
 ${LineRead} "$DESKTOP\hosts" "$R4" $R5 ; читаем содержимое строки
 ${WordFind} "$R3" "127.0.0.1 winxpregp.narod.ru" "E+1{" $R2 ; ищем фразу в строке
 ${WordFind} "$R5" "127.0.0.1 winxp.narod.ru" "E+1{" $R6 ; ищем фразу в строке
 IfErrors readnext 0 ; если фраза не найдена - прыгаем на метку readnext и читаем следующую строку, если фраза найдена - спускаемся дальше по коду
 ${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineFind} "$DESKTOP\hosts" "" "$R4" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineSum} "$DESKTOP\hosts" $R0 ; после попытки удаления строки желательно обновить данные о количестве строк в файле, если удалений строк с фразой будет много - будут лишние команды чтения строк
 goto readlinenow ; после удаления строки нужно прочитать эту строку ещё раз, т.к. данные в файле сразу же сдвигаются, прыгаем на метку readlinenow
end:


K.A.V. 16-05-2015 00:19 2507894

Цитата:

Цитата Dodakaedr
как я уже и раньше говорил - примерчик. »

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

Цитата:

Цитата Dodakaedr
Собрал такое, но не работает »

:lamer: А с чего бы "такому" работать?

Код:

${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обновляем счетчик, в этой переменной будет хранится порядковый номер строки, которая читается в данный момент
readnext:
 IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
 IntCmp $R1 $R0 0 0 end ; если текущее значение читаемой строки больше, чем общее количество строк в файле - завершаем обработку и прыгаем на метку end
 readlinenow: ; сюда будем прыгать после удаления строки, необходимо после удаления строки ещё раз прочитать эту же строку, т.к. данные в файле будут "сдвинуты" после удаления строки
 ${LineRead} "$DESKTOP\hosts" "$R1" $R3 ; читаем содержимое строки
${LineRead} "$DESKTOP\hosts" "$R4" $R5 ; читаем содержимое строки
 ${WordFind} "$R3" "127.0.0.1 winxpregp.narod.ru" "E+1{" $R2 ; ищем фразу в строке
${WordFind} "$R5" "127.0.0.1 winxp.narod.ru" "E+1{" $R6 ; ищем фразу в строке
 IfErrors readnext 0 ; если фраза не найдена - прыгаем на метку readnext и читаем следующую строку, если фраза найдена - спускаемся дальше по коду
 ${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
${LineFind} "$DESKTOP\hosts" "" "$R4" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineSum} "$DESKTOP\hosts" $R0 ; после попытки удаления строки желательно обновить данные о количестве строк в файле, если удалений строк с фразой будет много - будут лишние команды чтения строк
 goto readlinenow ; после удаления строки нужно прочитать эту строку ещё раз, т.к. данные в файле сразу же сдвигаются, прыгаем на метку readlinenow

Первая выделенная строка.
Ошибка чтения строки, почему? Потому что вы передаёте ранее не задействованную переменную $R4 с пустым значением, соответственно, никакая строка прочитана не будет

Вторая выделенная строка.
Т.к. выше была ошибка чтения строки, то и поиск фразы будет неудачным

Третья выделенная строка.
Т.к. было выше 2 ошибки, никакая строка удалена не будет

Вы просто наугад подставили переменные и думали, что код магическим образом заработает?

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

Код:

Function test
Var /global MyText
StrCpy $MyText "winxpregp.narod.ru"
 call DeleteLineFunc
 
StrCpy $MyText "microsoft.com"
 call DeleteLineFunc
 
StrCpy $MyText "oszone.net"
 call DeleteLineFunc 
FunctionEnd


Function DeleteLineFunc
${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обновляем счетчик, в этой переменной будет хранится порядковый номер строки, которая читается в данный момент
readnext:
 IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
 IntCmp $R1 $R0 0 0 end ; если текущее значение читаемой строки больше, чем общее количество строк в файле - завершаем обработку и прыгаем на метку end
 readlinenow: ; сюда будем прыгать после удаления строки, необходимо после удаления строки ещё раз прочитать эту же строку, т.к. данные в файле будут "сдвинуты" после удаления строки
 ${LineRead} "$DESKTOP\hosts" "$R1" $R3 ; читаем содержимое строки
 ${WordFind} "$R3" "$MyText" "E+1{" $R2 ; ищем фразу в строке
  IfErrors readnext 0 ; если фраза не найдена - прыгаем на метку readnext и  читаем следующую строку, если фраза найдена - спускаемся дальше по коду
 ${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineSum} "$DESKTOP\hosts" $R0  ; после попытки удаления строки желательно обновить данные о количестве строк в файле, если удалений строк с фразой будет много - будут лишние команды чтения строк
 goto readlinenow ; после удаления строки нужно прочитать эту строку ещё раз, т.к. данные в файле сразу же сдвигаются, прыгаем на метку readlinenow
end:
FunctionEnd

Function DeleteLineCallback
        StrCpy $0 SkipWrite
        Push $0
FunctionEnd



Читайте Справочник по NSIS, моя любимая фраза для новичков, которую я не люблю повторять

MKN 16-05-2015 10:01 2507943

Цитата:

Цитата Dodakaedr
И как удалять значение из файла hosts? »

Первым делом надо получить права на работу с реальным файлом hosts ( $SYSDIR\drivers\etc\hosts )
Без этого, как правило, манипуляции с файлом будут не возможны... (т.к. либо файл "занят" системой , а ещё хуже, когда файл hosts под контролем какого нибудь "защитника" или антивируса, что встречается всё чаще и чаще... )

Dodakaedr 16-05-2015 16:06 2508042

Цитата:

Цитата MKN
Первым делом надо получить права на работу с реальным файлом hosts »

И как это сделать?

Dodakaedr 16-05-2015 20:11 2508098

Решил в одну функцию запихнуть удаление строк в файле hosts с проверкой атрибута для удобства, при выходе из исталлятора атрибут снимается, но не ставится обратно после удаления строк. Вызываю вот такую функцию
Код:

function delete
${GetFileAttributes} "$DESKTOP\hosts" "READONLY" $R0
StrCmp $R0 "1" 0 +2
SetFileAttributes "$DESKTOP\hosts" "NORMAL"
StrCpy $MyText "127.0.0.1 support.soft.com"
 call DeleteLineFunc
StrCpy $MyText "127.0.0.1 soft.com"
 call DeleteLineFunc
StrCmp $R0 "1" 0 +2 ;если здесь поставить +1 то атрибут ставится постоянно не зависимо от результата проверки
SetFileAttributes "$DESKTOP\hosts" "READONLY"
functionend

Почему не ставится обратно атрибут?
И еще вопрос: при удалении строк в конце файла постоянно остается пустая строка и получается что после 10 запусков в итоге имеем 10 пустых строк. Как сделать чтобы не оставалась пустая строка?

K.A.V. 16-05-2015 21:03 2508119

Цитата:

Цитата Dodakaedr
Почему не ставится обратно атрибут? »

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

Цитата:

Цитата Dodakaedr
StrCmp $R0 "1" 0 +2 ;если здесь поставить +1 то атрибут ставится постоянно не зависимо от результата проверки »

Повторю в последний раз, читайте Справочник по NSIS, ленивых и не желающих вникать в NSIS "кодеров" не переношу

крик души

блин, вот скажите мне, для кого писался справочник?
Я создавал его в надежде на то, что им будут пользоваться менее опытные кодеры, которым я смогу передать полученные знания и хотел, чтобы другие люди чему-то научились из этого справочника, но почему-то всё же находятся такие личности, которые хотят "всё и сразу и без чтения инфы" - ребят, в этой теме так не бывает, хотите, чтобы вам помогали решить вашу проблему - будьте добры, прочитайте справочник (да хотя бы самый минимум, те команды, которые используете - пишите правильно, а не наугад подставляйте параметры)
Ключевое слово - помогаем, а не делаем всё за вас
такое ощущение складывается, как-будто мне это нужно и я сижу уговариваю человека "ну прочитай, пожалуйста" :glare:


Цитата:

Цитата Dodakaedr
И еще вопрос: при удалении строк в конце файла постоянно остается пустая строка и получается что после 10 запусков в итоге имеем 10 пустых строк. Как сделать чтобы не оставалась пустая строка? »

Вопрос или задание для нас?
Давайте вы:
1. Воспользуетесь поиском по этой и предыдущей теме NSIS по ключевым словам LineFind, LineRead
2. Прочитаете в справке описание команд LineRead, StrCmp
3. Попробуете совместить команды LineRead, StrCmp с моим кодом удаления строки, в котором каждая строка с комментарием
4. Покажите, что у вас получилось

Давайте запустим здесь для всех ленивых новичков режим "Обучение", будем только указывать на ошибки, давать рекомендации и не будем давать готовых кодов?
Посмотрим, через какое время им всё же придётся обратиться к справочнику :)
Мне кажется, этот способ будет очень эффективный, не хотите изучать NSIS - либо мы заставим, либо вы забьёте на NSIS

Dodakaedr 16-05-2015 23:13 2508152

Цитата:

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

наверное из-за переменной $R0, она берется уже с call DeleteLineFunc? Применил свою переменную, все заработало.
Цитата:

Цитата K.A.V.
блин, вот скажите мне, для кого писался справочник? »

для реальных новичков! а не для
Цитата:

Цитата K.A.V.
менее опытные кодеры »

у меня опыта с nsis ноль целых х*р десятых. Да и в программировании где-то также.
Цитата:

Цитата K.A.V.
будьте добры, прочитайте справочник (да хотя бы самый минимум, те команды, которые используете - пишите правильно, а не наугад подставляйте параметры) »

читаю я ваш справочник, если бы все понимал то и не спрашивал помощи, а так команды строковые для меня вообще темный лес. По поводу "наугад" это вы подумали про переход +1 в комментарии в строке
Код:

StrCmp $R0 "1" 0 +2 ;если здесь поставить +1 то атрибут ставится постоянно не зависимо от результата проверки
так это я для сравнения написал, хотя наверное это и ни к чему было. Про метки и переходы все ясно. Не могу понять принцип работы строковых команд а именно как и что сравнивать надо. Нашел пример
Скрытый текст
Код:

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

который похож с моей проблемой, но совместить с вашим кодом не могу.
Цитата:

Цитата K.A.V.
Мне кажется, этот способ будет очень эффективный, не хотите изучать NSIS - либо мы заставим, либо вы забьёте на NSIS »

главное чтобы у вас терпения хватило:)

K.A.V. 17-05-2015 02:09 2508193

Цитата:

Цитата Dodakaedr
наверное из-за переменной $R0, она берется уже с call DeleteLineFunc? Применил свою переменную, все заработало. »

Ну вот видите, достаточно всего-лишь внимательно смотреть на код и на используемые переменные. Значение переменной может быть изменено в любой части кода, что может повлиять на функционал других функций, использующих одну переменную.
Ещё советую при использовании команд внимательно читать описание к команде, некоторые команды в NSIS переназначают значения переменных своими данными, из-за чего ваш код так же может оказаться некорректным, если вы используете те же переменные, что и команда NSIS, простой пример - команда Locate для поиска файлов, её callback функция использует переменные для хранения своих данных во время процесса поиска:
Код:

Function "Function"
    ; $R9    "путь\имя"
    ; $R8    "путь"
    ; $R7    "имя"
    ; $R6    "размер"  ($R6="" если директория, $R6="0" если поиск с ключем /S=)

    ; $R0-$R5  не используется функцией.
    ; ...

    Push $var    ; Если $var="StopLocate" Завершение функции
FunctionEnd

Цитата:

Цитата Dodakaedr
у меня опыта с nsis ноль целых х*р десятых. Да и в программировании где-то также. »

Скрытый текст
Для изучения конкретно NSIS вам нужно только одно - желание. Я тут уже 100 раз рассказывал, как лично я познакомился с NSIS будучи ещё совсем "зелёным" (во всех смыслах), я не то чтобы даже английский язык не знал, я в то время даже не знал, что такое интернет и редактор реестра. У меня кроме дистрибутива с непонятной программой (NSIS), которая просто была на CD в куче софта, больше ничего не было, ни знаний компьютерных, ни интернета, ни уж тем более справочника на русском
Я даже сейчас не знаю ни одного языка программирования и английского языка тоже не знаю, но просто есть желание и упорство - всё получается, это я к тому, что всё зависит только от вас, к тому же, у вас есть то, чего не было лично у меня - помощь со стороны более опытных кодеров и русская справка, пусть и не с огромным количеством всяких примеров и переведённых команд - но всё же для получения базовых знаний о NSIS справочник вполне сойдёт.

Цитата:

Цитата Dodakaedr
читаю я ваш справочник, если бы все понимал то и не спрашивал помощи, а так команды строковые для меня вообще темный лес »

Если после прочтения описания команды в справочнике и проведения тестов вы всё-равно не понимаете, как пользоваться командой - приходите и спрашивайте, что конкретно не понятно, в чем проблема то.
-------
Цитата:

Цитата Dodakaedr
Не могу понять принцип работы строковых команд а именно как и что сравнивать надо »

Так вы логику действий у себя в голове выстроите и продумывайте команды, разберём простой пример: вам нужно удалить пустую строку
Вот дальше вам необходимо понять всю силу фразы "Читайте справочник", если вы будете знать о всех командах, которые вам доступны в NSIS - вы будете писать код в несколько раз быстрее, зная команды - у вас в голове сразу будет строится код.
Что для этого нужно? Так, ну, раз у меня простой текстовый файл, значит для начала мне нужно прочитать строку, а как я могу прочитать строку? Точно, есть же команда LineRead!
Код:

${LineRead} "[Файл]" "[Номер строки]" $var
Так, ну, допустим, я прочитаю первую строку, а если моя строка записана второй, как мне сделать универсальный код, не дублируя строки? Точно, есть же математическая команда IntOp, я сделаю счетчик и он будет плюсоваться после чтения строки, если это не моя строка - будем увеличивать счетчик и идти дальше по файлу!

В голове строится код
Код:

StrCpy $1 0 ; нам сначала нужно обнулить счетчик, т.к. переменная возможно уже ранее использовалась
IntOp $1 $1 + 1 ; в переменную будет помещено текущее значение переменной $1 с прибавлением на 1
${LineRead} "[Файл]" "$1" $0

Так, круто, что дальше то, я прочитал первую строку, а как понять, что она пустая то? Точно, есть же команда StrCmp!
Т.к. содержимое прочитанной строки помещается в переменную $0 (смотри описание команды LineRead), то, соответственно, нам нужно сделать условие сравнения этой переменной с пустым значением в команде StrCmp, с пустым потому, что нам нужно определить, что прочитанная строка действительно пустая, а не с данными
Код:

StrCpy $1 0 ; нам сначала нужно обнулить счетчик, т.к. переменная возможно уже ранее использовалась
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 ЕСЛИ_НЕТ ; метка 0 означает, что если условие истина, т.е. значение переменной $0 - пусто, то опускаемся дальше по коду

так, а что мне делать дальше то? Если строка пустая, то...она мне не нужна, значит прописываю команду удаления ниже по коду, а как? Точно, мне же K.A.V. пример кидал с комментарием на каждой строке!
Код:

${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
так, в комменте сказано, что в команду нужно передавать номер строки, а у меня он где?! Точняк, это же счетчик в переменной $1, значит меняю переменную из примера на свою
Код:

StrCpy $1 0
IntOp $1 $1 + 1
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 ЕСЛИ_НЕТ
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"

так, что дальше то делать после удаления строки? а, ну, нам нужно прочитать следующую строку, т.е. нам нужно как-то вернуться на начало код...хм, о, есть же команда goto, её нужно поместить так, чтобы после удаления строки наш счетчик увеличился
Код:

StrCpy $1 0
NextLineRead:
IntOp $1 $1 + 1
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 ЕСЛИ_НЕТ
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"
  goto NextLineRead

Вроде что-то получается, так, K.A.V. же вроде говорил, что при удалении строки - другие строки смещаются, значит если у меня будет 2 пустые строки подряд, то я сначала удалю первую, у меня увеличится счетчик и я пропущу вторую строку, которая сместилась выше относительно других строк...как же быть, о, значит после удаления строки нам нужно прочитать эту строку ещё раз! Давай добавим меточку и изменим условие после удаления строки
Так, стоп, а как же условие того, что наша строка не пустая, что делать то...а, ну всё правильно, нам нужно перейти к следующей строке, значит в условие StrCmp делаем ссылку на метку NextLineRead
Код:

StrCpy $1 0
NextLineRead:
IntOp $1 $1 + 1
NowRead:
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 NextLineRead
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"
  goto NowRead

Во, вроде всё правильно! хотя...блин, а как я пойму, что строки в файле то закончились? У меня же получился бесконечный цикл чтения файла :(
Точно, есть же команда LineSum, которая подсчитывает общее количество строк в файле! Давай-ка её в начало пропишем и назначим переменную для хранения $R0.
Код:

${LineSum} "[Файл]" $R0
StrCpy $1 0
NextLineRead:
IntOp $1 $1 + 1
NowRead:
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 NextLineRead
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"
  goto NowRead

Тааак, теперь я знаю количество строк в файле! Теперь нужно вставить условие после счетчика и сравнивать, достигнута ли последняя строка, но подожди, комадна StrCmp же не подойдёт, потому что если я увеличу счетчик и сразу же сравню это значение с общим количеством строк - я могу не прочитать последнюю строку, значит нужна другая команда...точно, IntCmp!
Я укажу так, что если текущий счетчик строки больше общего количества строк, то закончим обработку, а если меньше либо равно - то продолжу чтение
Код:

${LineSum} "[Файл]" $R0
StrCpy $1 0
NextLineRead:
IntOp $1 $1 + 1
IntCmp $1 $R0 0 0 end
NowRead:
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 NextLineRead
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"
  goto NowRead
end:

Так, ну, вроде бы всё...а нет, K.A.V. же ещё делал замечание по поводу того, что если мы удаляем строку - то общее количество строк становится меньше, и чтобы не делать лишних попыток чтения после удаления нескольких строк, нам нужно после каждой команды удаления строки заново получать общее количество строк в файле, продублирую команду
Код:

${LineSum} "[Файл]" $R0
StrCpy $1 0
NextLineRead:
IntOp $1 $1 + 1
IntCmp $1 $R0 0 0 end
NowRead:
${LineRead} "[Файл]" "$1" $0
${TrimNewLines} '$0' $0
  StrCmp $0 "" 0 NextLineRead
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"
  ${LineSum} "[Файл]" $R0
  goto NowRead
end:

Кстати, при использовании LineRead в переменной будет значение с символом перехода на новую строку, поэтому команда сравнения может не сработать, для удаления символа перехода на новую строку мы используем команду ${TrimNewLines} после чтения строки
Вроде бы всё, осталось добавить callback функцию DeleteLineCallback для удаления строки
Код:

Function DeleteLineCallback
        StrCpy $0 SkipWrite
        Push $0
FunctionEnd

Круто, работает! Вроде и ничего сложного, если знаешь, какие команды есть в NSIS...

На самом деле, если посмотреть на этот код - здесь реально ничего мегакрутого нет - обычный код с использованием стандартных команд, вся фишка в том, что я знаю много команд в NSIS и знаю, что конкретно могу получить от той или иной команды. На основе этих знаний у меня код в голове строится автоматически, остаётся только его напечатать и проверить работоспособность
В примере этого сообщения я вам продемонстрировал, как на самом деле всё просто, достаточно всего-лишь знания команд NSIS и немного времени, чтобы продумать логику действий в коде.

Цитата:

Цитата Dodakaedr
главное чтобы у вас терпения хватило »

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

Limonica 25-05-2015 00:31 2511007

Цитата:

Цитата MKN
Определение у пользователя прав администратора :

Цитата:

OutFile "Admin_privileges.exe"
Section
System::Call "kernel32::GetModuleHandle(t 'shell32.dll') i .s"
System::Call "kernel32::GetProcAddress(i s, i 680) i .r0"
System::Call "::$0() i .r0"
IntCmp $0 1 +3
MessageBox MB_OK "Требуются права администратора для запуска этой установки"
Abort
SectionEnd
»

MKN можешь доработать способ чтобы определял какими привилегиями обладает аккаунт (как UserInfo) пользователя?

K.A.V. 25-05-2015 07:57 2511032

Кстати, есть более простой способ определения админских прав, всего одна строчка кода :tongue:
Код:

      System::Call setupapi::IsUserAdmin()i.r0
      StrCmp $0 "1" 0 +2
      MessageBox MB_OK|MB_ICONINFORMATION "Есть права администратора"   
      StrCmp $0 "0" 0 +2
      MessageBox MB_OK|MB_ICONINFORMATION "Нет прав администратора"


MKN 26-05-2015 11:33 2511473

Цитата:

Цитата Limonica
какими привилегиями обладает аккаунт (как UserInfo) пользователя? »

Посмотри здесь http://nsis.sourceforge.net/Enumerate_User_Privileges
или используй команду SHOW GRANTS (Просмотр привилегий http://www.dbaguru.ru/users-privileges.html )

Kopejkin 27-05-2015 18:36 2512063

Сколько процессов можно убить за один сеанс?

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

Код:

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




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

Flix 30-05-2015 10:26 2513017

Цитата:

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

Необходимые данные можно узнать в разделе реестра [HKEY_CURRENT_USER\Control Panel\International]. Считываешь значения желаемых параметров и, в зависимости от полученных результатов, выполняешь необходимые действия.

K.A.V. 30-05-2015 11:01 2513025

Цитата:

Цитата Kopejkin
Сколько процессов можно убить за один сеанс? »

Смотря как напишите код, в таком виде как у вас - не больше 7 одноименных процессов, если же сделать циклом, то будут завершены все процессы с указанным образом
Код:

!include "Logiclib.nsh"
Код:

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

Либо использовать
Код:

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

Kopejkin 30-05-2015 15:41 2513114

Цитата:

Цитата K.A.V.
эта команда... »

Сорри, а как её использовать в сценарии?

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

K.A.V. 30-05-2015 15:48 2513115

Цитата:

Цитата Kopejkin
Сорри, а как её использовать в сценарии? »

Код:

exec 'taskkill /f /im "notepad.exe"'
taskkill - из состава операционной системы, живёт в System32 папке...

ya_dukenukem 02-06-2015 14:38 2514136

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

K.A.V. 02-06-2015 14:53 2514144

Цитата:

Цитата ya_dukenukem
можно ли изменить размер главного окна инсталлятора? »

в папке <NSIS>\Contrib\UIs лежат EXE файлы с ресурсами диалогов, ковыряйте редактором ресурсов (ResHacker, Restorator) и изменяйте что хотите

Цитата:

Цитата ya_dukenukem
Подскажите чайнику »

Раз такое дело, то сразу предложу прочитать Справочник по NSIS

Kopejkin 02-06-2015 21:15 2514314

Подскажите, если так выглядит запись для обычного ярлыка,

Код:

CreateShortCut "$SMPROGRAMS\Software\Maker\Сайт Maker.lnk" "http://www.maker.com" "" "$INSTDIR\maker.exe" "" "" "" "Посетить веб-сайт програмы Maker"
то как записать Ярлык Интернета (.url)
(и чтобы с пиктограммкой дефолтного браузера)?

K.A.V. 02-06-2015 22:37 2514335

Цитата:

Цитата Kopejkin
то как записать Ярлык Интернета (.url) »

Ну url файл это вообще "не ярлык" сам по себе (если можно так выразиться), это файл формата INI, соответственно и создавать нужно либо командами WriteINIStr в файл с расширением url, либо просто распаковывать заранее подготовленный файл
Содержание файла такое:
Код:

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

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

Цитата:

Цитата Kopejkin
и чтобы с пиктограммкой дефолтного браузера »

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

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

проверку на отсутствие записи и запись другого значка, сами уже сделаете, как нужно
На примере Firefox - там иконка html-файла (значение параметра путь к firefox.exe и с индексом 1, firefox.exe,1)
Забегая вперёд и включая вангу, предположу возникновение вопроса о том, как отсечь с конца строки символ запятой вместе с индексом иконки :)
Код:

!include "Logiclib.nsh"
!include "StrFunc.nsh"
${StrLoc}

Код:

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


Kopejkin 03-06-2015 09:26 2514403

Цитата:

Цитата K.A.V.
...Не особо вникал »

Оказывается, не так все и просто. А я думал, что это я вникал... :lamer:
Спасибо еще раз.

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

SetOutPath "$PROGRAMFILES"
        RMDir /r "$PROGRAMFILES\Aleo Software"

А если я не знаю, куда пользователь захочет установить программу? Нужно будет извлекать пользовательский путь, отсекать каталог установки, оставляя путь к "родительской" папке и назначать как SetOutPath. Или я опять чего-то не учитываю (несу чушь)?

K.A.V. 03-06-2015 10:00 2514418

Цитата:

Цитата Kopejkin
Для того, чтобы удалить папку [Aleo Software], приходится устанавливать (как написано в Руководстве) текущий рабочий каталог, являющийся родителем папки [Aleo Software] »

Не сказано там такого :) Там говорится, что вы не сможете удалить папку, которая установлена сейчас "текущим каталогом"
Так, например, удаление не сработает:
Код:

SetOutPath $TEMP\dir
RMDir $TEMP\dir

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

Цитата:

Цитата Kopejkin
Нужно будет извлекать пользовательский путь, отсекать каталог установки, оставляя путь к "родительской" папке и »

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

Kopejkin 03-06-2015 21:05 2514698

Цитата:

Цитата K.A.V.
..выполняйте действия только с $INSTDIR »

Собственно, так и делал до сих пор. Только "не аккуратненько как-то получается" :)

K.A.V. 03-06-2015 21:40 2514704

Цитата:

Цитата Kopejkin
Только "не аккуратненько как-то получается" »

Это да, но никто пользователя и не заставляет вводить кучу путей для установки с заведомо пустыми папками, чтобы сама программа была в каких-то дебрях :)

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

!include "FileFunc.nsh"
!include "Logiclib.nsh"

Код:

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

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

Kopejkin 03-06-2015 22:27 2514715

Цитата:

Цитата K.A.V.
если я установлю ... на рабочем столе, ... деинсталлятором ... весь рабочий стол затрёте? »

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

Код:

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

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

WesternLight 17-06-2015 21:42 2519633

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

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

Код:

"C:\Program Files (x86)\Opera\launcher.exe" "http://google.com"
При этом часть:

Код:

C:\Program Files (x86)\Opera\launcher.exe
будет в виде переменной и может принимать разные значения (разные браузеры). Может есть какое-то решение?

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

K.A.V. 18-06-2015 05:01 2519691

Цитата:

Цитата WesternLight
столкнулся с, на мой взгляд, неразрешимой проблемой »

Персонально для тех, кому лень прочитать шапку темы: Справочник по NSIS
Приходите с прочитанным справочником, кидать вам код таких простых команд - не вижу смысла

WesternLight 18-06-2015 17:32 2519927

Цитата:

Цитата K.A.V.
Приходите с прочитанным справочником, кидать вам код таких простых команд - не вижу смысла »

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

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

Скрытый текст
Код:

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

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

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

!define MUI_WELCOMEPAGE_TITLE_3LINES

!define MUI_ABORTWARNING

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

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

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

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

Function fnCustomInit
        nsDialogs::Create 1018
        Pop $Dialog

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

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

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

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

        rb5:
        ;Если файл есть, то создаем RadioButton 5, иначе создаем надпись, что браузер не установлен
        IfFileExists "$PROGRAMFILES\Internet Explorer\iexplore.exe" 0 notcreate5
        ${NSD_CreateRadioButton} 0 140 100% 15u "В Internet Explorer"
        Pop $RadioButton5
        Goto rb6
        notcreate5:
        ${NSD_CreateLabel} 0 145 100% 15u " X  Браузер Internet Explorer не установлен"
        Pop $Label5
       
        rb6:
        ${NSD_CreateLabel} 0 170 100% 35u "* Браузер, выбранный по умолчанию в системе. Пользователь в любой момент может его изменить и после этого страница может перестать открываться корректно. Если это произойдет, просто запустите программу установки еще раз и выберите нужный браузер."
        Pop $Label6
       
        nsDialogs::Show
FunctionEnd

Function fnCustomDestroy

        ;Состояние RadioButton 1
        ${NSD_GetState} $RadioButton1 $RadioButton1
       
        ;Если файл есть, то получаем состояние RadioButton 2, иначе идем далее
        IfFileExists "$PROGRAMFILES\Google\Chrome\Application\chrome.exe" 0 +2
        ${NSD_GetState} $RadioButton2 $RadioButton2
       
        ;Если файл есть, то получаем состояние RadioButton 3, иначе идем далее
        IfFileExists "$PROGRAMFILES\Mozilla Firefox\firefox.exe" 0 +2
        ${NSD_GetState} $RadioButton3 $RadioButton3
       
        ;Если файл есть, то получаем состояние RadioButton 4, иначе идем далее
        IfFileExists "$PROGRAMFILES\Opera\launcher.exe" 0 +2
        ${NSD_GetState} $RadioButton4 $RadioButton4
       
        ;Если файл есть, то получаем состояние RadioButton 5, иначе идем далее
        IfFileExists "$PROGRAMFILES\Internet Explorer\iexplore.exe" 0 +2
        ${NSD_GetState} $RadioButton5 $RadioButton5
       
        IntCmp $RadioButton1 1 equal1 notequal1
                equal1:
                        StrCpy $Browser ""
  Goto End1
                notequal1:
               
        IntCmp $RadioButton2 1 equal2 notequal2
                equal2:
                        StrCpy $Browser "$PROGRAMFILES\Google\Chrome\Application\chrome.exe"
  Goto End1
                notequal2:
       
        End1:
       
        FunctionEnd

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

        ;Set Section properties
        SetOverwrite on

        ;Set Section Files and Shortcuts
        SetOutPath "$INSTDIR\"
        File "Links\fs.ico"
       
        ;Создание файлов
       
        SetShellVarContext all
        CreateShortCut "$DESKTOP\Полезные ссылки.lnk" "$Browser http://google.com" "" "$INSTDIR\fs.ico" "0"
        CreateDirectory "$SMPROGRAMS\Полезные ссылки"
        CreateShortCut "$SMPROGRAMS\Полезные ссылки\Полезные ссылки.lnk" "$Browser http://google.com" "" "$INSTDIR\fs.ico" 0
        CreateShortCut "$SMPROGRAMS\Полезные ссылки\Uninstall.lnk" "$INSTDIR\uninstall.exe"
       
SectionEnd

Section -FinishSection

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

SectionEnd

;Uninstall section
Section Uninstall

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

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

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

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

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

SectionEnd

;On initialization
Function .onInit

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

; eof


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

Код:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "http://google.com"
Мало того, что все команды попадают только в одни кавычки "" (я пробовал ставить дополнительные кавычки, экранируя их - не помогло), которые объединяют путь к исполняемому файлу с URL, так еще из URL удаляются двоеточие и слэши. Как следствие, такой ярлык не выполняет своего назначения - открыть указанную страницу в выбранном браузере, т.е. попросту не работает. Вот и прошу помощи...

K.A.V. 18-06-2015 18:00 2519949

Цитата:

Цитата WesternLight
Почему-то думал что именно вы сразу поймете в чем кроется суть проблемы »

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

Цитата:

Цитата WesternLight
я читал ваш справочник? Отвечать не нужно »

Может, и читали, утверждать наверняка не буду, но то, что читали невнимательно - это факт

Цитата:

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

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

Ещё раз откройте описание команды CreateShortCut и прочтите её описание
Цитата:

Цитата Справочник по NSIS
Расположение_ярлыка.lnk Путь_до_файла.exe [параметры_запуска

1-ый параметр
Путь до папки ярлыка+его имя+расширение lnk

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

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

В вашем случае, адрес сайта - это параметр запуска
Код:

CreateShortCut "$DESKTOP\Полезные ссылки.lnk" "$Browser" "http://google.com" "$INSTDIR\fs.ico" "0"
Цитата:

Цитата WesternLight
Мало того, что все команды попадают только в одни кавычки "" (я пробовал ставить дополнительные кавычки, экранируя их - не помогло), которые объединяют путь к исполняемому файлу с URL »

Ответ дал выше - путь к файлу, к которому создаётся ярлык и адрес сайта - 2 разных параметра в команде создания ярлыка, 2ой параметр для пути к файлу и 3ий параметр как "параметры запуска приложения"

WesternLight 18-06-2015 19:10 2519972

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

Limonica 19-06-2015 23:45 2520368

Цитата:

Цитата K.A.V.
Кстати, есть более простой способ определения админских прав, всего одна строчка кода
Код: Выделить весь код
System::Call setupapi::IsUserAdmin()i.r0
StrCmp $0 "1" 0 +2
MessageBox MB_OK|MB_ICONINFORMATION "Есть права администратора"
StrCmp $0 "0" 0 +2
MessageBox MB_OK|MB_ICONINFORMATION "Нет прав администратора" »

По поводу определения уровня UAC, каким образом можно реализовать?

diakov 20-06-2015 08:43 2520404

Есть интересный плаг AccessControl, нужно записать разрешения на файлик для разных групп пользователей (в том числе и запрет, например, на запись), есть у кого идеи как реализовать?

K.A.V. 20-06-2015 10:03 2520414

Цитата:

Цитата Limonica
По поводу определения уровня UAC, каким образом можно реализовать? »

Не в курсе, гуглить лень, может параметры EnableLUA + ConsentPromptBehaviorAdmin ?
Код:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
Цитата:

Цитата diakov
Есть интересный плаг AccessControl, нужно записать разрешения на файлик для разных групп пользователей (в том числе и запрет, например, на запись), есть у кого идеи как реализовать? »

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

diakov 21-06-2015 07:19 2520620

Цитата:

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

Вашей гениальности нет предела :) Я бы почитал если была бы справка хотя бы на английском. Как записать разрешения для текущего пользователя я разобрался, но как их запретить, и как это сделать для самой системы?

K.A.V. 21-06-2015 09:57 2520643

Цитата:

Цитата diakov
Вашей гениальности нет предела »

Поверьте, всё гениальное - просто, в данном случае вы не можете достичь цели либо из-за лени, либо из-за того самого "хочу, чтобы сделали всё за меня".

Цитата:

Цитата diakov
Я бы почитал если была бы справка хотя бы на английском »

А там на китайском?

Цитата:

Цитата diakov
но как их запретить »

Читайте документацию к плагину, или мне за вас открыть архив с плагином и сюда скопировать содержимое файла с описанием плагина?

Цитата:

Цитата diakov
и как это сделать для самой системы? »

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

Странный всё-таки народ пошел, им всё разжевали, но им и этого мало...

BuZzOFF 21-06-2015 13:31 2520719

Подскажите, пожалуйста, можно ли как-то при помощи API поменять размер этой тёмной области?


Любой элемент на странице получается «захватить», кроме этого.

K.A.V. 21-06-2015 13:48 2520724

Цитата:

Цитата BuZzOFF
поменять размер этой тёмной области»

Зачем? Это элемент с ID 1018, который используется при создании других элементов на страничках инсталлятора (чтобы располагать элементы в его пределах)

Цитата:

Цитата BuZzOFF
Любой элемент на странице получается «захватить», кроме этого. »

Этот элемент всегда скрытый (почему - выше написал), так что видеть вы это в принципе не должны, видимо, что-то нахимичили в коде/с интерфейсом

Вообще получить HWND элементов интерфейса не сложно, конкретно для этого элемента:
Код:

GetDlgItem $0 $HWNDPARENT 1018
Не знаю, почему у вас эта область видимая, попробуйте прописать команду скрытия элемента на этапе GuiInit (инициализации интерфейса) или в процессе работы инсталлятора:
Код:

GetDlgItem $0 $HWNDPARENT 1018
ShowWindow $0 0


BuZzOFF 21-06-2015 14:15 2520740

Цитата:

Цитата K.A.V.
Это элемент с ID 1018 »

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

  !define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW InstallPage

  Page custom CustomPage1 DestroyPage1
  !insertmacro MUI_PAGE_INSTFILES

Function CustomPage1
  nsDialogs::Create 1018
  Pop $Dialog1
  nsDialogs::Show
FunctionEnd

Function DestroyPage1
FunctionEnd

Function InstallPage
  ;Меняется размер ID 1018 на странице установки. Но не меняется...
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $HWNDPARENT 1018
  System::Call 'user32::MoveWindow(i$0,i0,i99,i664,i356,i1)'
FunctionEnd

Function myGuiInit
  ;Меняется размер самого окна
  System::Call "User32::SetWindowPos(i$HWNDPARENT,i0,i$R0,i$R1,i670,i540,0x0004)"

  ;Меняется размер ID 1018 на кастомной странице
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $HWNDPARENT 1018
  System::Call 'user32::MoveWindow(i$0,i0,i99,i664,i356,i1)'
FunctionEnd


Нужно изменить размер, а то все остальные элементы обрезаются...

K.A.V. 21-06-2015 15:01 2520753

Цитата:

Цитата BuZzOFF
Что-то не правильно? »

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

Что-то типа такого попробуйте:
Код:

Page custom TEST
!insertmacro MUI_PAGE_INSTFILES

Код:

Function TEST
  ;Меняется размер ID 1018 на кастомной странице
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $HWNDPARENT 1018
  System::Call 'user32::MoveWindow(i$0,i0,i99,i664,i356,i1)'
FunctionEnd

А вообще, что вы затеяли? Меняете размеры элементов и сам интерфейс в процессе запуска? Зачем? Глюков же получите...Может, будет лучше заранее изменить ресурсы диалогов и расположить элементы так, как надо?
Берёте файл с ресурсами диалогов из папки <NSIS>\Contrib\UIs (например modern.exe)
Открываете его с помощью программы для редактирования ресурсов (ResHacker/Restorator), делаете необходимые изменения
Помещаете отредактированный файл в папку с вашим NSIS скриптом и в скрипте прописываете:
Код:

!define MUI_UI "modern.exe"

BuZzOFF 23-06-2015 21:30 2521675

Цитата:

Цитата K.A.V.
Это элемент с ID 1018 »

Во как оказалось.
Цитата:

It's the dialog itself, you don't have to use GetDlgItem.
На сл. день разобрался как сделать то, что задумал :)

Цитата:

Цитата K.A.V.
А вообще, что вы затеяли? »

А сам не знаю. Балуюсь. Интересно просто.

Спасибо за помощь!

динозавра 12-07-2015 09:56 2527917

Всем привет. Попытался создать простое примитивное окошко. но нигде не нашел информации как в скрипт вставить жирный, наклонный текст, размер шрифта и цвет, ну что бы в моем окошке слово "Привет!" было жирным, наклонным с больше или меньше шрифтом и с другим цветом. Или такое зделать невозможно? Вот мое окошко:
Код:

!define PRODUCT_NAME "hello v${VER}"
!define NAME "hello"

Name "${NAME}"
Caption "${NAME}"
OutFile "hello.exe"
Icon "1\2.ico"
SilentInstall silent

Section main
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "Привет!" IDYES +1
Abort
SectionEnd


BuZzOFF 12-07-2015 21:32 2528136

динозавра, конкретно в этом окне надо? Насколько мне известно это невозможно...
Цитата:

You can't. It's a system parameter.
На страницах инсталлятора можно менять шрифт. Если интересует могу пример написать...

динозавра 13-07-2015 08:49 2528195

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

BuZzOFF 13-07-2015 10:14 2528217

Цитата:

Цитата динозавра
Если поделишься примером »

Пример как поменять шрифт на стандартной странице инсталлятора.
Код:

  !include "MUI2.nsh"

 Name "font_test"
 OutFile "font_test.exe"
 
 !define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
 
 !define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePage
 !insertmacro MUI_PAGE_WELCOME

 !insertmacro MUI_LANGUAGE "Russian"

Var Dialog0
Var CustomFonts1
Var CustomFonts2

Function myGuiInit
  CreateFont $CustomFonts1 "Tahoma" "25" "700" /ITALIC
  CreateFont $CustomFonts2 "Comic Sans MS" "10" "400"
FunctionEnd

Function WelcomePage
  FindWindow $Dialog0 "#32770" "" $HWNDPARENT
  SetCtlColors $Dialog0 "" 0x000000

  GetDlgItem $0 $Dialog0 1201
  SendMessage $0 ${WM_SETTEXT} 0 "STR:Привет!"
  SendMessage $0 ${WM_SETFONT} $CustomFonts1 0
  SetCtlColors $0 0xff0000 transparent

  GetDlgItem $1 $Dialog0 1202
  SendMessage $1 ${WM_SETFONT} $CustomFonts2 0
  SetCtlColors $1 0xffff00 transparent
FunctionEnd

Section
Sectionend

P.S. В справочнике оказывается тоже есть информация по шрифтам...

динозавра 13-07-2015 10:26 2528223

BuZzOFF, огромное спасибо.
В справочнике я видел инфу шрифтов, но пробЫвал это втюхать в мое окошко, но естественно ничего не получилось.
Я просто видел один установщик от RePack9649, так у него окошко с выбором языка цветное, вот я и подумал, что и в моем примитивном окошке тоже можно както менять шрифты.

BuZzOFF 13-07-2015 11:11 2528246

Цитата:

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

Это совсем разные окошки. В MessageBox нельзя поменять шрифт. У 9649 репак сделан на innosetup. И ему нужно прекращать употреблять тяжёлые наркотики. У меня от вида его инсталлятора кровь из глаз пошла...

динозавра 13-07-2015 11:14 2528250

Цитата:

репак сделан на innosetup. И ему нужно прекращать употреблять тяжёлые наркотики. У меня от вида его инсталлятора кровь из глаз пошла...
:lol: Все ясно.

Sharinganx3 16-07-2015 11:07 2529339

Привет) нужна помощь так как я новичек))) нужен скрипт для нсис , как установить ip адрес))) спасибо )

MKN 16-07-2015 13:07 2529393

Цитата:

Цитата Sharinganx3
как установить ip адрес »

самое простое и эффективное - использовать штатную виндовую утилитку netsh, запускаемую с помощью плагина ExecDos
; http://nsis.sourceforge.net/ExecDos_plug-in
; http://ogarkov.com/2011/02/25/window...метров-tcp-ip/
; http://blogerator.ru/page/10-komand-...-kazhdyj-admin

BuZzOFF 16-07-2015 19:34 2529509

Можно ли как-то реализовать такое?

Есть файл с названиями элементов. Элементов штук 50 (но может быть и больше). Один элемент - одна строка.
Как сделать так чтоб считывались названия из файла и создавались CheckBox'ы с этими названиями.
Т.к. CheckBox'ов много будет нужно как-то прилепить ещё и scroll...
И как потом проверить статусы отметки всех этих элементов.

P.S. Со считыванием названия и созданием CheckBox'а проблем нет. Не знаю как это зациклить :)

upd1. Наверное только через IO такое получится. Но хотелось бы NSD.

upd2. Сделал на IO. Работает. На NSD можно сделать? IO - не очень удобно...

MKN 17-07-2015 13:24 2529707

Цитата:

Цитата BuZzOFF
На NSD можно сделать? »

Можно. Навскидку - так :

Код:

!include "MUI2.nsh"
!include "CommCtrl.nsh"  ; из Спрвочника !
OutFile "LISTVIEW-CHECKBOXES.exe"
RequestExecutionLevel user
Page custom CreatePage
!insertmacro MUI_LANGUAGE "English"

Function CreatePage
!insertmacro MUI_HEADER_TEXT "LISTVIEW-CHECKBOXES" "LISTVIEW-CHECKBOXES"
nsDialogs::Create 1018
Pop $0
${NSD_CreateListView} 0u 0u 300u 120u "ListView"
Pop $1
SendMessage $1 ${LVM_SETBKCOLOR}    0 0xC7EDCC
SendMessage $1 ${LVM_SETTEXTBKCOLOR} 0 0xC7EDCC
${NSD_LV_InsertColumn} $1 0 150 "Заголовок  - Столбец 1"
!define /math _LISTVIEW_TEMP_STYLE ${LVS_EX_CHECKBOXES} | ${LVS_EX_FULLROWSELECT} 
SendMessage $1 ${LVM_SETEXTENDEDLISTVIEWSTYLE} 0 ${_LISTVIEW_TEMP_STYLE}
!undef _LISTVIEW_TEMP_STYLE
; =========================================================================
FileOpen $4 "$EXEDIR\myfile.txt" r
loop:
FileRead $4 $9 ; в $9 заносится содержимое строк из файла $4 ( построчно, с каждым циклом)
IntOp $R3 $R3 + 1  ; счетчик Item_ов
${NSD_LV_InsertItem} $1 $R3 "$9"  ; создание Item_ов в ListView
IfErrors +1 loop
FileClose $4
; =================================================================
  ; Установить состояние чекбоксов
  ${NSD_LV_SetCheckState} $1 0 1  ; отмечен
  ${NSD_LV_SetCheckState} $1 1 0  ; не отмечен
  ${NSD_LV_SetCheckState} $1 2 1  ; отмечен
  ; и т.д.
  ; кнопка контроля состояния чекбоксов
  ${NSD_CreateButton} 0u 124u 300u 15u "Проверка состояния чекбоксов" ; 
  Pop $2
  ${NSD_OnClick} $2 CheckItemState
  nsDialogs::Show
  System::Call `comctl32::ImageList_Destroy(iR0)`
FunctionEnd

Function CheckItemState
  ${NSD_LV_GetCheckState} $1 0 $R0
  ${NSD_LV_GetCheckState} $1 1 $R1
  ${NSD_LV_GetCheckState} $1 2 $R2
    ; и т.д.
  IntCmp $R0 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 0"
  IntCmp $R1 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 1"
  IntCmp $R2 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 2"
    ; и т.д.
  MessageBox MB_OK|MB_ICONINFORMATION "$R4"
FunctionEnd

Section
SectionEnd

CheckItemState наверняка можно сделать универсальной для любого кол-ва Item_ов. Неохота заморачиваться...

BuZzOFF 17-07-2015 14:34 2529723

Цитата:

Цитата MKN
Можно. Навскидку - так : »

Круто! Настолько круто, что допилить до ума моих скудных знаний не хватит...


upd. Помогите, пожалуйста с CheckBox'ами. Как сделать проверку отметки универсальной, чтоб не руками вписывать, т.к. их количество будет каждый раз разное.

MKN 17-07-2015 15:58 2529754

Цитата:

Цитата BuZzOFF
Как сделать проверку отметки универсальной »

Не совсем понятна твоя конечная цель... От этого ведь зависит алгоритм кода...
Можно такой вариант (если чисто для информации) - инфа об исходном, дефолтовом (до того, как пользователь их отметит или снимет отметку !) состоянии чекбоксов (можно по всякому сделать, в зависимости от цели) :
Код:


Function CheckItemState
StrCpy $R5 0
loop:
IntOp $R5 $R5 + 1  ; счетчик номеров чекбоксов для GetCheckState
${NSD_LV_GetCheckState} $1 $R5 $R0 ; в $R0 - 1 или 0, в зависимости от исходной отметки чекбокса
StrCmp $R5 "$R3" Done  ;  выход из цикла после опроса последнего чекбокса
MessageBox MB_OK "Состояние чекбокса №$R5 - $R0"
Goto Loop
Done:
FunctionEnd


BuZzOFF 17-07-2015 16:09 2529759

Цитата:

Цитата MKN
Не совсем понятна твоя конечная цель... От этого ведь зависит алгоритм кода... »

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

MKN 17-07-2015 17:46 2529793

Цитата:

Цитата BuZzOFF
Пользователь выберет нужные элементы, и дальше инсталлятор будет работать только с отмеченными »

Тогда, первым делом переименуй кнопку ${NSD_CreateButton} 0u 124u 300u 15u "Install" . :)
Этой кнопкой будешь запускать инсталляцию после отметки чекбоксов, а родную кнопку Install - удаляешь со страницы

Функция почти такая же :
Код:

Function CheckItemState
StrCpy $R5 -1       
loop:
IntOp $R5 $R5 + 1  ; счетчик номеров чекбоксов для GetCheckState
${NSD_LV_GetCheckState} $1 $R5 $R0 ;  в $R0 - 1 или 0 , в зависимости от отметки чекбокса
StrCmp $R5 "$R3" Done  ;  выход из цикла после опроса последнего чекбокса
;MessageBox MB_OK "Состояние чекбокса №$R5 - $R0"
StrCpy $R8 "$R8 $R0"
Goto Loop
Done:
StrCpy $R8 $R8 -1  ; отсекаем 1 последний символ строки
MessageBox MB_OK "$R8" ; в $R8 - строка с последовательностью  1 и 0 , т.е. отмеченных или не отмеченных чекбоксов
SendMessage $HWNDPARENT 0x408 1 0
FunctionEnd

Вот это: StrCpy $R5 -1 и вот это: StrCpy $R8 $R8 -1 - коррекция издержек счёта... Может можно и по другому, не разбирался, т.к. так работает нормально...

В итоге : в $R8 - строка с последовательностью 1 и 0 , т.е. отмеченных или не отмеченных всех чекбоксов
А далее, в зависимости от того, который по счёту символ в строке будет 1, т.е. отмеченным чекбоксом, то простой логикой, если символ под номером таким то (а это номер точно известного компонента) равен 1 , то он и устанавливается. Конечно можно и по другому. Но так , как мне кажется, будет проще...

BuZzOFF 17-07-2015 18:02 2529796

Цитата:

Цитата MKN
первым делом переименуй кнопку »

Интерфейс ещё будет меняться. С этим разберусь, это я могу :)
Огромнейшее спасибо! Я про этот ListView вообще не знал... Буду дальше разбираться.

BuZzOFF 17-07-2015 19:41 2529816

А ещё можно сделать так чтоб при выделении элемента отмечался/снимался CheckBox?
Нашёл нечто похожее:
Код:

SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} ${LVS_EX_AUTOCHECKSELECT} ${LVS_EX_AUTOCHECKSELECT}



Но не то. Оно вон как отображается. CheckBox появляется только при наведении.

K.A.V. 17-07-2015 20:50 2529829

Цитата:

Цитата BuZzOFF
А ещё можно сделать так чтоб при выделении элемента отмечался/снимался CheckBox? »

Если хотите творить на NSIS "по-настоящему" - углубляйтесь в познание WinAPI (что такое сообщения/уведомления и т.д.) и будет вам счастье

Код:

!include "MUI2.nsh"
!include "CommCtrl_.nsh"  ; из Спрвочника !
OutFile "LISTVIEW-CHECKBOXES.exe"
RequestExecutionLevel user
Page custom CreatePage
!insertmacro MUI_LANGUAGE "English"

Function CreatePage
!insertmacro MUI_HEADER_TEXT "LISTVIEW-CHECKBOXES" "LISTVIEW-CHECKBOXES"
nsDialogs::Create 1018
Pop $0
${NSD_CreateListView} 0u 0u 300u 120u "ListView"
Pop $1
SendMessage $1 ${LVM_SETBKCOLOR}    0 0xC7EDCC
SendMessage $1 ${LVM_SETTEXTBKCOLOR} 0 0xC7EDCC
${NSD_LV_InsertColumn} $1 0 150 "Заголовок  - Столбец 1"
!define /math _LISTVIEW_TEMP_STYLE ${LVS_EX_CHECKBOXES} | ${LVS_EX_FULLROWSELECT}
SendMessage $1 ${LVM_SETEXTENDEDLISTVIEWSTYLE} 0 ${_LISTVIEW_TEMP_STYLE}
!undef _LISTVIEW_TEMP_STYLE

${NSD_OnNotify} $1 OnClickListView

; =========================================================================
FileOpen $4 "$EXEDIR\myfile.txt" r
loop:
FileRead $4 $9 ; в $9 заносится содержимое строк из файла $4 ( построчно, с каждым циклом)
IntOp $R3 $R3 + 1  ; счетчик Item_ов
${NSD_LV_InsertItem} $1 $R3 "$9"  ; создание Item_ов в ListView
IfErrors +1 loop
FileClose $4
; =================================================================
  ; Установить состояние чекбоксов
  ${NSD_LV_SetCheckState} $1 0 1  ; отмечен
  ${NSD_LV_SetCheckState} $1 1 0  ; не отмечен
  ${NSD_LV_SetCheckState} $1 2 1  ; отмечен
  ; и т.д.
  ; кнопка контроля состояния чекбоксов
  ${NSD_CreateButton} 0u 124u 300u 15u "Проверка состояния чекбоксов" ; 
  Pop $2
  ${NSD_OnClick} $2 CheckItemState
  nsDialogs::Show
  System::Call `comctl32::ImageList_Destroy(iR0)`
FunctionEnd

Function CheckItemState
  ${NSD_LV_GetCheckState} $1 0 $R0
  ${NSD_LV_GetCheckState} $1 1 $R1
  ${NSD_LV_GetCheckState} $1 2 $R2
    ; и т.д.
  IntCmp $R0 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 0"
  IntCmp $R1 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 1"
  IntCmp $R2 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 2"
    ; и т.д.
  MessageBox MB_OK|MB_ICONINFORMATION "$R4"
FunctionEnd




Function OnClickListView
  System::Store SR2R1R0
  ${Select} $R1
    ${Case} ${NM_CLICK} ; если событие - клик мыши
      SendMessage $R2 ${LVM_GETHOTITEM} 0 0 $0 ; узнаём, на какой элемент пользователь нажал
      ${NSD_LV_GetCheckState} $1 $0 $2  ; узнаём статус галочки - стоит или не стоит
      ${If} $2 == "1" ; если галочка стоит
          ${NSD_LV_SetCheckState} $1 $0 0 ; снимаем галочку
      ${Else}
          ${NSD_LV_SetCheckState} $1 $0 1 ; ставим галочку, если не стоит
      ${EndIf} 
  ${EndSelect}
  System::Store L
FunctionEnd



Section
SectionEnd


MKN 18-07-2015 11:30 2529967

Когда то kotkovets сотворил интересный и полезный код - кнопочный тулбар из bmp

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

!include "CommCtrl.nsh"
!include "MUI2.nsh"

OutFile "ToolbarButton-test.exe"
ShowInstDetails Show

Page custom CreatePage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
xpstyle off

var dlg
var toolbar

!define ID_0  100
!define ID_1  101
!define ID_2  102
!define ID_3  103
!define ID_4  104
!define ID_5  105
!define ID_6  106
!define ID_7  107
!define ID_8  108
!define ID_9  109

Function CreatePage
    System::Call "comctl32::ImageList_Create(i32,i32,i${ILC_MASK}|${ILC_COLORDDB},i1,i0)i.R8" ;создаем имеджлист
    System::Call 'user32::LoadImage(i0,t"image-line.bmp",i${IMAGE_BITMAP},i0,i0,i${LR_LOADFROMFILE}|${LR_DEFAULTSIZE})i.R9'
    ;загружаем картинку в имеджлист первая картинку имеет индекс - 0
    System::Call "comctl32::ImageList_AddMasked(iR8,iR9,i${CLR_DEFAULT})"
    System::Call "gdi32::DeleteObject(iR9)"
    nsDialogs::Create 1044
    Pop $dlg
    ${NSD_CreateToolbar} 20u 5u 100% 40u ""
    Pop $toolbar
    ${NSD_AddStyle} $toolbar ${WS_BORDER}
    SendMessage $toolbar ${TB_BUTTONSTRUCTSIZE} 20 0
    SendMessage $toolbar ${TB_SETIMAGELIST} 0 $R8 ;созданный имеджлист помещаем на тулбар
    ${NSD_OnNotify} $toolbar toolbar
   
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_0} 0  ; ${NSD_TB_ADDBUTTONS} [хэндл контрола] [ID кнопки] [индекс картинки]
    ${NSD_TB_ADDSEPARATOR} $toolbar  ; добавляем сепаратор(разделитель)
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_1} 1
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_2} 2
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_3} 3
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_4} 4
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_5} 5
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_6} 6
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_7} 7
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_8} 8
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_9} 9
     
    nsDialogs::Show
    System::Call "comctl32::ImageList_Destroy(iR8)"
FunctionEnd

Function ID_LOAD
    MessageBox MB_OK "$R1 -->  ID_0" IDOK
FunctionEnd

Function ID_1
    MessageBox MB_OK "$R1 -->  ID_1" IDOK
FunctionEnd

Function ID_2
    MessageBox MB_OK "$R1 -->  ID_2" IDOK
FunctionEnd

Function ID_3
    MessageBox MB_OK "$R1 -->  ID_3" IDOK
FunctionEnd

Function ID_4
    MessageBox MB_OK "$R1 -->  ID_4" IDOK
FunctionEnd

Function ID_5
    MessageBox MB_OK "$R1 -->  ID_5" IDOK
FunctionEnd

Function ID_6
    MessageBox MB_OK "$R1 -->  ID_6" IDOK
FunctionEnd

Function ID_7
    MessageBox MB_OK "$R1 -->  ID_7" IDOK
FunctionEnd

Function ID_8
    MessageBox MB_OK "$R1 -->  ID_8" IDOK
FunctionEnd

Function ID_9
    MessageBox MB_OK "$R1 -->  ID_9" IDOK
FunctionEnd

Function toolbar
  System::Store SR2R1R0
  ; NM_CLICK уведомляет родительское окно органа управления, что пользователь щелкнул левой кнопкой мыши в пределах органа управления
  ${If} $R1 == ${NM_CLICK} ;уведомление о клике мыши по тулбару
      System::Call "*$R0(i,i,i,i.R1)"
      ${Select} $R1 ; в $R1 - возвращенный идентификатор кнопки
            ${Case} ${ID_0}
                Call ID_LOAD
            ${Case} ${ID_1}
                Call ID_1
            ${Case} ${ID_2}
                Call ID_2
            ${Case} ${ID_3}
                Call ID_3
            ${Case} ${ID_4}
                Call ID_4
            ${Case} ${ID_5}
                Call ID_5
            ${Case} ${ID_6}
                Call ID_6
            ${Case} ${ID_7}
                Call ID_7
            ${Case} ${ID_8}
                Call ID_8
            ${Case} ${ID_9}
                Call ID_9
      ${EndSelect}
  ${EndIf}
  System::Store L
FunctionEnd

Section ""
SectionEnd





Но к сожалению этот код нормально компилится только в версии NSIS 2.46. В NSIS 3 получаем ошибку...

И дело похоже в CommCtrl.nsh. Даже откорректированная для NSIS 3 ( из справочника) - не работает.
А не работает наверное потому , что в этом варианте CommCtrl.nsh нет макросов для Toolbar_а (__NSD_TB_ADDBUTTONS и сопутствующее добро... )

Как бы это дело подретушировать для NSIS 3 ? Я в сети находил вариант CommCtrl.nsh с нужными макросами, но подстановка их в CommCtrl.nsh всё равно приводит к ошибке...
читать дальше »
Код:


${DEFINE} CMB_MASKED              0x02
${DEFINE} TBSTATE_CHECKED        0x01
${DEFINE} TBSTATE_PRESSED        0x02
${DEFINE} TBSTATE_ENABLED        0x04
${DEFINE} TBSTATE_HIDDEN          0x08
${DEFINE} TBSTATE_INDETERMINATE  0x10
${DEFINE} TBSTATE_WRAP            0x20
${DEFINE} TBSTATE_ELLIPSES        0x40
${DEFINE} TBSTATE_MARKED          0x80

${DEFINE} TB_ADDBUTTONS          1044
${DEFINE} TB_INSERTBUTTON        1045
${DEFINE} TB_DELETEBUTTON        1046
${DEFINE} TB_GETBUTTON            1047
${DEFINE} TB_BUTTONCOUNT          1048
${DEFINE} TB_COMMANDTOINDEX      1049
${DEFINE} TB_HITTEST              1093


#################################################################
# ${NSD_TB_ADDBUTTONS}                                          #
#################################################################

!macro __NSD_TB_ADDBUTTONS htoolbar_ ID_CODE_ IMAGE_
        !verbose push
        !verbose ${_COMMCTRL_NSH_VERBOSE}
  Push `${htoolbar_}`
  Push `${ID_CODE_}`
  Push `${IMAGE_}`
  ${CallArtificialFunction} __NSD_TB_ADDBUTTONS_Call
  !verbose pop
!macroend
!macro __NSD_TB_ADDBUTTONS_Call
    System::Store SR2R1R0
    System::Call "*(iR2, iR1, i${TBSTATE_ENABLED}, i${TBSTYLE_BUTTON}, i0, i0)i.R1"
    SendMessage $R0 ${TB_ADDBUTTONS} 1 $R1
    System::Free $R1
    System::Store L
!macroend
${DEFINE} NSD_TB_ADDBUTTONS "!insertmacro __NSD_TB_ADDBUTTONS"
#################################################################
!macro __NSD_TB_ADDSEPARATOR htoolbar_
  !verbose push
        !verbose ${_COMMCTRL_NSH_VERBOSE}
  Push `${htoolbar_}`
  ${CallArtificialFunction} __NSD_TB_ADDSEPARATOR_Call
  !verbose pop
!macroend
!macro __NSD_TB_ADDSEPARATOR_Call
    System::Store SR0
    System::Call "*(i-1, i0, i0, i${TBSTYLE_SEP}, i0, i0)i.R1"
    SendMessage $R0 ${TB_ADDBUTTONS} 1 $R1
    System::Free $R1
    System::Store L
!macroend
${DEFINE} NSD_TB_ADDSEPARATOR "!insertmacro __NSD_TB_ADDSEPARATOR"

!define __NSD_Toolbar_CLASS ${TOOLBARCLASSNAME}
;!define __NSD_Toolbar_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${TBSTYLE_TOOLTIPS}|${TBSTYLE_TRANSPARENT} ;|${CCS_NORESIZE}|${CCS_ADJUSTABLE}
 !define __NSD_Toolbar_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${TBSTYLE_TOOLTIPS}|${TBSTYLE_TRANSPARENT}|${CCS_NORESIZE}|${CCS_ADJUSTABLE}|${CCS_NODIVIDER}
!define __NSD_Toolbar_EXSTYLE 0

!insertmacro __NSD_DefineControl Toolbar


K.A.V. 18-07-2015 12:09 2529974

Вложений: 1
Цитата:

Цитата MKN
Даже откорректированная для NSIS 3 ( из справочника) - не работает »

:tongue:

MKN 18-07-2015 12:19 2529977

K.A.V.,
И этот хедер не работает... Ну что такое...
Цитата:

!insertmacro: __NSD_TB_ADDBUTTONS
!verbose: Invalid verbose level
Error in macro __NSD_TB_ADDBUTTONS on macroline 2
Error in script "\ToolBarWindow32.nsi" on line 41 -- aborting creation process
41 строка : (${NSD_TB_ADDBUTTONS} $toolbar ${ID_0} 0 ; ${NSD_TB_ADDBUTTONS} [хэндл контрола] [ID кнопки] [индекс картинки])

K.A.V. 18-07-2015 12:48 2529982

Цитата:

Цитата MKN
И этот хедер не работает... »

Врёшь
В этом хидере в макросе ${NSD_TB_ADDBUTTONS} нет команды !verbose, смотри внимательней, что/куда копируешь и какой код компилируешь

MKN 18-07-2015 12:52 2529983

K.A.V.,
Разобрался. Опять у меня -25. Если рядом с файлом скрипта другой CommCtrl.nsh - ошибка. Что за хрень... Уже ведь такое было.
Но есть такой момент - пол тулбара теперь обрезано...

И нет никакой реакции у ${NSD_CreateToolbar} на изменение размера и позиции...
То же, при компиляции в 2.46 - работает нормально...

ps раскомментировал в CommCtrl.nsh ;|${CCS_NORESIZE}|${CCS_ADJUSTABLE} - и всё заработало. (нужно было ${CCS_NORESIZE} )

BuZzOFF 18-07-2015 16:58 2530025

Цитата:

Цитата K.A.V.
углубляйтесь в познание WinAPI »

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

Кстати, у всех сайт не работает? nsis.sourceforge.net

P.S. Этот ListView для меня как "новые ворота".

K.A.V. 18-07-2015 17:34 2530032

Цитата:

Цитата MKN
ps раскомментировал в CommCtrl.nsh ;|${CCS_NORESIZE}|${CCS_ADJUSTABLE} - и всё заработало. (нужно было ${CCS_NORESIZE} ) »

ну я не особо проверял работоспособность, лень, откомпилировался проект и создался тулбар - мне хватило :biggrin:

Цитата:

Цитата BuZzOFF
Зря институ бросал. Учился когда-то на программиста »

Чтобы программировать - образование не нужно, это я вам как самоучка говорю :yes:


Цитата:

Цитата BuZzOFF
Кстати, у всех сайт не работает? nsis.sourceforge.net »

У всех

Dodakaedr 21-07-2015 23:55 2531149

Подскажите как записать двойной слеш в ini файл?
Код:

[Directories]
TempDir=C:\\Users\\Admin\\AppData\\Local\\Temp\\acity_temp


K.A.V. 22-07-2015 00:52 2531163

Цитата:

Цитата Dodakaedr
Подскажите как записать двойной слеш в ini файл? »

Справочку когда читать будем?
Справочник по NSIS => Перевод справки NSIS => StrRep
Справочник по NSIS => Перевод справки NSIS => WriteINIStr

Код:

!include "StrFunc.nsh"
${StrRep}

OutFile "test.exe"

Section
    ${StrRep} $0 "$TEMP\acity_temp" "\" "\\"
    WriteINIStr "$EXEDIR\TEST.ini" "Directories" "TempDir" "$0"
quit
SectionEnd


Dodakaedr 22-07-2015 16:33 2531477

А как с таким быть?
Код:

[Directories]
TempDir=D:\\����� ����� (2)\\Audacity 2.1\\AppData\\audacity_temp

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

!include "StrFunc.nsh"
${StrRep}

OutFile "test.exe"

Section
SetShellVarContext current
CreateDirectory "$APPDATA\Audacity"
    ${StrRep} $0 "$EXEDIR\AppData\audacity_temp" "\" "\\"
    WriteINIStr "$APPDATA\Audacity\audacity.cfg" "Directories" "TempDir" "$0"
;ExecWait "C:\Program Files\Audacity44\audacity.exe"
quit
SectionEnd


K.A.V. 22-07-2015 17:02 2531495

Цитата:

Цитата Dodakaedr
Поместите скомпилированный файл в папку в названии которой есть кириллица и посмотрите у вас таже фигня: »

Ваш INI файл не в ANSI кодировке

Dodakaedr 22-07-2015 21:33 2531615

Цитата:

Цитата K.A.V.
Ваш INI файл не в ANSI кодировке »

Да, действительно. В левой программе изменил кодировку и все ок. Теперь осталось эту кодировку оформить в скрипте. Вы не знаете как это сделать?

K.A.V. 22-07-2015 23:14 2531645

Цитата:

Цитата Dodakaedr
Теперь осталось эту кодировку оформить в скрипте. Вы не знаете как это сделать? »

Что сделать то? Поменять кодировку файла или записать корректно строку в файл с не ANSI кодировкой?
Если поменять кодировку файла - не знаю (и гуглить особо не ок с мобильного инета, поэтому как-нибудь сами), я вообще по теме кодировок "не бум бум"
Судя по запросу гугла на сайте NSIS есть какой-то плаг "Unicode", у меня в архиве на жд его нет (опять же, потому что темой кодировок не интересовался), поэтому не могу сказать, что это за плаг и какие в нём есть функции - возможно в нём как раз есть полезные функции

Поиском в гугле по-быстрому наткнулся на код от kotkovets, в нём есть макрос преобразования ANSI строки в UTF8, что позволяет писать корректно в файл с кодировкой UTF8 (насчет других - не в курсе)

Код:

!include "StrFunc.nsh"
${StrRep}

!define ANSIToUTF8 "!insertmacro ANSIToUTF8"
!macro ANSIToUTF8 SOURCE_STRING OUTPUT_STRING
      Push `${SOURCE_STRING}`
      System::Store SR2
      System::Call "kernel32::MultiByteToWideChar(i0,i0,tR2,i-1,i0,i0)i.R1"
      IntOp $R1 $R1 * 2
      System::Alloc $R1
      Pop $R0
      System::Call "kernel32::MultiByteToWideChar(i0,i0,tR2,i-1,iR0,iR1)"
      System::Call "kernel32::WideCharToMultiByte(i65001,i0,iR0,i-1,t.s,iR1,i0,i0)"
      System::Free $R0
      System::Store L
      Pop `${OUTPUT_STRING}`
!macroend

OutFile "test.exe"

Section
    ${StrRep} $0 "$EXEDIR\acity_temp" "\" "\\"
    ${ANSIToUTF8} "$0" "$0"
    WriteINIStr "$EXEDIR\TEST.ini" "Directories" "TempDir" "$0"
quit
SectionEnd


tony1990 26-07-2015 15:08 2532675

Всем привет!

Возникла такая задача. В зависимости от выбора типа установки (32-бит или 64-бит) выводить в списке компонентов только нужные элементы (именно выводить, а не отмечать галочкой). Есть ли какой-нибудь флаг типа установки InstType чтобы знать какой выбран в данный момент или же тут только через кастомную страницу с радиобатонами придётся решать?

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

K.A.V. 26-07-2015 22:28 2532812

Цитата:

Цитата tony1990
Есть ли какой-нибудь флаг типа установки InstType чтобы знать какой выбран в данный момент »

Если справочник не читали - рекомендую это сделать, флаг типа установки (как ни странно) хранит только то, какой тип установки выбран, прочитайте про команду GetCurInstType

Цитата:

Цитата tony1990
В зависимости от выбора типа установки (32-бит или 64-бит) выводить в списке компонентов только нужные элементы (именно выводить, а не отмечать галочкой) »

Ну так, проще простого, ведь NSIS не отображает секции без имён - этим и нужно пользоваться
А разрядность ОСи определяется буквально парой строк

Цитата:

В зависимости от выбора типа установки (32-бит или 64-бит)
Пользователю ещё и тыкать нужно? Сделайте всё на автомате...

Код:

Section /o "Эта секция скрывается при 64-bit ОС" SEC_64BIT
SectionEnd
           
Section /o "Эта секция скрывается при 32-bit ОС" SEC_32BIT
SectionEnd


Function .onInit
Var /Global IsWow64Process
  System::Call kernel32::GetCurrentProcess()i.s
  System::Call kernel32::IsWow64Process(is,*i.s)
  Pop $IsWow64Process ; 0 = 32-bit ОС, 1 = 64-bit ОС
 
 ${If} $IsWow64Process == "1"
  SectionSetText ${SEC_64BIT} "" ; Секции с пустыми именами не отображаются
 ${Else}
  SectionSetText ${SEC_32BIT} "" ; Секции с пустыми именами не отображаются
 ${EndIf} 
FunctionEnd


Dodakaedr 27-07-2015 23:14 2533177

Можно такое реализовать?: надо дождаться завершения процесса, но этот процесс запускается в другом процессе. То есть использую запуск
Код:

Exec '"$INSTDIR\someprogram.exe"'
, но эта someprogram.exe запускает OtherProg.exe. Надо дождаться завершения работы этой самой OtherProg.exe. Сразу запуск с ожиданием OtherProg.exe не катит.

kotkovets 27-07-2015 23:19 2533181

Dodakaedr, в шапке: Работа с процессами (ProcessFunc.nsh)
P.s
Скоро выложу обновленный, адаптированный по win10 winver2.nsh

Dodakaedr 27-07-2015 23:43 2533186

Хотел уже писать что не нашел там нужного, а потом решил еще раз посмотреть по внимательней и увидел))
Цитата:

time - указанное время в миллисекундах, если указать константу ${INFINITE} или -1
установщик будет ждать завершения процесса.
Спасибо!

BuZzOFF 28-07-2015 11:14 2533282

Код:

Function test
  StrCpy $R0 1
  loop:
  ${LineRead} "$EXEDIR\test.csv" "$R0" $R1
  StrCmp $R1 "" exit 0
  ${WordFind2X} "$R1" "{" "}" "+1" $R1
  StrCpy $PayloadID $R1
  IntOp $R0 $R0 + 1
  Goto loop
  exit:
FunctionEnd

Есть примерно такой код. Подскажите, пожалуйста, как в $PayloadID поместить все перечисленные значения из текстового файла, а не одно значение поочерёдно.
Что-то сообразить не могу...

K.A.V. 28-07-2015 11:26 2533284

Код:

StrCpy $PayloadID "$PayloadID $R1"
Цитата:

Цитата BuZzOFF
Что-то сообразить не могу... »

Заработались наверное, отдохните :)

tony1990 28-07-2015 11:29 2533287

Спасибо за GetCurInstType!

Цитата:

Пользователю ещё и тыкать нужно? Сделайте всё на автомате...
Задача несколько иная. Я наверно не совсем точно выразился. На 64 системе должен быть выбор установки 32-битной или 64-битной версии программы. С флагом типа установки теперь легко всё реализую.

Спасибо!

kotkovets 28-07-2015 23:54 2533558

Адаптировал WinVer2.nsh под Windows 10.
Добавлены значения:
  1. Определение названия ОС:
    Win10
    Server 2015 (пока так)

  2. Определение редакции ОС:
    Windows 10 N
    Windows 10 China
    Home Single Language
    Home
---
На серверных ОС не тестировал, просьба потестировать.

MKN 29-07-2015 11:22 2533706

kotkovets,
Когда то мы обсуждали тормоза обработки WMI запросов... В частности для NSIS есть http://nsis.sourceforge.net/WMI_header.
Без этого хедера многие вещи в NSIS сделать просто не возможно... Но вот скорость работы...
Недавно натолкнулся на обсуждение и преодоление тормозов при использовании WMI - http://bbs.vbstreets.ru/viewtopic.php?f=1&t=43269
Возможно ли как то "подправить" WMI.nsh для ускорения работы ?

tony1990 29-07-2015 12:24 2533725

Всё - таки легко не получилось :) Нужно при тыканье на тип установки на странице компонентов вызывать функцию .onInit, так как в ней определяются компоненты которые нужно или не нужно выводить. Где это можно прописать?
Спасибо

MKN 29-07-2015 13:41 2533765

tony1990,

Для стандартных страниц, когда требуется установка x32 компонентов в x64 ОС (ну и само собой х32 в х32 ОС и х64 в х64 ОС) проще манипулировать чекбоксами выбора вариантов установки на странице MUI_PAGE_COMPONENTS

Пользователю предлагается :
в x64 ОС выбрать чекбокс - либо "установка х32 компонентов" либо "установка х64 компонентов". Очень наглядно и удобно.

При установке в х32 ОС эти чекбоксы скрыты. А ещё лучше скрыть только "х64" чекбокс, а чекбокс "х32" оставить не активным.

Для отметки/скрытия чекбоксов используем в Function .onInit , (к примеру, для секции с ID х32 и секции с ID x64) :

SectionSetFlags ${x32} 17 ; не активный ОТМЕЧЕННЫЙ чекбокс секции x32
SectionSetFlags ${x64} 16 ; не активный НЕ отмеченный чекбокс секции x64
SectionSetText ${x64} "" ; скрыть чекбокс секции x64


В зависимости от состояния чекбоксов, устанавливаются флаги отметки секций (к примеру, для секции с ID х32 и секции с ID x64) используем :
!insertmacro UnselectSection ${x64}
!insertmacro SelectSection ${x32}
Ессно совместно с Function .onSelChange

И ещё такой момент. Как правило, пользователю по умолчанию предлагается путь установки ($INSTDIR) - в $PROGRAMFILES. Этот путь ($INSTDIR)
пользователь видит на странице MUI_PAGE_DIRECTORY (там же ессно может и изменить)

Так вот, при установке x32 компонентов в х32 ОС и при установке x64 компонентов в х64 ОС - каталог $PROGRAMFILES одинаков ,т.е. Program Files

А при установке x32 компонентов в х64 ОС, каталог $PROGRAMFILES - Program Files (x86)

Это надо учитывать для правильного отображения $PROGRAMFILES на стандартной странице MUI_PAGE_DIRECTORY.
Т.е. придётся добавить свою MUI_PAGE_CUSTOMFUNCTION_SHOW , в которой в зависимости от состояния чекбоксов выбора разрядности, устанавливаем $INSTDIR с правильным каталогом $PROGRAMFILES

kotkovets 29-07-2015 15:52 2533822

Цитата:

Цитата MKN
Возможно ли как то "подправить" WMI.nsh для ускорения работы ? »

без понятия, будет желание гляну... :search:

Dodakaedr 29-07-2015 16:18 2533836

Подскажите как добавить текст в буфер обмена?

MKN 29-07-2015 16:21 2533838

Цитата:

Цитата Dodakaedr
как добавить текст в буфер обмена? »

http://nsis.sourceforge.net/Copy_to,...dows_Clipboard

tony1990 30-07-2015 20:29 2534517

Цитата:

Для стандартных страниц, когда требуется установка x32 компонентов в x64 ОС (ну и само собой х32 в х32 ОС и х64 в х64 ОС) проще манипулировать чекбоксами выбора вариантов установки на странице MUI_PAGE_COMPONENTS
Проблема в том что у меня в зависимости от версии программы куча компонентов, которые пользователь может включать/выключать. Поэтому я хотел сделать кастомную страницу с выбором до страницы компонентов. Но столкнулся со сложностями. Похоже что определение видимости/невидимости секций работает только в .onInit. И определяется это только в первый проход. При повторном запуске .onInit ничего не меняется. Короче, уже отчаялся я. Либо делать месседж бокс с выбором в начале .onInit (установка 32 или 64 версии программы) что по дизайну конечно не очень, либо делать 2 разных установщика.

K.A.V. 31-07-2015 06:07 2534682

Цитата:

Цитата tony1990
Похоже что определение видимости/невидимости секций работает только в .onInit »

Если пункт в элементе уже существует - его нельзя скрыть, можно только удалить
Если хотите именно скрывать пункты - вам нужно писать свою кастомную страничку, на ней уже будете обрабатывать, какой пункт выбрал пользователь (x32/x64) и в зависимости от выбора заполнять элемент нужными пунктами, очищая перед заполнением, всё это придётся прописывать вручную.
Набрасывать такой код не буду по одной простой причине - не знаю, какой вы хотите видеть кастомную страничку, такой же, как и дефолтная с выпадающим списком - или с выбором типа установки по принципу радиобаттонов и вообще, с помощью чего собираетесь делать кастомную страничку, IO или nsDialogs

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

Код:

!define PRODUCT_NAME "Моя программа"

!include "MUI.nsh"   

page custom ClickNext ; автоматически жмём кнопку "Далее", чтобы список элементов перестроился автоматически в зависимости от выбора - нам нужно перезагрузить страничку с компонентами, нажав "Назад" и потом "Далее"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW hideBackButton ; Скрываем кнопку "Назад" от пользователя
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY 

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_LANGUAGE "Russian" 

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

InstType /NOCUSTOM
InstType x32 
InstType x64 

Section /o "Эта секция для 32-bit ОС" SEC_32BIT
SectionIn 1
SectionEnd 

Section /o "Эта секция для 64-bit ОС" SEC_64BIT
SectionIn 2
SectionEnd 
           
Function ClickNext ; Жмём кнопку Далее
  GetDlgItem $0 $HWNDPARENT 1
  SendMessage $0 ${BM_CLICK} 0 0
FunctionEnd           
           
Function hideBackButton ; Скрываем кнопку Назад
  GetDlgItem $0 $HWNDPARENT 3
  ShowWindow $0 0
FunctionEnd         
                         
Function .onSelChange 
  GetCurInstType $R0 ; Получаем статус выбранного типа установки
    ${If} $R0 == "0" ; Если первый (x32) - присваиваем текст секциям для x32 системы и скрываем секции с x64 системой
    SectionSetText ${SEC_32BIT} "SEC_32BIT"
    SectionSetText ${SEC_64BIT} ""
    ${ElseIf} $R0 == "1"
    SectionSetText ${SEC_32BIT} ""
    SectionSetText ${SEC_64BIT} "SEC_64BIT"
    ${EndIf}
  GetDlgItem $0 $HWNDPARENT 3
  SendMessage $0 ${BM_CLICK} 0 0
FunctionEnd

Function .onInit
Var /Global IsWow64Process
  System::Call kernel32::GetCurrentProcess()i.s
  System::Call kernel32::IsWow64Process(is,*i.s)
  Pop $IsWow64Process ; 0 = 32-bit ОС, 1 = 64-bit ОС
 
 ${If} $IsWow64Process == "0" ; первоначальный выбор типа установки в зависимости от системы пользователя
  SetCurInstType 0
  SectionSetText ${SEC_32BIT} "SEC_32BIT"
  SectionSetText ${SEC_64BIT} ""
 ${Else}
  SetCurInstType 1
  SectionSetText ${SEC_32BIT} ""
  SectionSetText ${SEC_64BIT} "SEC_64BIT"
 ${EndIf} 
FunctionEnd

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC_64BIT} ""
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC_32BIT} ""
!insertmacro MUI_FUNCTION_DESCRIPTION_END

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

MKN 31-07-2015 12:26 2534826

Цитата:

Цитата tony1990
у меня в зависимости от версии программы куча компонентов, которые пользователь может включать/выключать. »

Т.е. , кроме разных разрядностей самих приложений ещё и разные компоненты для каждой разрядности ? Никогда не встречал такого бардака... :) Обычно, выбираемые компоненты - общие для разных разрядностей.
Ну, ежели у тебя именно так, то тогда лучший (если не единственный) вариант, как уже сказал K.A.V. - кастомная страница.

K.A.V. 31-07-2015 12:36 2534833

Цитата:

Цитата MKN
Обычно, выбираемые компоненты - общие для разных разрядностей »

Вот вот...При таком раскладе можно просто в секции закинуть проверку на разрядность и распаковывать нужные файлы/записывать данные в реестр основываясь на этом

Либо можно по-другому, без кастомной странички с компонентами: создаём кастомную страничку с двумя радиобаттонами с предложением выбрать, какой тип приложения устанавливать (x32/x64) и уже после этого выбора задействовать тот кусок кода из .onInit, который скрывает "лишние" компоненты

tony1990 31-07-2015 13:38 2534869

Накидал вот такой код:

Код:

!include "MUI2.nsh"
!include "WinMessages.nsh"
!include "x64.nsh"

!include nsDialogs.nsh

OutFile "Sample.exe"

Var DIALOG
Var TEXT
Var Button1
Var Button2
Var Is32
Var Is64

Page custom nsDialogsPage LeaveDialog
!insertmacro MUI_PAGE_COMPONENTS

!insertmacro MUI_LANGUAGE "English"

Function nsDialogsPage

;${If} ${RunningX64}

        nsDialogs::Create 1018
        Pop $DIALOG
        ${NSD_CreateLabel} 10u 10u 100% 29u "Выберите один из следующих типов установки:"
        Pop $TEXT
        ${NSD_CreateRadioButton} 20u 50u 100% 12u "64-битная версия программы"
        Pop $Button1
        ${NSD_CreateRadioButton} 20u 75u 100% 12u "32-битная версия программы"
        Pop $Button2

        ${NSD_SetState} $Button1 1
        Call Components64

        ${NSD_OnClick} $Button1 Components64
        ${NSD_OnClick} $Button2 Components32

        nsDialogs::Show

;${Else}
;        IntOp $Is32 0 + 1
;${EndIf}

FunctionEnd

Function Components64

        IntOp $Is64 0 + 1
        IntOp $Is32 0 + 0

FunctionEnd

Function Components32

        IntOp $Is64 0 + 0
        IntOp $Is32 0 + 1

FunctionEnd

Function LeaveDialog

        Call DefineSections

FunctionEnd


Section /o "" SEC_64BIT
SectionEnd
           
Section /o "" SEC_32BIT
SectionEnd


Function DefineSections

IntCmp $Is64 1 is64 next
is64:
SectionSetText ${SEC_64BIT} "Секция для 64-версии"
next:
IntCmp $Is32 1 is32 next2
is32:
SectionSetText ${SEC_32BIT} "Секция для 32-версии"
next2:

FunctionEnd

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

Цитата:

Т.е. , кроме разных разрядностей самих приложений ещё и разные компоненты для каждой разрядности ? Никогда не встречал такого бардака... :)
Специфика программы :) Плагин для графических хостов, которые могут быть как и 32 и 64-битные. Соответственно 32-версия плагина работает с 32-битным хостами, 64 с 64. Секций может быть и мало, в зависимости сколько хостов установлено на компе.
В .onInit происходит поиск этих самых хостов и определение секций. И вот мне надо сделать чтобы при определении секций ещё учитывался и выбор версии плагина.

Edzan 31-07-2015 13:47 2534874

Можно ли вот этот как нибудь организовать в NSIS?

K.A.V. 31-07-2015 13:52 2534878

Цитата:

Цитата tony1990
И всё вроде как работает, кроме того что если жмёшь Back и выбираешь другой пункт то на странице компонентов отображаются 2 секции, а не одна. »

Ну так вы забыли прописать в код секции, которые нужно скрывать...
Т.е. если нужно показать только для x64, то прописываем этим секциям текст и прописываем пустые имена тем секциям, которые не должны отображаться в x64

Код:

!include "MUI2.nsh"
!include "WinMessages.nsh"
!include "x64.nsh"

!include nsDialogs.nsh

OutFile "Sample.exe"

Var DIALOG
Var TEXT
Var Button1
Var Button2
Var Is32
Var Is64

Page custom nsDialogsPage LeaveDialog
!insertmacro MUI_PAGE_COMPONENTS

!insertmacro MUI_LANGUAGE "English"

Function nsDialogsPage

;${If} ${RunningX64}

        nsDialogs::Create 1018
        Pop $DIALOG
        ${NSD_CreateLabel} 10u 10u 100% 29u "Выберите один из следующих типов установки:"
        Pop $TEXT
        ${NSD_CreateRadioButton} 20u 50u 100% 12u "64-битная версия программы"
        Pop $Button1
        ${NSD_CreateRadioButton} 20u 75u 100% 12u "32-битная версия программы"
        Pop $Button2

        ${NSD_SetState} $Button1 1
        Call Components64

        ${NSD_OnClick} $Button1 Components64
        ${NSD_OnClick} $Button2 Components32

        nsDialogs::Show

;${Else}
;        IntOp $Is32 0 + 1
;${EndIf}

FunctionEnd

Function Components64

        IntOp $Is64 0 + 1
        IntOp $Is32 0 + 0

FunctionEnd

Function Components32

        IntOp $Is64 0 + 0
        IntOp $Is32 0 + 1

FunctionEnd

Function LeaveDialog

        Call DefineSections

FunctionEnd


Section /o "" SEC_64BIT
SectionEnd
           
Section /o "" SEC_32BIT
SectionEnd


Function DefineSections

IntCmp $Is64 1 is64 next
is64:
SectionSetText ${SEC_64BIT} "Секция для 64-версии"
SectionSetText ${SEC_32BIT} "
"
next:
IntCmp $Is32 1 is32 next2
is32:
SectionSetText ${SEC_64BIT} ""
SectionSetText ${SEC_32BIT} "Секция для 32-версии"

next2:

FunctionEnd

Цитата:

Цитата Edzan
Можно ли вот этот как нибудь организовать в NSIS? »

Можно, если прочитаете наш справочник и описание команды GetDrives для начала, ну а определить, на каком диске стоит система - не сложно, есть переменная папки Windows, по ней и определите...

Kopejkin 31-07-2015 19:13 2534994

Вложений: 1
Вопрос по примеру из Cправочника по NSIS.
Работа со строками.
Замена строки в текстовом файле.
читать дальше
Имеются ли какие-либо ограничения по кодировке обрабатываемых текстовых файлов?
Мне нужно было заменить значение Lang=9 на Lang=22 в файле 01.ini. И ничего у меня не вышло. При просмотре того, что же, все-таки, выводится в переменную $R9, увидел следующее: Текст обрабатывался посимвольно.



Напротив, другой файл (02.ini) обрабатывался правильно - построчно.



Единственное отличие файлов, которое я нашел - различная кодировка. 01.ini - USC2 Little Endian, 02.ini - ANSI.

Что можно сделать?

MKN 01-08-2015 11:51 2535274

Kopejkin,
Попробуй NewTextreplace плагин. Он и читает, и ищет и делает многое другое, в том числе и в юникодных файлах.

Kopejkin 01-08-2015 20:26 2535548

Цитата:

Цитата MKN
Попробуй NewTextreplace... »

Спасибо, хороший плагин, но иногда добавляет в конец файла какой-то мусор.

tony1990 02-08-2015 11:01 2535762

А можно ли в кастомной странице используя nsDialogs::Create 1018 поменять надписи в хэдере на свои? Или же только nsDialogs::Create 1044 использовать?

Sharinganx3 03-08-2015 10:48 2536128

Добрый день) подскажите если не сложно как прописать что бы инсталлятор определял версию операционки 32 или 64. Спасибо =)

K.A.V. 03-08-2015 10:53 2536132

Цитата:

Цитата Sharinganx3
как прописать что бы инсталлятор определял версию операционки 32 или 64 »

В начале кода:
Код:

!include "x64.nsh"
Далее в коде использовать:
Код:

  ${If} ${RunningX64}
    MessageBox MB_OK "Система x64"
  ${Else}
    MessageBox MB_OK "Система x32" 
  ${EndIf}


tony1990 03-08-2015 11:53 2536169

Цитата:

Добрый день) подскажите если не сложно как прописать что бы инсталлятор определял версию операционки 32 или 64. Спасибо
Код:

!include "x64.nsh"
...

${If} ${RunningX64}
          код если система 64       
${Else}
          код если система 32
${EndIf}


Begin2Fly 05-08-2015 20:28 2537519

Кто уже успел полюбить Windows 10?
Берём из справочника команду ${GetFileVersion}, либо GetDLLVersion, делаем что-то вроде:
Скрытый текст
Код:

GetDLLVersion "$SYSDIR\kernel32.dll" $R0 $R1
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $0 "$R2.$R3.$R4.$R5"
StrCpy $OS "$0" 4
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "$0"


В предрелизных версиях было нормально: 10.0.билд.ххх
В RTM что-то страшное:
1. В свойствах файла положенная 10.0.10240.16384
2. Total Commander показывает 6.2.10240.16384
3. Результат вышеуказанной команды выдаёт 6.3.10240.16384
4. Resource Hacker думает следующее:
Скрытый текст

Код:

1 VERSIONINFO
FILEVERSION 10,0,10240,16384
PRODUCTVERSION 10,0,10240,16384
FILEOS 0x40004
FILETYPE 0x2
{
BLOCK "StringFileInfo"
{
        BLOCK "040904B0"
        {
                VALUE "CompanyName", "Microsoft Corporation"
                VALUE "FileDescription", "Windows NT BASE API Client DLL"
                VALUE "FileVersion", "10.0.10240.16384 (th1.150709-1700)"
                VALUE "InternalName", "kernel32"
                VALUE "LegalCopyright", "© Microsoft Corporation. All rights reserved."
                VALUE "OriginalFilename", "kernel32"
                VALUE "ProductName", "Microsoft® Windows® Operating System"
                VALUE "ProductVersion", "10.0.10240.16384"
        }
}

BLOCK "VarFileInfo"
{
        VALUE "Translation", 0x0409 0x04B0
}
}


Хорошо, что есть WinVer2, но, блин...

K.A.V. 05-08-2015 21:04 2537534

Цитата:

Цитата Begin2Fly
Хорошо, что есть WinVer2, но, блин... »

А зачем по файлам определять версию системы? Есть же средства проверенные, пользуйтесь ими
По вопросу - перед проверкой версии файла скопируйте его в другую директорию, например в $TEMP, видимо, там что-то намудрили разрабы, поэтому и такой результат выполнения команды...

Цитата:

Цитата Begin2Fly
Кто уже успел полюбить Windows 10? »

Не решусь ставить десятку основной системой до ближайших пакетов обновлений, к тому же, ничего существенного в систему добавлено не было (лично для меня, в плане удобности работы), из-за чего бы мне так понадобилось устанавливать эту ось, для меня в ней больше минусов, чем плюсов на данный момент, поэтому...пока люблю Windows 7 :)

Begin2Fly 06-08-2015 09:39 2537706

Цитата:

Цитата K.A.V.
А зачем по файлам определять версию системы? »

Суть не в определении версии системы, а в том, что работает оно не так, как должно.

Появилась вторая бетка 3-й версии:
Изменения:
F.1 3.0 Beta 2

Released on August 4th, 2015

F.1.1 Changelog
F.1.1.1 Major Changes

• Preliminary Windows 10 support

F.1.1.2 Minor Changes

• Added !appendfile /RawNL switch
• Added PESubsysVer attribute
• Exec[Wait] sets the CREATE_DEFAULT_ERROR_MODE flag when creating a process
• Fixed 4+ TiB freespace calculation bug (bug #1115)
• Fixed CreateShortcut /NoWorkingDir parsing bug (bug #1110)
• Fixed minor issues in the Pascal NSIS plug-in SDK and removed the extrap global variable
• nsDialogs and InstallOptions now use the system link color

F.1.1.3 Build System

• Linux stdcall warning fix (patch #261)
• Linux test-scripts fix (patch #260)
• Win64 fixes (including patch #258, bug #1105)
• Visual C 2012 fixes

kotkovets 06-08-2015 12:45 2537791

Цитата:

Цитата Edzan
Можно ли вот этот как нибудь организовать в NSIS? http://forum.oszone.net/post-1217528-97.html

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

${GetGameDrive} "путь установки игры без буквы диска"
Код:

outfile test.exe


!define GetGameDrive "!insertmacro _GetGameDrive"
!macro _GetGameDrive hPatch
  !include Logiclib.nsh
  System::Store S
  System::Call 'kernel32::GetLogicalDrives(v)i.r0'
  StrCpy $1 $WINDIR 3
  StrCpy $3 65
  StrCpy $5 -1
  ${Do}
      IntOp $2 $0 & 1
      ${If} $2 <> 0
          IntFmt $2 "%c:\" $3
          System::Call 'kernel32::GetDriveType(tr2)i.r4'
          ${If} $4 == 3
              IntOp $5 $5 + 1
              ${IfNot} $2 == $1
                StrCmp $5 1 0 +2
                StrCpy $INSTDIR "$2${hPatch}"
                StrCmp $5 0 0 +2
                StrCpy $INSTDIR "$1${hPatch}"
              ${EndIf}
          ${EndIf}
      ${EndIf}
      IntOp $3 $3 + 1
      IntOp $0 $0 >> 1
  ${LoopUntil} $0 == 0
  System::Store L
!macroend

Function .OnInit
  ${GetGameDrive} "Games\My Game"
FunctionEnd

Section
  MessageBox MB_ICONINFORMATION|MB_OK "$INSTDIR"
SectionEnd

Макрос перезаписывает переменную $INSTDIR в самой первой функции установщика (пример).
Макрос определяет логические диски на компьютере и предлагает установить на первый логический диск не являющийся системным, в противном случае будет предложен системный диск.

Цитата:

Цитата Begin2Fly
Появилась вторая бетка 3-й версии: »

как всегда, РОВНОМ НИЧЁ НЕ СДЕЛАЛИ ))

K.A.V. 06-08-2015 14:13 2537840

Цитата:

Цитата kotkovets
Можно, накидал макрос по быстрому: »

А я любитель стандартных команд :)
Скрытый текст

Код:

!include "FileFunc.nsh"
!include "LogicLib.nsh"
OutFile "test.exe" 
 
Function .onInit
StrCpy $R1 ""
StrCpy $R0 "$WINDIR" 3
${GetDrives} "HDD" "CallbackFunction"
 ${If} $R1 == ""
 StrCpy $R1 "$R0"
 ${EndIf}
 
StrCpy $INSTDIR "$R1Games\My Game"

MessageBox MB_OK|MB_ICONINFORMATION "$INSTDIR"
quit
FunctionEnd

Function CallbackFunction
 ${If} $R0 != "$9"
 StrCpy $R1 $9
 Push "StopGetDrives"
 ${EndIf}
Push ""
FunctionEnd


Section     
SectionEnd



Цитата:

Цитата kotkovets
как всегда, РОВНОМ НИЧЁ НЕ СДЕЛАЛИ »

Ну как же, хотя бы ради фикса бага с ключом /NoWorkingDir в CreateShortcut стоит обновиться, хотя и не критично...

kotkovets 06-08-2015 14:56 2537871

Цитата:

Цитата K.A.V.
А я любитель стандартных команд »

видимо я не любитель :)
Цитата:

Цитата K.A.V.
/NoWorkingDir в CreateShortcut стоит обновиться, хотя и не критично... »

фикс без которого NSIS не NSIS :o

Vincent7 08-08-2015 19:56 2538932

Приветствую всех. Вопрос по nsDialogs. Есть четыре чекбокса, нужно сделать так- если ни один из них не отмечен, то кнопка 'далее' не активна, если хоть один отмечен, то соответственно- активна. Возможно ли?

K.A.V. 09-08-2015 09:47 2539074

Цитата:

Цитата Vincent7
Есть четыре чекбокса, нужно сделать так- если ни один из них не отмечен, то кнопка 'далее' не активна, если хоть один отмечен, то соответственно- активна »

В этой теме уже миллион примеров, воспользуйтесь поиском по теме с именами команд nsDialogs или посмотрите примеры на офф сайте

Vincent7 09-08-2015 21:53 2539364

Вы как всегда правы.

динозавра 13-08-2015 16:42 2541215

Всем привет. Пытаюсь сделать маленький экзешник типа замены рег файла, только с кнопкой да или да - нет. Но это не важно - все получается и сведенья добавляются в реестр. Проблема на х64 и только с веткой HKLM. Сведенья добавляются не туда. К примеру мне нужно создать [HKEY_LOCAL_MACHINE\SOFTWARE\Proba] , а у меня создается [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Proba]. Что нужно прописать, чтобы само не добавлялось Wow6432Node? Спасибо.

K.A.V. 13-08-2015 16:47 2541218

Цитата:

Цитата динозавра
Что нужно прописать, чтобы само не добавлялось Wow6432Node? »

Справочник по NSIS => Перевод справки NSIS => SetRegView

динозавра 13-08-2015 17:09 2541231

Оперативно. Но на изучение уйдет много времени, а мне нужно всего лишь помощь в коректировке уже рабочего экзешника, не изучая досконально язык програмирования. Как говорил мой дед: "спасибо, что не отказали в помощи".

K.A.V. 13-08-2015 17:19 2541237

Цитата:

Цитата динозавра
Но на изучение уйдет много времени »

На прочтение 5 строчек в описании команды у вас уйдёт много времени? :o
"Сделайте мне быстро и чтобы я не вникал ни во что" - это так заказы оформляются на фрилансерных сайтах, вам туда с такими сообщениями и подходом

динозавра 13-08-2015 17:32 2541244

Извените. Но я не то имел ввиду. Если всавить код. то выдает по очереди два сообщения типа х86 ок и за ним х64 - ок. Я хотел автомат без окошек с ок.

MKN 13-08-2015 17:43 2541247

динозавра,
Приведи здесь свой код и чётко поставь задачу.

динозавра 13-08-2015 17:54 2541252

Вот

Код:

Section main
    ${If} ${RunningX64}
  SetRegView 32
  ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
  MessageBox MB_OK $0 # C:\Program Files (x86)
  SetRegView 64
  ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
  MessageBox MB_OK $0 # C:\Program Files
${Else}
  ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
  MessageBox MB_OK $0 # C:\Program Files
${EndIf}

                WriteRegStr HKLM "SOFTWARE\Proba" "Proba" "00000000"
               
SectionEnd

Мне нужно, чтобы запись велась в SOFTWARE\Proba без запросов и на х32 и на х64

K.A.V. 13-08-2015 17:56 2541255

Цитата:

Цитата MKN
Приведи здесь свой код и чётко поставь задачу. »

Да тут всё понятно, человек не знает ничего о NSIS, не может прочитать описание команды и вставить одну строку перед своими командами по записи данных в реестр, чтобы записалось всё не в Wow6432Node, потом взял кусок кода из описания команды SetRegView и не может понять, как убрать сообщения с мессаджами...

динозавра, читайте справочник от корки до корки
По поводу вопроса: чтобы данные не писались в Wow6432Node, нужно установить тип доступа в реестр (а инсталляторы, которые создаёт NSIS - 32 разрядные приложения, поэтому и доступ у них перенаправляется в Wow6432Node раздел), необходимо перед командами записи в реестр добавить команду SetRegView 64
Код:

SetRegView 64
WriteRegStr HKLM "Software\TEST" "Параметр" "Значение"


динозавра 13-08-2015 18:09 2541265

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

MKN 14-08-2015 16:00 2541633

Интересно, как можно попроще решить такую задачу ? :

Наводим курсор на изображение - это изображение заменяется другим (ну и курсор при наведении меняется, становится "ладошкой")
Кликаем на изменившемся изображении ПКМ - получаем Callback.
Возможно ли здесь обойтись без таймера ?

kotkovets 15-08-2015 21:10 2542032

Цитата:

Цитата MKN
Интересно, как можно попроще решить такую задачу ? : »

никак проще, 3 тонны кода, вагон и тележка с надписью: поехали

K.A.V. 16-08-2015 01:02 2542100

Цитата:

Цитата MKN
Интересно, как можно попроще решить такую задачу ? »

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

Цитата:

Цитата MKN
Наводим курсор на изображение - это изображение заменяется другим »

Попробовал на скоряк поставить элемент Label/Bitmap на OnNotify в nsDialogs (по аналогии как здесь с ListView) - ничего в callback не прилетает, как я понял из MSDN, у Static должен быть стиль SS_NOTIFY для обработки сообщений, чтобы обрабатывался хотя бы клик мыши - присвоил стиль и всё-равно ничего не прилетает, не стал дальше разбираться

Цитата:

Цитата MKN
Возможно ли здесь обойтись без таймера ? »

А с таймером ты уже сделал такое?
Увы, но на WinAPI нет ничего готового, нет никаких плюшек для автоматизации какого-то действия, так что для всего того, что ты описал, ты должен будешь сделать всё вручную, а именно:
1. Получить текущие координаты позиции курсора мыши
2. Получить координаты элемента с изображением
3. Вычислить, если координаты из п1 входят в диапазон координат п2, то курсор над изображением
4. Вручную, опять же, присвоить изображение
5. Обработать нажатие ПКМ на изображении тоже должен сам, если пришло такое сообщение - делаешь то, что нужно

Я бы, наверное, просто закинул это дело в плаг и попробовал бы создать элемент изображения в самой dll и там же всё это обрабатывать в своей процедуре...Но это будет мягко говоря не удобно, создавать dll для одного элемента :)

Vincent7 16-08-2015 17:59 2542331

Кто нибудь юзал вот это
http://nsis.sourceforge.net/NullsoftDecompiler
Работает? У меня на выходе получается белиберда..

MKN 16-08-2015 19:06 2542355

Цитата:

Цитата K.A.V.
С такими хотелками проще бросить NSIS »

Эээээ.... А чего я такого несбыточного спросил ? :)
Цитата:

Цитата K.A.V.
А с таймером ты уже сделал такое? »

Ну да... Только чуется мне , что и без таймера можно обойтись... :) Там , где таймер, всегда какие то глюки...
Цитата:

Цитата kotkovets
3 тонны кода, вагон и тележка с надписью: поехали »

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

!include "MUI2.nsh"
Page custom nsDialogsPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "click_pict.exe"

Var dlg
Var Click
Var IMAGE
Var IMAGECTL
Var IMAGE2
Var IMAGECTL2

Function OnTimer
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 = $Click
ShowWindow $IMAGECTL 1
ShowWindow $IMAGECTL2 0
System::Call USER32::LoadCursor(i,i32649)i.s
System::Call USER32::SetCursor(is)
${Else}
ShowWindow $IMAGECTL2 1
ShowWindow $IMAGECTL 0
${EndIf}
System::Call user32::RedrawWindow(i$Click,i0,i0,i0x0105)
FunctionEnd

Function nsDialogsPage
nsDialogs::Create 1018
Pop $dlg
   
nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 140u 20u 48u 32u ""
Pop $IMAGECTL
StrCpy $6 "$EXEDIR\a.bmp"
System::Call 'user32::LoadImage(i 0, t r6, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $IMAGE
SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE 
ShowWindow $IMAGECTL 0
               
nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 140u 20u 48u 32u ""
Pop $IMAGECTL2
StrCpy $7 "$EXEDIR\b.bmp"
System::Call 'user32::LoadImage(i 0, t r7, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $IMAGE2
SendMessage $IMAGECTL2 ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE2 
ShowWindow $IMAGECTL2 1
 
${NSD_CreateLabel} 135u 22u 40u 20u ""
Pop $Click
${NSD_OnClick} $Click OnClick
${NSD_CreateTimer} OnTimer 50
 
System::Call 'gdi32:DeleteObject(i $IMAGE)'
System::Call 'gdi32:DeleteObject(i $IMAGE2)'
nsDialogs::Show
FunctionEnd

Function OnClick
MessageBox MB_OK "Кликнули на изображении"
FunctionEnd

Section
SectionEnd

Как бы его причесать и упростить ?

ps Для чего это всё надо ? А чтобы в ногу со временем идти и для разнообразия :). Чтобы делать страницы, оформленные в стиле Metro интерфейса. При наведении курсора - вокруг кнопки (а это - цветное изображение прямоугольника на цветном фоне) появляется рамочка, чтобы был виден выбор этой кнопки, затем клик и действие. Ладошка курсора - это приятная и полезная мелочь.
Хорошо бы всё это загнать в DLL... Вполне реально и полезно... Но с dll мне не справиться... Вся надежда на вас, на гуру. :)

K.A.V. 16-08-2015 22:15 2542410

Цитата:

Цитата MKN
Эээээ.... А чего я такого несбыточного спросил ? »

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

Цитата:

Цитата MKN
Как бы его причесать и упростить ? »

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

Скрытый текст

Код:

!include "MUI2.nsh"
Page custom nsDialogsPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "click_pict.exe"

Var dlg
Var Click
Var IMAGE
Var IMAGECTL
Var IMAGE2
Var IMAGECTL2

Function OnTimer
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 = $IMAGECTL
System::Call USER32::LoadCursor(i,i32649)i.s
System::Call USER32::SetCursor(is)
SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE 
${Else}
SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE2
${EndIf}
System::Call user32::RedrawWindow(i$Click,i0,i0,i0x0105)
FunctionEnd

Function nsDialogsPage
nsDialogs::Create 1018
Pop $dlg
   
nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 140u 20u 48u 32u ""
Pop $IMAGECTL
StrCpy $6 "$EXEDIR\a.bmp"
System::Call 'user32::LoadImage(i 0, t r6, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $IMAGE
SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE 

StrCpy $7 "$EXEDIR\b.bmp"
System::Call 'user32::LoadImage(i 0, t r7, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $IMAGE2
               
${NSD_AddStyle} $IMAGECTL ${SS_NOTIFY}
${NSD_OnClick} $IMAGECTL OnClick
${NSD_CreateTimer} OnTimer 50   

nsDialogs::Show
System::Call 'gdi32:DeleteObject(i $IMAGE)'
System::Call 'gdi32:DeleteObject(i $IMAGE2)'
FunctionEnd

Function OnClick
MessageBox MB_OK "Кликнули на изображении"
FunctionEnd

Section
SectionEnd



Цитата:

Цитата MKN
Хорошо бы всё это загнать в DLL... Вполне реально и полезно... Но с dll мне не справиться... Вся надежда на вас, на гуру. »

Для меня то код здесь накидать - великое дело в последнее время, а что уж говорить про написание dll...мне над креатором ещё работать не знаю сколько, так что на меня можно не надеяться :)

kotkovets 17-08-2015 14:48 2542682

LOKYOXY, уберите картинки под коврик, и что это хрень?

K.A.V. 18-08-2015 17:49 2543170

Цитата:

Цитата kotkovets
и что это хрень? »

Найти все сообщения от LOKYOXY
Человек, видимо, написал свой интерфейс в стиле "жизньболь" (ну, мне просто основной цвет не нравится :)) под NSIS, а этот пост - видимо, менеджер закачек на NSIS

MKN 18-08-2015 18:49 2543203

Цитата:

Цитата K.A.V.
Может, конечно, найдёшь другой метод »

Да, можно и без таймера - с помощью WndProc плагина. Наверное , это самое простое решение для этой задачи...

Iska 18-08-2015 18:51 2543205

Цитата:

Цитата K.A.V.
а этот пост - видимо, менеджер закачек на NSIS »

Лишь бы не очередной OpenCandy :).

Dodakaedr 19-08-2015 15:07 2543547

Использую nsis3.0a2 подключил библиотеку RegistryFunc.nsh, взятую с справки.
Теперь сам вопрос: почему при вызове команды ${MoveKey}
Код:

${MoveKey} "${HKCU}\Software\7-zip" "${HKCU}\Software\7-zip2"
при отсутствии исходного ключа все равно создается ключ?
Код:

${HKCU}\Software\7-zip2
Это глюк библы или я не правильно что-то использую?

kotkovets 19-08-2015 15:22 2543555

Цитата:

Цитата Dodakaedr
при отсутствии ключа все равно создается ключ? »

из справки:
Если нужно переместить в другой ключ, который не существует - ключ будет создан.
---
Если ключ реестра, который нужно переместить, не существует, то устанавливается флаг ошибки
---
Вообще библиотека заточена под NSIS 2.46 ANSI версии.

Dodakaedr 19-08-2015 15:30 2543557

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

kotkovets 19-08-2015 15:46 2543565

Цитата:

Цитата Dodakaedr
так ключа не существует, перемещать нечего и создается пустой ключ. »

Код:

!include "RegistryFunc.nsh"
outfile 123.exe
Section
  ${MoveKey} "${HKLM}\Software\bla_bla" "${HKLM}\Software\7777"
  IfErrors 0 +2
  MessageBox MB_OK "Ошибка, ключа `bla_bla` нет"
SectionEnd

проверил ниче не создается, так как нет ключа. Создаться ключ 7777 - если ключ bla_bla есть или он пустой.
P.S
ан нет создается ключ 7777, хотя не критично, но подправлю

Dodakaedr 19-08-2015 15:53 2543568

Цитата:

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

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

MKN 19-08-2015 16:13 2543576

Есть такой известный код определения BIOS serial number с помощью WMI :

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

; Display BIOS serial number

OutFile "bios_sn.exe"

!include "LogicLib.nsh"

!define CLSCTX_INPROC_SERVER 1
!define CLSID_WbemLocator {4590f811-1d3a-11d0-891f-00aa004b2e24}
!define IID_IWbemLocator {dc12a687-737f-11cf-884d-00aa004b2e24}

!define RPC_C_AUTHN_LEVEL_DEFAULT  0
!define RPC_C_IMP_LEVEL_IMPERSONATE 3

!define EOAC_NONE                  0

!define WBEM_FLAG_FORWARD_ONLY      0x20
!define WBEM_FLAG_RETURN_IMMEDIATELY 0x10
!define WBEM_INFINITE                0xffffffff

; Query BIOS serial number via WMI and return it in $0
Function bios_sn
  ; Save registers
  Push $1
  Push $2
  Push $3
  Push $4
  Push $5
  Push $6
  Push $7

  ; Initialization of COM is done via OleInitialize in NSIS installer code
  ; Set general COM security level
  System::Call "ole32::CoInitializeSecurity( \\
        i 0, i -1, i 0, i 0, i ${RPC_C_AUTHN_LEVEL_DEFAULT}, \\
        i ${RPC_C_IMP_LEVEL_IMPERSONATE}, i 0, i ${EOAC_NONE}, i 0) i.r1"
  ${If} $1 != 0
    StrCpy $0 "failed to initialize security: $1"
    Goto bios_sn_end
  ${EndIf}
 
  ; Create IWbemLocator interface
  System::Call "ole32::CoCreateInstance( \\
        g '${CLSID_WbemLocator}', i 0, \\
        i ${CLSCTX_INPROC_SERVER}, \\
        g '${IID_IWbemLocator}', *i .r2) i.r1"
  ${If} $1 != 0
    StrCpy $0 "failed to create IWebmLocator object: $1"
    Goto bios_sn_end
  ${EndIf}

  ; Call IWbemLocator->ConnectServer
  System::Call "$2->3(w 'ROOT\CIMV2', i 0, i 0, i 0, i 0, i 0, i 0, *i .r3) i.r1"

  ${If} $1 != 0
    StrCpy $0 "failed to connect: $1"
  ${Else}
    ; Call IWbemServices->ExecQuery 
    System::Call "$3->20(w 'WQL', w 'Select SerialNumber from Win32_BIOS', \\
        ${WBEM_FLAG_FORWARD_ONLY} | ${WBEM_FLAG_RETURN_IMMEDIATELY}, \\
        i 0, *i .r4) i.r1"

    ${If} $1 != 0
        StrCpy $0 "failed to query: $1 $3"
    ${Else}
        ; Call IEnumWbemClassObject->Next
        System::Call "$4->4(i ${WBEM_INFINITE}, i 1, *i .r5, *i .r6) i.r1"
        ${If} $1 != 0
            StrCpy $0 "failed to iterate: $1"
        ${Else} 
            ${If} $6 > 0
                ; Variant
                ; (unsigned short vt, WORD wReserved1, 
                ;  WORD wReserved2, WORD wReserved3, BSTR bstrVal)
                ; Allocate memory for Variant
                System::Call "*(i 0, i 0, i 0) i.r7"
                ; Call IWbemClassObject->Get
                System::Call "$5->4(w 'SerialNumber', i 0, i r7, i 0, i 0) i.r1"
                ${If} $1 < 0
                    StrCpy $0 "failed to get: $1"
                ${Else} 
                    ; Access bstrVal from Variant
                    System::Call "*$7(i, i, w .r0)"
                    System::Call "ole32::VariantClear(i r7)"
                ${EndIf}
                ; Free memory associated with Variant
                System::Free $7
            ${Else}
                StrCpy $0 "failed: no items ***91;$6***93;"
            ${EndIf}
            ; Call IWbemClassObject->Release
            System::Call "$5->2()"
        ${EndIf}
        ; Call IEnumWbemClassObject->Release
        System::Call "$4->2()"
    ${EndIf}

    ; Call IWbemService->Release
    System::Call "$3->2()"
  ${EndIf}

  ; Call IWbemLocator->Release
  System::Call "$2->2()"

bios_sn_end:
  ; Restore registers
  Pop $7
  Pop $6
  Pop $5
  Pop $4
  Pop $3
  Pop $2
  Pop $1
FunctionEnd

Function .onInit
  InitPluginsDir
  Call bios_sn
  MessageBox MB_OK "BIOS Serial Number=$0"
  Quit
FunctionEnd

Section 
SectionEnd



Но он почему то не работает в Win7 и выше... Как это исправить ? И будет ли он работать с другими WMI параметрами, т.е. определять не только BIOS Serial Number ?

kotkovets 19-08-2015 16:48 2543591

Цитата:

Цитата MKN
BIOS serial number с помощью WMI »

в 10 не работает серийник, в скрипте vbs
скрипт vbs
Код:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
   
Set colBIOS = objWMIService.ExecQuery ("Select * from Win32_BIOS")
   
For each objBIOS in colBIOS
    Wscript.Echo "Build Number: " & objBIOS.BuildNumber
    Wscript.Echo "Current Language: " & objBIOS.CurrentLanguage
    Wscript.Echo "Installable Languages: " & objBIOS.InstallableLanguages
    Wscript.Echo "Manufacturer: " & objBIOS.Manufacturer
    Wscript.Echo "Name: " & objBIOS.Name
    Wscript.Echo "Primary BIOS: " & objBIOS.PrimaryBIOS
    Wscript.Echo "Release Date: " & objBIOS.ReleaseDate
    Wscript.Echo "Serial Number: " & objBIOS.SerialNumber
    Wscript.Echo "SMBIOS Version: " & objBIOS.SMBIOSBIOSVersion
    Wscript.Echo "SMBIOS Major Version: " & objBIOS.SMBIOSMajorVersion
    Wscript.Echo "SMBIOS Minor Version: " & objBIOS.SMBIOSMinorVersion
    Wscript.Echo "SMBIOS Present: " & objBIOS.SMBIOSPresent
    Wscript.Echo "Status: " & objBIOS.Status
    Wscript.Echo "Version: " & objBIOS.Version
Next


очевидно мелкгомякие подрезали что то.. NSIS не виноват

MKN 19-08-2015 16:57 2543593

Цитата:

Цитата kotkovets
в 10 не работает серийник »

Ладно серийник... А почему тогда не работают прочие WMI определения в том коде ? Например, для определения модели материнки - изменяю в коде "биосные парметры" на
CIMV2 Win32_BaseBoard Product - всё равно не работает...

kotkovets 19-08-2015 17:05 2543598

Цитата:

Цитата MKN
А почему тогда не работают прочие WMI определения в том коде ? »

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

      System::Call "$3->20(w 'WQL', w 'Select SerialNumber from Win32_BIOS', \\
        ${WBEM_FLAG_FORWARD_ONLY} | ${WBEM_FLAG_RETURN_IMMEDIATELY}, \\
        i 0, *i .r4) i.r1"
--
--
            ${If} $6 > 0
                ; Variant
                ; (unsigned short vt, WORD wReserved1, 
                ;  WORD wReserved2, WORD wReserved3, BSTR bstrVal)
                ; Allocate memory for Variant
                System::Call "*(i 0, i 0, i 0) i.r7"
                ; Call IWbemClassObject->Get
                System::Call "$5->4(w 'SerialNumber', i 0, i r7, i 0, i 0) i.r1"
                ${If} $1 < 0
                    StrCpy $0 "failed to get: $1"
                ${Else} 
                    ; Access bstrVal from Variant
                    System::Call "*$7(i, i, w .r0)"
                    System::Call "ole32::VariantClear(i r7)"
                ${EndIf}
                ; Free memory associated with Variant
                System::Free $7
            ${Else}
                StrCpy $0 "failed: no items ***91;$6***93;"
            ${EndIf}


переделывать скрипт не имеет смысла.

MKN 19-08-2015 17:07 2543599

Цитата:

Цитата kotkovets
переделывать скрипт не имеет смысла. »

А как альтернативу wmic ? Разве такой код не работал бы быстрее ? Если нет, то наверное действительно, смысла нет, будем использовать тормозной wmic...

K.A.V. 19-08-2015 17:10 2543601

Цитата:

Цитата MKN
Но он почему то не работает в Win7 и выше.. »

Работает, просто не у всех прописан этот самый серийный номер и от системы не зависит, на виртуалке VirtualBox будет возвращаться значение 0 и разницы нет, NSIS установщик получает инфу или приложение на C++ (писал своё приложение по получению инфы о железе, материнке, диски, проц, BIOS, видюшка)

Цитата:

Цитата MKN
И будет ли он работать с другими WMI параметрами, т.е. определять не только BIOS Serial Number ? »

Будет 100%, если тип переменной такой же, как у параметра SerialNumber (string), твой пример заточен именно под получение значений строковых параметров
Подставь, например, Manufacturer или Name за место SerialNumber и получишь значения производителя и версии BIOS

Все доступные параметры можешь посмотреть на страничке Win32_BIOS class, также можешь использовать другой класс (Win32_BaseBoard, Win32_Processor и т.д.) для получения инфы о другом железе

MKN 19-08-2015 17:18 2543603

Цитата:

Цитата K.A.V.
Подставь, например, Manufacturer или Name за место SerialNumber и получишь значения производителя и версии BIOS »

Ничего не получаю... Вернее при любом раскладе одно и то же :
BIOS Serial Number=failed to get: -2147217406
И при Manufacturer, и при Name ...

K.A.V. 19-08-2015 17:28 2543608

Цитата:

Цитата MKN
Ничего не получаю... Вернее при любом раскладе одно и то же :
BIOS Serial Number=failed to get: -2147217406
И при Manufacturer, и при Name ... »

У меня твой код работает и в Win7 и в Win10, может, где-то ошибся?
Там в двух местах нужно заменять
Скрытый текст

Код:

; Display BIOS serial number

OutFile "bios_sn.exe"

!include "LogicLib.nsh"

!define CLSCTX_INPROC_SERVER 1
!define CLSID_WbemLocator {4590f811-1d3a-11d0-891f-00aa004b2e24}
!define IID_IWbemLocator {dc12a687-737f-11cf-884d-00aa004b2e24}

!define RPC_C_AUTHN_LEVEL_DEFAULT  0
!define RPC_C_IMP_LEVEL_IMPERSONATE 3

!define EOAC_NONE                  0

!define WBEM_FLAG_FORWARD_ONLY      0x20
!define WBEM_FLAG_RETURN_IMMEDIATELY 0x10
!define WBEM_INFINITE                0xffffffff

; Query BIOS serial number via WMI and return it in $0
Function bios_sn
  ; Save registers
  Push $1
  Push $2
  Push $3
  Push $4
  Push $5
  Push $6
  Push $7

  ; Initialization of COM is done via OleInitialize in NSIS installer code
  ; Set general COM security level
  System::Call "ole32::CoInitializeSecurity( \\
        i 0, i -1, i 0, i 0, i ${RPC_C_AUTHN_LEVEL_DEFAULT}, \\
        i ${RPC_C_IMP_LEVEL_IMPERSONATE}, i 0, i ${EOAC_NONE}, i 0) i.r1"
  ${If} $1 != 0
    StrCpy $0 "failed to initialize security: $1"
    Goto bios_sn_end
  ${EndIf}
 
  ; Create IWbemLocator interface
  System::Call "ole32::CoCreateInstance( \\
        g '${CLSID_WbemLocator}', i 0, \\
        i ${CLSCTX_INPROC_SERVER}, \\
        g '${IID_IWbemLocator}', *i .r2) i.r1"
  ${If} $1 != 0
    StrCpy $0 "failed to create IWebmLocator object: $1"
    Goto bios_sn_end
  ${EndIf}

  ; Call IWbemLocator->ConnectServer
  System::Call "$2->3(w 'ROOT\CIMV2', i 0, i 0, i 0, i 0, i 0, i 0, *i .r3) i.r1"

  ${If} $1 != 0
    StrCpy $0 "failed to connect: $1"
  ${Else}
    ; Call IWbemServices->ExecQuery 
    System::Call "$3->20(w 'WQL', w 'Select Name from Win32_BIOS', \\
        ${WBEM_FLAG_FORWARD_ONLY} | ${WBEM_FLAG_RETURN_IMMEDIATELY}, \\
        i 0, *i .r4) i.r1"

    ${If} $1 != 0
        StrCpy $0 "failed to query: $1 $3"
    ${Else}
        ; Call IEnumWbemClassObject->Next
        System::Call "$4->4(i ${WBEM_INFINITE}, i 1, *i .r5, *i .r6) i.r1"
        ${If} $1 != 0
            StrCpy $0 "failed to iterate: $1"
        ${Else} 
            ${If} $6 > 0
                ; Variant
                ; (unsigned short vt, WORD wReserved1, 
                ;  WORD wReserved2, WORD wReserved3, BSTR bstrVal)
                ; Allocate memory for Variant
                System::Call "*(i 0, i 0, i 0) i.r7"
                ; Call IWbemClassObject->Get
                System::Call "$5->4(w 'Name', i 0, i r7, i 0, i 0) i.r1"
                ${If} $1 < 0
                    StrCpy $0 "failed to get: $1"
                ${Else} 
                    ; Access bstrVal from Variant
                    System::Call "*$7(i, i, w .r0)"
                    System::Call "ole32::VariantClear(i r7)"
                ${EndIf}
                ; Free memory associated with Variant
                System::Free $7
            ${Else}
                StrCpy $0 "failed: no items ***91;$6***93;"
            ${EndIf}
            ; Call IWbemClassObject->Release
            System::Call "$5->2()"
        ${EndIf}
        ; Call IEnumWbemClassObject->Release
        System::Call "$4->2()"
    ${EndIf}

    ; Call IWbemService->Release
    System::Call "$3->2()"
  ${EndIf}

  ; Call IWbemLocator->Release
  System::Call "$2->2()"

bios_sn_end:
  ; Restore registers
  Pop $7
  Pop $6
  Pop $5
  Pop $4
  Pop $3
  Pop $2
  Pop $1
FunctionEnd

Function .onInit
  InitPluginsDir
  Call bios_sn
  MessageBox MB_OK "BIOS Serial Number=$0"
  Quit
FunctionEnd

Section 
SectionEnd


MKN 19-08-2015 17:32 2543610

Цитата:

Цитата K.A.V.
Там в двух местах нужно заменять »

точно, в двух... Спасибо за подсказку.

kotkovets 19-08-2015 17:38 2543613

MKN, можно и так )
Скрытый текст
Код:

OutFile "bios_sn.exe"
!include "LogicLib.nsh"

!macro IWbemClassObject->Get NameObject OUT
    System::Call "*(i,i,i)i.R4"
    System::Call "$R3->4(w'${NameObject}',i0,iR4,i0,i0)"
    System::Call "*$R4(i.R6,i,i.R5)"
    StrCmp $R6 3 0 +2
    IntFmt $R5 %u $R5
    StrCmp $R6 8 0 +2
    !ifdef NSIS_UNICODE
      IntFmt $R5 %s $R5
    !else
      IntFmt $R5 %S $R5
    !endif
    System::Call "ole32::VariantClear(iR4)"
    System::Free $R4
    StrCpy ${OUT} $R5
!macroend

Section
  System::Call "ole32::CoInitializeEx(i0,i2)"
  System::Call "ole32::CoCreateInstance(g'{4590f811-1d3a-11d0-891f-00aa004b2e24}',i0,i1,g'{dc12a687-737f-11cf-884d-00aa004b2e24}',*i.R0)i.R7"
  ${If} $R7 == 0
      System::Call "ole32::CoInitializeSecurity(i0,i-1,i0,i0,i2,i3,i0,i0,i0)"
      System::Call "$R0->3(w'root\CIMV2',i0,i0,i0,i0,i0,i0,*i.R1)i.R7"
      ${If} $R7 == 0
        System::Call "$R1->20(w'WQL', w'SELECT * FROM Win32_BIOS',i48,i0,*i.R2)i.R7"
        System::Call "$R2->4(i0xffffffff,i1,*i.R3,*i)i.R7"
        ${If} $R7 == 0
              !insertmacro IWbemClassObject->Get "Version" $7
                      MessageBox MB_OK "Version=$7"
                                !insertmacro IWbemClassObject->Get "Manufacturer" $7
                                    MessageBox MB_OK "Manufacturer=$7"
                                !insertmacro IWbemClassObject->Get "Name" $7
                                    MessageBox MB_OK "Name=$7"
                                !insertmacro IWbemClassObject->Get "SMBIOSBIOSVersion" $7
                                    MessageBox MB_OK "SMBIOSBIOSVersion=$7"                                                       
              System::Call "$R0->2()"
              System::Call "$R1->2()"
              System::Call "$R2->2()"
              System::Call "$R3->2()"
        ${Else}
            System::Call "$R0->2()"
            System::Call "$R1->2()"
            System::Call "$R2->2()"
        ${EndIf}
      ${Else}
        System::Call "$R0->2()"
        System::Call "$R1->2()"
      ${EndIf}
  ${EndIf}
SectionEnd


MKN 19-08-2015 18:17 2543621

Возвращаясь к имитации метро фейса...
При использовании WndProc.dll наблюдается такой не приятный момент. При быстром наведении курсора, то на одно изображение, то на другое - оба изображения могут выделиться (замениться на другое изображение) одновременно...
И ещё про курсор-ладошку... При перемещении курсора вне изображений , курсор очень быстро, но глазом заметно, изменяется-мельтешит, превращаясь из стрелки в ладошку и обратно...

Как бы преодолеть эти неприятные мелочи ? Код такой (дока к плагину не нашёл, может что не так и делаю... ) :
Пример кода

Код:

!include MUI2.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE Russian
OutFile ClickPict_WndProc.exe

Var Dialog
Var Image
Var Image2

Page custom nsDialogsPage

Function .onInit
    InitPluginsDir
    File /ONAME=$PLUGINSDIR\Vinni.bmp Vinni.bmp
        File /ONAME=$PLUGINSDIR\Vinni2.bmp Vinni2.bmp
FunctionEnd

Function nsDialogsPage
nsDialogs::Create /NOUNLOAD 1018
Pop $Dialog
GetFunctionAddress $0 MainWndSubProc
WndProc::onCallback /r=1 $Dialog $0
 
${NSd_CreateBitmap} 0 0 100% 100% ''
Pop $Image
${NSD_SetImage} $Image '$PLUGINSDIR\Vinni.bmp' $1
GetFunctionAddress $0 ImgeSubProc
WndProc::onCallback /r=1 $Image $0
${NSD_AddStyle} $Image ${SS_NOTIFY}
${NSD_OnClick} $Image Click1

${NSd_CreateBitmap} 90 0 100% 100% ''
Pop $Image2
${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni.bmp' $1
GetFunctionAddress $0 ImgeSubProc2
WndProc::onCallback /r=1 $Image2 $0
${NSD_AddStyle} $Image2 ${SS_NOTIFY}
${NSD_OnClick} $Image2 Click2

nsDialogs::show
FunctionEnd

; Сообщение  WM_NCHITTEST отправляется в окно тогда, когда перемещается курсор, или когда кнопка мыши нажимается или отпускается.
; Если мышь не захвачена, сообщение отправляется в окно под курсором. В противном случае, сообщение отправляется в окно, которое захватило мышь.
; Окно получает это сообщение через посредство своей функции WindowProc.

Function ImgeSubProc  ; навели курсор
System::Call USER32::LoadCursor(i,i32649)i.s
System::Call USER32::SetCursor(is)
${If} $2 = ${WM_NCHITTEST}
${NSD_SetImage} $Image '$PLUGINSDIR\Vinni2.bmp' $1
${EndIf}
FunctionEnd

Function ImgeSubProc2
System::Call USER32::LoadCursor(i,i32649)i.s
System::Call USER32::SetCursor(is)
${If} $2 = ${WM_NCHITTEST}
${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni2.bmp' $1
${EndIf}
FunctionEnd

Function MainWndSubProc 
${If} $2 = ${WM_NCHITTEST}
${NSD_SetImage} $Image '$PLUGINSDIR\Vinni.bmp' $1
${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni.bmp' $1
${EndIf}
FunctionEnd

Function Click1
MessageBox MB_OK "Click1"
FunctionEnd

Function Click2
MessageBox MB_OK "Click2"
FunctionEnd

Section
SectionEnd


K.A.V. 20-08-2015 15:51 2543947

Скрытый текст
Код:

!addplugindir "."
!include MUI2.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE Russian
OutFile ClickPict_WndProc.exe

Var Dialog
Var Image
Var Image2
var SetImage1
var SetImage2
Page custom nsDialogsPage

Function .onInit
    InitPluginsDir
    File /ONAME=$PLUGINSDIR\Vinni.bmp Vinni.bmp
    File /ONAME=$PLUGINSDIR\Vinni2.bmp Vinni2.bmp
FunctionEnd

Function nsDialogsPage
nsDialogs::Create /NOUNLOAD 1018
Pop $Dialog
GetFunctionAddress $0 MainWndSubProc
WndProc::onCallback /r=1 $Dialog $0
 
${NSd_CreateBitmap} 0 0 100% 100% ''
Pop $Image
${NSD_SetImage} $Image '$PLUGINSDIR\Vinni.bmp' $1
GetFunctionAddress $0 ImgeSubProc
WndProc::onCallback /r=1 $Image $0
${NSD_AddStyle} $Image ${SS_NOTIFY}
${NSD_OnClick} $Image Click1

${NSd_CreateBitmap} 90 0 100% 100% ''
Pop $Image2
${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni.bmp' $1
GetFunctionAddress $0 ImgeSubProc2
WndProc::onCallback /r=1 $Image2 $0
${NSD_AddStyle} $Image2 ${SS_NOTIFY}
${NSD_OnClick} $Image2 Click2

nsDialogs::show
FunctionEnd

; Сообщение  WM_NCHITTEST отправляется в окно тогда, когда перемещается курсор, или когда кнопка мыши нажимается или отпускается.
; Если мышь не захвачена, сообщение отправляется в окно под курсором. В противном случае, сообщение отправляется в окно, которое захватило мышь.
; Окно получает это сообщение через посредство своей функции WindowProc.

Function ImgeSubProc  ; навели курсор 
${If} $2 = ${WM_MOUSEMOVE}   
System::Call USER32::LoadCursor(i,i32649)i.s
System::Call USER32::SetCursor(is)
${NSD_SetImage} $Image '$PLUGINSDIR\Vinni2.bmp' $1 
 StrCpy $SetImage1 1
${EndIf}
FunctionEnd

Function ImgeSubProc2
${If} $2 = ${WM_MOUSEMOVE} 
System::Call USER32::LoadCursor(i,i32649)i.s
System::Call USER32::SetCursor(is)
${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni2.bmp' $1 
  StrCpy $SetImage2 1
${EndIf}
FunctionEnd

Function MainWndSubProc 
${If} $2 = ${WM_MOUSEMOVE}
  ${If} $SetImage1 = 1
    ${NSD_SetImage} $Image '$PLUGINSDIR\Vinni.bmp' $1
    StrCpy $SetImage1 0
  ${EndIf}
  ${If} $SetImage2 = 1
    ${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni.bmp' $1
    StrCpy $SetImage2 0
  ${EndIf}
${EndIf}
FunctionEnd

Function Click1
MessageBox MB_OK "Click1"
FunctionEnd

Function Click2
MessageBox MB_OK "Click2"
FunctionEnd

Section
SectionEnd



Цитата:

Цитата MKN
При быстром наведении курсора, то на одно изображение, то на другое - оба изображения могут выделиться (замениться на другое изображение) »

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

Цитата:

Цитата MKN
При перемещении курсора вне изображений , курсор очень быстро, но глазом заметно, изменяется-мельтешит, превращаясь из стрелки в ладошку и обратно »

Ну так, смотри внимательней на свой код, у тебя команда установки курсора находится перед проверкой на перемещение мыши

В код добавил 2 переменные $SetImage1 и $SetImage2, которые используются для того, чтобы постоянно не присваивать изображения элементам (происходит быстрое мерцание из-за постоянного перемещения мыши и присваивания изображений) в функции MainWndSubProc, возможно, можно обойтись без переменных и как-то поиграться с WM_SETREDRAW - оставлю это тебе

p.s.
Насчет своих изображений кнопкам, есть же плагин SkinnedButton plug-in, если у тебя будут кнопки одного типа - думаю, лучше этим плагом воспользоваться
Кстати, вот можешь скачать архивчик с GitHub, там примеры своего интерфейса с парой интересных плюшек + свои мессаджбоксы со своим стилем, я сам в этом не разбирался, посмотрел мельком гугля инфу по твоему плагу WndProc

Kopejkin 20-08-2015 21:59 2544107

Цитата:

Цитата Из справочника по NSIS
Склеиваем 2 текстовых файла
Для того, чтобы содержимое одного файла приклеить к другому, используем команду:
${FileJoin} "Файл 1" "Файл 2" "Выходной файл"

По-моему, файловая инструкция FileJoin не поддерживается в NSIS 2.46 и выше...

K.A.V. 20-08-2015 22:34 2544128

Цитата:

Цитата Kopejkin
По-моему, файловая инструкция FileJoin не поддерживается в NSIS 2.46 и выше... »

эм...с чего бы это?
В начале кода не забыли добавить?
Код:

!include "TextFunc.nsh"

Kopejkin 21-08-2015 09:24 2544214

Цитата:

Цитата K.A.V.
...не забыли »

А я и не знал.. :sorry:
В Справочнике по NSIS об этом ни гу-гу.

Serg866 23-08-2015 22:51 2545142

Ребята, привет.
У меня вопрос по плагину md5
Как заставить его выполнить такую задачу:
нужно чтобы в проверке на оригинальность файла участвовало две хэш-суммы, а не одна.
Ну то есть предположим первая хеш-сумма проверяемого файла не совпадает, тогда идёт проверка на вторую хеш-сумму. Если и она не совпадает - прерывание установки и сообщение, мол версия файла неправильная.
Надеюсь поможете... А то очень понадобилось реализовать такой вариант. Дело в том что в разных версиях моей программы один и тот же файл имеет разные размеры. Вот и нужно чтобы последнее обновление можно было установить на все предыдущие версии программы.

K.A.V. 24-08-2015 00:03 2545152

Цитата:

Цитата Kopejkin
В Справочнике по NSIS об этом ни гу-гу. »

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

Цитата:

Цитата Serg866
нужно чтобы в проверке на оригинальность файла участвовало две хэш-суммы, а не одна.
Ну то есть предположим первая хеш-сумма проверяемого файла не совпадает, тогда идёт проверка на вторую хеш-сумму. Если и она не совпадает - прерывание установки и сообщение, мол версия файла неправильная.
Надеюсь поможете... А то очень понадобилось реализовать такой вариант. Дело в том что в разных версиях моей программы один и тот же файл имеет разные размеры. Вот и нужно чтобы последнее обновление можно было установить на все предыдущие версии программы. »

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

Код:

md5dll::GetFileMD5 "путь к проверяемому файлу"
Pop $0

${If} $0 != "ad190d8c280f3ebea9cee3aa4514fdc3" ; хеш-сумма первой версии файла
${AndIf} $0 != "cf61b549c003fd4a0274832f4087f92f" ; хеш-сумма второй версии файла
    MessageBox MB_OK "Ошибка при проверке хеш суммы, файл испорчен"
    quit
${EndIf}


Kopejkin 24-08-2015 00:11 2545154

Вложений: 1
Цитата:

Цитата K.A.V.
...не все мелочи там указаны... »

Как бы, название Справочник подразумевает отсутствие не указания таких мелочей.
Цитата:

Цитата K.A.V.
откройте.., найдите... и посмотрите..»

Мы, ламеры, этого не любим...

Цитата:

Цитата Serg866
...по плагину md5

О, K.A.V. меня опередил.
То же самое хотел предложить. А, пусть остается! Что я, зря пыхтел ;)
Например, так...
читать далее

Код:


!include "MUI2.nsh"

!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW CheckFile
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Caption "Check My Prog"
Name "My Prog"
OutFile "check-my-prog.exe"

InstallDir "$DESKTOP\TEST\"
RequestExecutionLevel admin

Section
SectionEnd

Function CheckFile
; Проверка версии файла:
  StrCpy $0 "$INSTDIR\my-prog.exe"
      md5dll::GetMD5File "$0"
      Pop $R1
      StrCpy $1 $R1

  ${If} $1 == b81255bd3b534b7453f285ffed22ae3b      ; Если исходный файл - версия 1
                  MessageBox MB_OK "Найден исходный файл - версия 1" IDOK Done
         
  ${ElseIf} $1 == 304cd644be40cbb8d2a115aef6f2c5ec    ; Если версия 2
                  MessageBox MB_OKCANCEL "Найдена программа версии 2.    $\n$\n\
                                        Чтобы продолжить, нажмите 'ОК'  $\n\
                                        Для выхода нажмите 'Отмена'" IDCANCEL Done
                                 
                  MessageBox MB_OK "Была нажата кнопка ОК." IDOK Done
                                 
  ${ElseIf} $1 == abaf0a548b8971d6185e291c800e516b    ; Если версия 3
                  MessageBox MB_OK|MB_ICONSTOP| "Найдена программа версии 3."  IDOK
  ${Else}                                              ; Если нет совпадений
                  MessageBox MB_OK|MB_ICONSTOP| "В папке TEST нет нифига... $\n\
                                                Нужно выбрать папку с номером" IDOK
          Done:
          Quit      ; Прерывание работы (ВЫХОД) после нажатия кнопки ОК или Отмена.
    ${EndIf}
FunctionEnd


В архиве CheckMyProg.zip лежит сценарий и файлы для проверки работы. Исполняемые файлы в папках - TXT-файлы с измененными расширениями.

MKN 25-08-2015 17:27 2545895

Обнаружилось следующее недоразумение :
Если скомпилировать скрипт, с bmp картинкой на кнопке, в Windows 7, то при запуске этого скомпилированного exe в Windows 10 - картинка на кнопке почему то отсутствует...
И наоборот - если скомпилировать скрипт с картинкой на кнопке, в Windows 10, то в Windows 7 картинки нет...
При компиляции и запуске скрипта в одноименных ОС - всё ОК.

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

OutFile "test.exe"
!include "MUI2.nsh"
Page Custom MyPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

var dlg
var Button
Var IMAGE

Function .onInit
    InitPluginsDir
    File /ONAME=$PLUGINSDIR\nsis.bmp "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp"
FunctionEnd

Function MyPage
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateButton} 100u 20u 157 57 ''
Pop $Button
${NSD_OnClick} $Button ButtonClick
${NSD_AddStyle} $Button "${BS_BITMAP}"
System::Call 'user32::LoadImage(i 0, t "$PLUGINSDIR\nsis.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s'
Pop $IMAGE
SendMessage $Button ${BM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE

nsDialogs::Show
System::Call "gdi32::DeleteObject(i$IMAGE)"
FunctionEnd

Function ButtonClick
MessageBox MB_OK "ButtonClick"
FunctionEnd

Section
SectionEnd

Чтобы это значило ? ( Причём, с иконкой-картинкой на кнопке - всё ОК, т.е. обратно совместимо на всех ОС )
NSIS - 3.0b2

K.A.V. 25-08-2015 18:41 2545924

Цитата:

Цитата MKN
Обнаружилось следующее недоразумение :
Если скомпилировать скрипт, с bmp картинкой на кнопке, в Windows 7, то при запуске этого скомпилированного exe в Windows 10 - картинка на кнопке почему то отсутствует...
И наоборот - если скомпилировать скрипт с картинкой на кнопке, в Windows 10, то в Windows 7 картинки нет... »

Ничего подобного, у меня всё ок...Что у тебя за волшебство постоянно в разных системах - не знаю :)

Dodakaedr 25-08-2015 21:12 2545968

Проблема с куском кода.
Скрытый текст
Код:

IfFileExists "$EXEDIR\cfg.cfg" ext dis
        ext:
        ReadINIStr $0 "$EXEDIR\cfg.cfg" "test" "Lang"
        StrCmp $0 "Rus" 0 +3
        ExecWait "$EXEDIR\MyProg Rus.exe"
        goto next
        StrCmp $0 "Eng" 0 +3
        ExecWait "$EXEDIR\MyProg.exe"
        goto next
        MessageBox MB_OK "бла-бла"
        quit
        dis:
        WriteINIStr "$EXEDIR\cfg.cfg" "test" "Lang" "Rus"
        goto ext
next:
....


Правильно ли я сделал чтение значения параметра и сравнил их? Проблема в том, что не запускается MyProg Rus.exe, постоянно запускается MyProg.exe не зависимо от значения параметра.

P.S. Разобрался! Проблема была в названии программы.

MKN 26-08-2015 10:45 2546088

Цитата:

Цитата K.A.V.
Что у тебя за волшебство постоянно в разных системах »

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

Dodakaedr 26-08-2015 16:19 2546252

Как с помощью плагина winver2 сделать следующее:
Если версия ОС =>6.0, то выполнить одно действие а если меньше 6.0 то другое. Как создать такое условие?

K.A.V. 26-08-2015 16:34 2546258

Цитата:

Цитата Dodakaedr
Как с помощью плагина winver2 сделать следующее:
Если версия ОС =>6.0, то выполнить одно действие а если меньше 6.0 то другое. Как создать такое условие? »

Может, вы уже начнёте справочник читать?
Статьи => Логические конструкции
Примеры кодов => Умное сравнение версий файлов

Dodakaedr 26-08-2015 17:00 2546276

K.A.V., Регистрация dll провожу через команду RegDLL, а дерегистрацию как сделать? Есть противоположная команда? В справке не нашел.

Begin2Fly 26-08-2015 17:04 2546279

Цитата:

Цитата Dodakaedr
K.A.V., Регистрация dll провожу через команду RegDLL, а дерегистрацию как сделать? Есть противоположная команда? В справке не нашел. »

В шапке находится переведённое на русский язык руководство пользователя. Перевод – Поляков А.В, зеркало
Пункты 4.9.3.13, 4.9.3.14. Не ленитесь.

kotkovets 26-08-2015 17:31 2546289

Цитата:

Цитата Dodakaedr
RegDLL, а дерегистрацию как сделать? Есть противоположная команда? »

unregdll

K.A.V. 26-08-2015 19:19 2546316

Цитата:

Цитата Dodakaedr
K.A.V., Регистрация dll провожу через команду RegDLL, а дерегистрацию как сделать? Есть противоположная команда? В справке не нашел. »

Кстати, RegDLL/UnRegDLL не работают в x64-системах, для корректной регистрации библиотеки в x64-системе, нужно вызывать regsvr32, все об этом знают?
Это было выявлено уже не помню как, либо здесь кто-то об этом говорил, либо мне кто-то репорт кидал, когда создаваемые SFX архивы через мой креатор не регистрировали dll, либо я сам это обнаружил :)
Возможно, этот баг уже исправили и всё наладили в новой сборке NSIS, пока не было времени тестировать (а может, моя личная dll написана криво, на которой тестил :biggrin:)
В любом случае, проверьте, регистрирует ли новая сборка NSIS библиотеки через эти команды, а если нет - пользуйтесь логической конструкцией, например, я буду пользоваться в своём SFX Creator таким кодом для регистрации библиотек:

Сохраняем в переменную $IsWow64Process тип системы (если значение 1 = 64 бита)
Код:

Function .onInit
Var /Global IsWow64Process
  System::Call kernel32::GetCurrentProcess()i.s
  System::Call kernel32::IsWow64Process(is,*i.s)
  Pop $IsWow64Process
FunctionEnd

Для регистрации использовать так
Код:

${If} $IsWow64Process == "1"
  ExecWait 'regsvr32 /s "$TEMP\MyDll.dll"'
${Else}
  RegDLL "$TEMP\MyDll.dll"
${EndIf}

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

${If} $IsWow64Process == "1"
  ExecWait 'regsvr32 /u /s "$TEMP\MyDll.dll"'
${Else}
  UnRegDLL "$TEMP\MyDll.dll"
${EndIf}


Можно загнать всё в макросы для более удобного использования:
Скрытый текст


В начале кода:
Код:

!define MyRegDLL "!insertmacro MyRegDLL"
!macro MyRegDLL _FILE_
${If} $IsWow64Process == "1"
  ExecWait 'regsvr32 /s "${_FILE_}"'
${Else}
  RegDLL "${_FILE_}"
${EndIf}
!macroend   
 
!define MyUnRegDLL "!insertmacro MyUnRegDLL"
!macro MyUnRegDLL _FILE_
${If} $IsWow64Process == "1"
  ExecWait 'regsvr32 /u /s "${_FILE_}"'
${Else}
  UnRegDLL "${_FILE_}"
${EndIf}
!macroend

Не забудьте получить тип системы:
Код:

Function .onInit
Var /Global IsWow64Process
  System::Call kernel32::GetCurrentProcess()i.s
  System::Call kernel32::IsWow64Process(is,*i.s)
  Pop $IsWow64Process
FunctionEnd

Для регистрации использовать так
Код:

${MyRegDLL} "$TEMP\MyDll.dll"
Для отмены регистрации использовать так
Код:

${MyUnRegDLL} "$TEMP\MyDll.dll"
Не тестировал, но вроде всё правильно написал

Dodakaedr 26-08-2015 20:24 2546337

Проблема с LogicLib.nsh. Не работает пример из справки
Код:

OutFile "test.exe"
!include "Logiclib.nsh"

Section
StrCpy $0 "7"
${If} $0 => 5
    MessageBox MB_OK "$0=>5"
${EndIf}
SectionEnd

Ошибка

Версия nsis 3.0a2. В чем может быть проблема?

K.A.V. 26-08-2015 20:38 2546343

Ответ

Serg866 27-08-2015 08:57 2546419

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

В общем веду неравный бой с торрентами. Дело в том, что мою программу выкладывают там, и авторы раздач зачастую сами не понимают какие версии грузят, т.к программа постоянно обновляется. Так вот хочу спросить, как прикрыть или ограничить подобную лавочку? Чтобы программу качали с официального сайта, а не с торрентов. Быть может реализовать одноразовые ключи и выдавать их только тем, кто загрузил программу с официального сайта. Но я не знаю как отладить такую схему... Есть ли у вас мнение насчёт этого вопроса?
Спасибо!

K.A.V. 27-08-2015 14:07 2546538

Цитата:

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

Причем здесь NSIS, т.е. пакет инсталлятора? Ваша программа полностью на NSIS написана? Что помешает пользователю скопировать ключ с официального сайта и вставить в описание раздачи?
Запихните в главный файл проверку контрольных сумм файлов программы, чтобы все компоненты были нужной версии, если написана программа не на NSIS - сделайте эту проверку в отдельном потоке, чтобы сделать проверку незаметной для пользователя

Kopejkin 28-08-2015 23:52 2547123

Подскажите, как нужно записать, чтобы папка с файлами устанавливалась на общем Рабочем столе, а не на пользовательском?

Код:

InstallDir "$DESKTOP\Моя программа"

Section
  SetOutPath "$INSTDIR"
      SetShellVarContext all
        File /r "${pkgdir}\files\*"
SectionEnd

Так у меня получается установить только на пользовательский Раб.стол

K.A.V. 29-08-2015 00:05 2547127

Цитата:

Цитата Kopejkin
как нужно записать, чтобы папка с файлами устанавливалась на общем Рабочем столе, а не на пользовательском? »

Код:

Function .onInit
 SetShellVarContext all
 StrCpy $INSTDIR "$DESKTOP\Моя программа"
FunctionEnd


Kopejkin 29-08-2015 00:25 2547134

Цитата:

Цитата K.A.V.
Function .onInit »

Шайтан, однако :wow: Спасибо!

Serg866 29-08-2015 08:30 2547192

K.A.V.
Здравствуйте.
Подскажите, пожалуйста, как на созданной странице сделать кликабельную ссылку (без всяких плагинов типа Linker).
Ну чтобы адрес сайта преобразовывался в кликабельный.
PS: страницу создал на NSIS Dialogs
---------------

MKN 29-08-2015 09:45 2547215

Цитата:

Цитата Serg866
как на созданной странице сделать кликабельную ссылку (без всяких плагинов типа Linker). »

Клик на Label-адресе. Открытие ссылки через Shell

K.A.V. 29-08-2015 13:04 2547265

Цитата:

Цитата Serg866
как на созданной странице сделать кликабельную ссылку (без всяких плагинов типа Linker). »

Код:

${NSD_CreateLink} 0u 0u 100% 10u "Ссылка"       
Pop $0
${NSD_OnClick} $0 onClickLink

Код:

Function onClickLink
    ExecShell "open" "http://forum.oszone.net/"
FunctionEnd


K.A.V. 31-08-2015 19:51 2548002

Интересно, сколько бы я мог написать подобных "программ" на NSIS...
Ждём программку удаления файлов :)

Никто, кстати, не качал поделки автора данных постов? Троянчиков в архивах нет у него случайно?

Kopejkin 31-08-2015 22:50 2548059

Какая трудолюбивая программа!
Копирует что-то, даже если ничего не добавлять :clapping:


Sancho5555 01-09-2015 03:49 2548095

Вложений: 1
Нужен совет. Хочу сделать смену иконки на выделенном объекте.
При таком коде (Хедер SetCursor.nsh) наблюдается мерцание курсора:
Скрытый текст
Код:

!define OCR_NORMAL      32512
!define OCR_IBEAM      32513
!define OCR_WAIT        32514
!define OCR_CROSS      32515
!define OCR_UP          32516
!define OCR_SIZENWSE    32642
!define OCR_SIZENESW    32643
!define OCR_SIZEWE      32644
!define OCR_SIZENS      32645
!define OCR_SIZEALL    32646
!define OCR_NO          32648
!define OCR_HAND        32649
!define OCR_APPSTARTING 32650

!define SetSystemCursor `!insertmacro SetSystemCursor`
!macro SetSystemCursor Cursor       
System::Call USER32::LoadCursor(i,i${${Cursor}})i.s
System::Call USER32::SetCursor(is)       
!macroend

!define SetFileCursor `!insertmacro SetFileCursor`
!macro SetFileCursor File
System::Call USER32::LoadCursorFromFile(t"${File}")i.s
System::Call USER32::SetCursor(is)
!macroend


А при таком:
Скрытый текст
Код:

!define OCR_NORMAL      32512
!define OCR_IBEAM      32513
!define OCR_WAIT        32514
!define OCR_CROSS      32515
!define OCR_UP          32516
!define OCR_SIZENWSE    32642
!define OCR_SIZENESW    32643
!define OCR_SIZEWE      32644
!define OCR_SIZENS      32645
!define OCR_SIZEALL    32646
!define OCR_NO          32648
!define OCR_HAND        32649
!define OCR_APPSTARTING 32650

!macro SetCursor
 System::Call user32::SetClassLong(i${Msg},i-12,ir0)
!macroend

!define SetSystemCursor `!insertmacro SetSystemCursor`
!macro SetSystemCursor Msg Cursor
 System::Call `user32::LoadImage(i0, i ${${Cursor}}, i ${IMAGE_CURSOR}, i 0, i 0, i ${LR_SHARED}) i.r0`
 Push ${Msg}
 !insertmacro SetCursor
!macroend

!define SetFileCursor `!insertmacro SetFileCursor`
!macro SetFileCursor Msg File
 System::Call `user32::LoadImage(i0, t "${File}", i ${IMAGE_CURSOR}, i 0, i 0, i ${LR_LOADFROMFILE}) i.r0`
 Push ${Msg}
 !insertmacro SetCursor
!macroend


происходит применение курсора на все объекты одного класса. Например на кнопку или BMP картинку.
Вот сам код:
Скрытый текст
Код:

Name "Test"
OutFile "test.exe"

!include MUI2.nsh
!include SetCursor.nsh
!insertmacro MUI_LANGUAGE Russian

Var hCtl
Var Button1
Var Button2
Var Bitmap1
Var Bitmap1_hImage
Var Label1

Page custom Create

Function Create
 
  nsDialogs::Create 1044
  Pop $hCtl
  ${If} $hCtl == error
    Abort
  ${EndIf}
  ${SetSystemCursor} $hCtl OCR_NO
       
       
  ${NSD_CreateButton} 82u 46u 49u 14u "1"
  Pop $Button1
  ${SetSystemCursor} $Button1 OCR_HAND
       
  ${NSD_CreateButton} 180u 46u 49u 14u "2"
  Pop $Button2
       
  ${NSD_CreateLabel} 113u 84u 65u 14u "Проверка"
  Pop $Label1
 
  ${NSD_CreateBitmap} 7u 7u 57u 53u ""
  Pop $Bitmap1
  File "/oname=$PLUGINSDIR\3.bmp" "3.bmp"
  ${NSD_SetImage} $Bitmap1 "$PLUGINSDIR\3.bmp" $Bitmap1_hImage
  ${SetFileCursor} $Bitmap1 `$EXEDIR\cursor1.cur`
       
  nsDialogs::Show $hCtl
FunctionEnd

Section
SectionEnd


K.A.V. 01-09-2015 03:55 2548096

Цитата:

Цитата Kopejkin
Какая трудолюбивая программа!
Копирует что-то, даже если ничего не добавлять »

Такая трудолюбивая, что искусственно себе "перерывы на чай" делает:
Код:

  MessageBox MB_YESNO|MB_USERICON $(LSTR_56) IDYES label_1919 IDNO label_1925    ;  "The files ($3) already exists.$\n$\nClick $\"Yes$\" and rename the files of (Backup.$3).$\n$\nClick $\"No$\" and delete the files ($3)"
label_1919:
  Rename $_26_\$3 $_26_\Backup.$3 ;  $_26_\$3->$_26_\Backup.$3
  ShowWindow $_21_ ${SW_HIDE}
  SendMessage $_21_ ${WM_SETTEXT} 0 "STR:- $_38_ - $(LSTR_57)"    ;  "Renamed successfully"
  SetCtlColors $_21_ 0x32CD32 transparent
  ShowWindow $_21_ ${SW_SHOW}
  Sleep 1000
label_1925:
  Delete $_26_\$3
  ShowWindow $_21_ ${SW_HIDE}
  SendMessage $_21_ ${WM_SETTEXT} 0 "STR:- $_38_ - $(LSTR_58)"    ;  "Successfully removed"
  SetCtlColors $_21_ 0x32CD32 transparent
  ShowWindow $_21_ ${SW_SHOW}
  Sleep 1000
  Goto label_1933
label_1932:
  StrCmp $0 0 0 label_1933
label_1933:

  ShowWindow $_21_ ${SW_HIDE}
  SendMessage $_21_ ${WM_SETTEXT} 0 "STR:- $(LSTR_59)"    ;  "Copied $_38_. Please wait..."
  SetCtlColors $_21_ 0x32CD32 transparent
  ShowWindow $_21_ ${SW_SHOW}
  Banner::show /NOUNLOAD /set 76 $(LSTR_59) $(LSTR_60)    ;  "Copied $_38_. Please wait..." "Please wait..."
    ; Call Initialize_____Plugins
    ; File $PLUGINSDIR\Banner.dll
    ; SetDetailsPrint lastused
    ; Push $(LSTR_60)    ;  "Please wait..."
    ; Push $(LSTR_59)    ;  "Copied $_38_. Please wait..."
    ; Push 76
    ; Push /set
    ; CallInstDLL $PLUGINSDIR\Banner.dll /NOUNLOAD show
  ClearErrors
  SetOutPath $_26_
  CopyFiles /SILENT $_29_ $_26_    ; $(LSTR_7)$_26_    ;  "Copy to "
  Banner::destroy

Особенно забавно в его коде смотрится картина с меткой label_1933 :)

Цитата:

Цитата Sancho5555
наблюдается мерцание курсора: »

Тёмный лес с этим курсором в NSIS, как мы недавно здесь выяснили с MKN, спроси у него, может он чего добился (буквально страницу-две назад с этой проблемой воевали)

Serg866 01-09-2015 13:47 2548248

K.A.V.
приветствую
ещё такой вопрос возник - как скрыть содержимое инсталлятора от глаз архиваторов, в частности 7zip? Тут уже этот вопрос поднимался, но решения не нашли толкового, кто-то писал что можно это сделать средствами непосредственно НСИС, но способ не показал. Также программу какую-то выкладывали, но как-то не доверяю я таким программам. они неизвестно что вшивают в установщик.

Алгоритм сжатия LZMA Solid использую

K.A.V. 01-09-2015 14:59 2548286

Цитата:

Цитата Serg866
ещё такой вопрос возник - как скрыть содержимое инсталлятора от глаз архиваторов, в частности 7zip? Тут уже этот вопрос поднимался, но решения не нашли толкового, кто-то писал что можно это сделать средствами непосредственно НСИС, но способ не показал »

http://nsis.sourceforge.net/Can_I_de...ting_installer
Отвечу вам тоже самое, что отвечаю на такие вопросы в личке.

Я ранее сильно не заморачивался этим вопросом и первое, на что наткнулся - http://samforum.org/showthread.php?t=30452
Это и использовал в своём SFX Creator, но потом отказался по причине, которая описана мной в той теме
Вроде как ссылаются на плагин DcryptDll для защиты файлов в инсталляторе, но опять же - лично сам ничего не пробовал, примерчики там вроде есть, как и в составе любого плагина...

Цитата:

Цитата Serg866
они неизвестно что вшивают в установщик. »

Насчет Xexecute Hide - она только меняет парочку байт и всё (ничего не вшивает "левого"), но у неё есть проблема, описанная мной в теме на форуме samforum, насчет других программ ничего не скажу, не знаю о других

Насчет "средствами NSIS" - способ описан на страничке "Can I decompile an existing installer?" по первой ссылке.
Я добился такого эффекта (запрет на просмотр содержимого архиваторами) своей сборкой NSIS и буду использовать её в новой версии SFX Creator, выкладывать эту сборку я не буду по причине того, что она будет частью SFX Creator, у кого есть сильное желание - копайтесь в исходниках NSIS и добьётесь того, что вам нужно.

Serg866 01-09-2015 15:15 2548290

K.A.V.
спасибо.
Ну то что программуля крошит деинсталлятор не так страшно, достаточно деинсталлятор создать заранее и включить в дистрибутив программы наравне с другими файлами.
А вот то что она требует отключения CRC мне что-то не нравится, получается кто-то может что-то поменять внутри установщика и он запустится как родной.
Второй способ я не понял, сложновато для новичка типа меня.
------
И ещё возвращаясь к своему вопросу про добавление ссылки на созданной странице,
Ваш пример скрипта сработал! Благодарю.
Но решил обновить НСИС до последней версии и цвет ссылки почему-то такой стал:

в предыдущих версия был тёмно-синий, а сейчас побледнел.
Можно ли поменять этот цвет?

MKN 01-09-2015 15:23 2548294

Цитата:

Цитата Serg866
Можно ли поменять этот цвет? »

цвет, фон, шрифт...
Код:

${NSD_CreateLink} 16u 15u 100u 30u " oszone.net "
Pop $1
CreateFont $2 "Arial" 18
SendMessage $1 ${WM_SETFONT} $2 0
SetCtlColors $1 0xff5500 0xffff00
;или
;SetCtlColors $1 0xff5500 transparent


MKN 01-09-2015 17:35 2548327

Интересно, возможно ли убрать рамку-окантовку вокруг текста, которая появляется при клике на линке ?

K.A.V. 01-09-2015 18:39 2548362

Цитата:

Цитата MKN
Интересно, возможно ли убрать рамку-окантовку вокруг текста, которая появляется при клике на линке ? »

Удалить стиль WS_TABSTOP у контрола не канает? Только тогда нельзя будет перейти на него TAB'ом
Код:

${NSD_RemoveStyle} $mylink ${WS_TABSTOP}
если нет макроса NSD_RemoveStyle

Код:

!define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call"
!macro _NSD_RemoveStyle_Call CONTROL EXSTYLE
  Push `${CONTROL}`
  Push `${EXSTYLE}`
  System::Store SR1R0
  IntOp $R1 $R1 ~
  System::Call `user32::GetWindowLong(iR0,i${GWL_STYLE})i.R2`
  IntOp $R2 $R1 & $R2
  System::Call `user32::SetWindowLong(iR0,i${GWL_STYLE},iR2)`
  System::Store L
!macroend


MKN 02-09-2015 10:49 2548584

Цитата:

Цитата K.A.V.
Удалить стиль WS_TABSTOP у контрола не канает? »

Не, не канает... Рамка на месте...

kotkovets 02-09-2015 11:25 2548598

Цитата:

Цитата MKN
Не, не канает... Рамка на месте... »

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

MKN 02-09-2015 12:02 2548615

Цитата:

Цитата kotkovets
а какая цель, простое любопытство или мешает жить ? »

Ужасно не красиво, на мой взгляд появление этой рамки...

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

outfile CreateLink-test.exe

Page Custom MyPage
Page Instfiles
!include nsDialogs.nsh

Var dlg
Var Link1

Function MyPage
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateLink} 16u 15u 100u 30u " ссылка "
Pop $Link1
CreateFont $2 "Arial" 18
SendMessage $Link1 ${WM_SETFONT} $2 0
SetCtlColors $Link1 0xff5500 0xffff00
${NSD_OnClick} $Link1 ClickLink1
nsDialogs::Show
FunctionEnd
 
Function ClickLink1
MessageBox MB_OK "Click"
FunctionEnd
 
Section
SectionEnd


kotkovets 02-09-2015 16:16 2548706

Цитата:

Цитата MKN
Ужасно не красиво, на мой взгляд появление этой рамки... »

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

Sancho5555 04-09-2015 11:10 2549442

MKN, Через Label + OCR_HAND можно cделать.

ZaxBoys66 04-09-2015 14:58 2549543

# INCLUDES

!include "FileFunc.nsh"
!include "TextFunc.nsh"

OutFile "content-length_test.exe"

Section 'Size App' Main

inetc::head /silent "http://dl.7-zip.org/7z1505.exe" "$EXEDIR\File.txt"
Pop $R0
StrCmp $R0 "OK" +3
MessageBox MB_ICONEXCLAMATION "$R0.Can not be downloading!"
Goto Cancelled

StrCpy $0 0
stGet:
IntOp $0 $0 + 1
${LineRead} "$EXEDIR\File.txt" "$0" $1
IfErrors 0 +2
MessageBox MB_OK|MB_ICONSTOP "error" idok error
StrCpy $2 "$1" 16
StrCmp $2 "Content-Length: " 0 stGet
StrCpy $2 "$1" "" 16
MessageBox MB_OK|MB_ICONINFORMATION "$2"
error:

/*
${LineRead} "$EXEDIR\File.txt" "6" $1
IfErrors 0 +2
MessageBox MB_OK|MB_ICONSTOP "error" idok error
StrCpy $2 "$1" 16
StrCmp $2 "Content-Length: " +2 0
MessageBox MB_OK|MB_ICONSTOP "error" idok error
StrCpy $2 "$1" "" 16
MessageBox MB_OK|MB_ICONINFORMATION "$2"
error:
*/

Cancelled:
SectionEnd

; This file can not be read.Message error.Please help.

wolkow70 05-09-2015 17:41 2549927

На системах Windows 7,8 можно вызвать апплет "программы по умолчанию" для конкретной программы таким способом.
!define CLSCTX_INPROC_SERVER 0x1
!define CLSID_ApplicationAssociationRegistrationUI {1968106d-f3b5-44cf-890e-116fcb9ecef1}
!define IID_IApplicationAssociationRegistrationUI {1f76a169-f994-40ac-8fc8-0959e8874710}

System::Call 'OLE32::CoCreateInstance(g "${CLSID_ApplicationAssociationRegistrationUI}",i 0,i ${CLSCTX_INPROC_SERVER},g "${IID_IApplicationAssociationRegistrationUI}",*i.r1)i.r0' ;ptr is now in $1 and hr in $0
${If} $1 <> 0
System::Call '$1->3(w "название программы")i.r0'
System::Call '$1->2()' ;IUnknown::Release

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

K.A.V. 06-09-2015 08:07 2550077

Цитата:

Цитата ZaxBoys66
; How to make fileread to read only "Content-Length" »

Код:

!include "TextFunc.nsh"

OutFile "content-length_test.exe"

Section

FileOpen $0 "$EXEDIR\File.txt" W
FileWrite $0 "HTTP/1.1 200 OK"
FileWriteByte $0 "13"
FileWriteByte $0 "10"
FileWrite $0 "Date: Fri, 04 Sep 2015 07:27:00 GMT"
FileWriteByte $0 "13"
FileWriteByte $0 "10"
FileWrite $0 "Server: Apache"
FileWriteByte $4 "13"
FileWriteByte $4 "10"
FileWrite $0 "Last-Modified: Wed, 24 Apr 2013 08:27:32 GMT"
FileWriteByte $0 "13"
FileWriteByte $0 "10"
FileWrite $0 'ETag: "2b2e728-a38420-4db1712ca0d12"'
FileWriteByte $0 "13"
FileWriteByte $0 "10"
FileWrite $0 "Accept-Ranges: bytes"
FileWriteByte $0 "13"
FileWriteByte $0 "10"
FileWrite $0 "Content-Length: 10716192"
FileWriteByte $0 "13"
FileWriteByte $0 "10"
FileWrite $0 "Content-Type: application/octet-stream"
FileWriteByte $0 "13"
FileWriteByte $0 "10"
FileWrite $0 "Expires: Sat, 05 Sep 2015 07:27:00 GMT"
FileWriteByte $0 "13"
FileWriteByte $0 "10"
FileWrite $0 "Connection: keep-alive"
FileClose $0
/*
FileOpen $0 "$EXEDIR\File.txt" r
FileRead $0 $1
FileRead $0 $2 ''
FileClose $0   
MessageBox MB_OK "$1 $2"
*/

StrCpy $0 0
 stGet:
IntOp $0 $0 + 1
${LineRead} "$EXEDIR\File.txt" "$0" $1
  IfErrors 0 +2
MessageBox MB_OK|MB_ICONSTOP "error" idok error
  StrCpy $2 "$1" 16
  StrCmp $2 "Content-Length: " 0 stGet
  StrCpy $2 "$1" "" 16
MessageBox MB_OK|MB_ICONINFORMATION "$2"
error:
SectionEnd

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

Код:

${LineRead} "$EXEDIR\File.txt" "6" $1
  IfErrors 0 +2
MessageBox MB_OK|MB_ICONSTOP "error" idok error
  StrCpy $2 "$1" 16
  StrCmp $2 "Content-Length: " +2 0
MessageBox MB_OK|MB_ICONSTOP "error" idok error 
  StrCpy $2 "$1" "" 16
MessageBox MB_OK|MB_ICONINFORMATION "$2"
error:


Dodakaedr 09-09-2015 23:16 2551547

Как реализовать функцию sharedfile в nsis как в inno setup?
Код:

Source: "file.ocx"; DestDir: "{sys}"; Flags: sharedfile

kotkovets 11-09-2015 08:47 2551981

Цитата:

Цитата Dodakaedr
Как реализовать функцию sharedfile в nsis »

смотрите пример Library.nsi NSIS в папке Examples.

Dodakaedr 12-09-2015 19:43 2552484

Цитата:

Цитата kotkovets
смотрите пример Library.nsi NSIS в папке Examples. »

Почему не находит файл, хоть он и присутствует?
Код:

!include "Library.nsh"
outfile regtest.exe
!define TestDLL "$EXEDIR\w.dll"
section main
!insertmacro InstallLib REGDLL SHARED NOREBOOT_NOTPROTECTED "${TestDLL}" "${TestDLL}" "$EXEDIR"
sectionend

Скрытый текст

nfs911 13-09-2015 15:12 2552682

Доброго времени суток) Начал изучать NSIS и вот вроде все просто но не работает...
а именно:

Код:

!include "RegistryFunc.nsh"
!include 'LogicLib.nsh'

${If} ${KeyExists} "HKEY_CURRENT_USER\SOFTWARE\7-Zip"
  MessageBox MB_OK "Ключ есть!"
${Else}
  MessageBox MB_OK "Ключа не существует!"
${EndIf}

Всегда срабатывает else несмотря на наличие ключа

Дико извиняюсь - невнимательность)))
Цитата:

Цитата Справочник по NSIS
библиотека полностью совместима только ANSI версией компилятора NSIS.


nfs911 13-09-2015 18:47 2552758

Заметил косяк или особенность:
Есть ветка HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Skype
Такой нету HKEY_LOCAL_MACHINE\SOFTWARE\Skype
делаем ${If} ${KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Skype" пишет что есть
удаляем HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Skype
делаем ${If} ${KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Skype" пишет что нету
Отсюда получается сквозной поиск в раздел Wow6432Node
Вроде бы ничего...но если сделать ${SaveKeyANSI} "$EXEDIR\HKLM_skype.reg" "HKEY_LOCAL_MACHINE\SOFTWARE\skype"
то получим данные из HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Skype но путь будет в HKEY_LOCAL_MACHINE\SOFTWARE\Skype
тоесть применив мы получим новый ключ HKEY_LOCAL_MACHINE\SOFTWARE\Skype

Это нормально?Особенность API или косяк? Как проверить наличие используя RegistryFunc.nsh без сквозного поиска в Wow6432Node?
потому что если сделать в cmd: reg query HKLM\Software\Skype то получим "Ошибка: Не удается найти указанный раздел или параметр в реестре."

Надеюсь разъяснил понятно)))

Dodakaedr 13-09-2015 20:27 2552795

Как заставить работать переменные $EXEDIR, $SYSDIR ? Если так указать то работает, но это не вариант.
Код:

!include "Library.nsh"
outfile regtest.exe
!define TestDLL "C:\Users\Admin\Documents\w.dll"
section main
!insertmacro InstallLib REGDLL SHARED NOREBOOT_NOTPROTECTED "${TestDLL}" "${TestDLL}" "$EXEDIR"
sectionend


nfs911 13-09-2015 21:21 2552809

Dodakaedr, они только так и работают...
!define SOME_CONSTANT "SomeApp"
${SOME_CONSTANT}
ну или переменные
Создание переменной вне секций и функций (в начале вашего кода)
Var MyVariableName
Создание переменной в секции или в функции
Var /Global MyVariableName
Пример:
Function .onInit
Var /Global MyVariableName
StrCpy $MyVariableName "Значение переменной"
FunctionEnd
Взято из справки

Dodakaedr 14-09-2015 16:51 2553074

nfs911, так тоже не работает.

P.S. Все разобрался.

Salmo 15-09-2015 14:34 2553449

Уважаемые, как убить процесс в системе...Использовал ProcessFunc.nsh, - не справился( возвр.зн.-2) Процесс убивается Анвиром...

K.A.V. 16-09-2015 11:59 2553799

Цитата:

Цитата Salmo
как убить процесс в системе »

http://nsis.sourceforge.net/KillProcDLL_plug-in
http://nsis.sourceforge.net/KillProc_plug-in

Если WinAPI, то TerminateProcess

kotkovets 16-09-2015 12:02 2553800

Цитата:

Цитата Salmo
Использовал ProcessFunc.nsh, - не справился( возвр.зн.-2) »

процесс защищенный, требует особых привилегий., получите их и...всё.

Salmo 16-09-2015 13:07 2553828

K.A.V., kotkovets, спасибо... Вопрос я задал потому, что на ХР, как я понимаю, нет особых заморочек с правами. Работаю под Администратором и все процессы, запущенные мной, разве не имеют равные права? Обратило на себя внимание именно то , что Анвир справляется с задачей, а скомпилированный в NSIS ехе_шник нет... А на памяти время и версия Анвира, который, также, не справлялся с этим процессом. Поэтому мне и показалось (смягчаю), что дело не в правах а в самой убивалке, что и породило мой вопрос. Можно ли считать, что все способы предложенные Вами имеют равные возможности, которые определяются только правами процесса или можно утверждать, что один способ эффективнее другого, при всех равных прочих условиях? Прошу не судить строго, - раньше, как-то, не возникала необходимость разбираться в этом вопросе... Еще раз, спасибо.

Попутно хочу спросить, как убрать из трея иконку убитого процесса, которая остается после убиения?

MKN 16-09-2015 13:17 2553832

Salmo,
Попробуй
Код:

; RtlAdjustPrivilege  - Включает или выключает привилегию у вызывающего потока или процесса.
System::Call ntdll::RtlAdjustPrivilege(i20,i1,i0,*i)

потом уже убивай процесс

Только есть процессы , которым начхать на классические привелегии и права (к примеру, если "хозяин процесса" - TrustedInstaller... )

K.A.V. 16-09-2015 16:55 2553938

Цитата:

Цитата Salmo
Попутно хочу спросить, как убрать из трея иконку убитого процесса, которая остается после убиения? »

Код:

!include "WinMessages.nsh"
Код:

StrCpy $1 0
 FindWindow $0 "Shell_TrayWnd" ""
 FindWindow $0 "TrayNotifyWnd" "" $0
 FindWindow $0 "SysPager" "" $0
 FindWindow $0 "ToolbarWindow32" "" $0
 ${While} $1 != 1920
 SendMessage $0 ${WM_MOUSEMOVE} 0 $1
 IntOp $1 $1 + 1
 ${EndWhile}


ZaxBoys66 19-09-2015 15:22 2555162

NSIS is possible to play a stream url using bass.dll or other plugins?
I have some ideas for a customized program but I have lost a source of it can create.
Please help me.

MKN 19-09-2015 15:57 2555180

ZaxBoys66,

Код:

!define BASS_LOC "$EXEDIR\bass.dll"
!define MP3 "$EXEDIR\demo.mp3"
!define BASS_SAMPLE_LOOP 4
OutFile "Bass_Test.exe"
Page instfiles

Section
  FindWindow $0 "#32770" "" $HWNDPARENT
  System::Call /NOUNLOAD '${BASS_LOC}::BASS_Init(i -1,i 44100,i 0,i r0,i n) b.r0'
  System::Call /NOUNLOAD '${BASS_LOC}::BASS_Start() b.r0'
  System::Call /NOUNLOAD '${BASS_LOC}::BASS_StreamCreateFile(b 0,t "${MP3}",i 0,i 0,i 0) i.r1'
  System::Call /NOUNLOAD "${BASS_LOC}::BASS_ChannelFlags(i r1, i ${BASS_SAMPLE_LOOP}, i ${BASS_SAMPLE_LOOP}) i.R0"
  System::Call /NOUNLOAD '${BASS_LOC}::BASS_ChannelPlay(i r1, b 0) i.R1'
SectionEnd

Function .onGUIEnd
  System::Call /NOUNLOAD "${BASS_LOC}::BASS_StreamFree(i) v (r1)"
  System::Call /NOUNLOAD "${BASS_LOC}::BASS_Stop() b () .r0"
FunctionEnd


IgorV70 21-09-2015 15:13 2555896

Вложений: 1
Добрый день всем!
проблемка такая: при запуске инсталлятора собранного в NSIS на windows server 2008
вываливается сообщение от UAC(см.картинку)
почему ругань идет на непонятный Set...tmp? как это исправить
(если нажать дополнительно, то показывается путь к файлу инсталлятора)

http://forum.oszone.net/attachment.p...1&d=1442837123

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

MKN 22-09-2015 13:38 2556247

ZaxBoys66,
Не все версии bass.dll нормально работают с NSIS ! Используй последние версии с http://www.un4seen.com/
(я тестировал 2.4.10 и 2.4.11 )

nfs911 23-09-2015 13:04 2556653

Что я делаю не так?
файл test_lib.nsh
Код:

!include "x64.nsh"
!include "Logiclib.nsh"
;!macro test_x
${If} ${RunningX64}
        MessageBox MB_OK "running on x64"
        !define test_def1 1000
${else}
        MessageBox MB_OK "running on x32"
        !define test_def1 2000
${EndIf}
;!macroend
;!insertmacro test_x

С макро и без - не работает
Цель: В nsh файле присвоить к test_def1 разные значения в зависимости от разрядности
--------------------------------------------------------
Решение:
Код:

        Section
        ${If} ${RunningX64}
                        MessageBox MB_OK "running on x64"
                        StrCpy $1 "1000"
                ${else}
                        MessageBox MB_OK "running on x32"
                        StrCpy $1 "2000"
                ${EndIf}
                !define test_def1 $1
                MessageBox MB_OK ${test_def1}
        SectionEnd


kotkovets 24-09-2015 11:29 2557037

Цитата:

Цитата nfs911
Что я делаю не так? »

!define - это команды компилятора(восклицательный знак впереди), а не установщика во время установки.

Igor M 25-09-2015 21:42 2557736

Добрый вечер, знатоки.

Столкнулся с необходимостью в деинсталляторе удалять только установленные инсталлером файлы, а не всю папку.
И, неожиданно, выяснил, что не кривого способа вроде как и нет...
Прочитал статью "Uninstall only installed files" на сайте разработчиков, попробовал и, понял, что нормально это не работает:
К примеру, у меня копируется большое число файлов командой типа
Код:

File /r "..\out\files"
А в приведённом рецепте в файл uninstall.log в этом случае пишется не каждый файл по отдельности, а только папка.
Да притом и папка не удаляется при деинсталляции.

Неужели нет простого и лёгкого способа решить указанную проблему?

Спасибо.

Kopejkin 26-09-2015 00:14 2557768

Цитата:

Цитата Igor M
...в этом случае пишется..»

А где у вас записаны все ваши файлы? Напишите все свои файлы, они и запишутся в лог.

Igor M 26-09-2015 12:19 2557850

Цитата:

Цитата Kopejkin
А где у вас записаны все ваши файлы? Напишите все свои файлы, они и запишутся в лог. »

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

nfs911 26-09-2015 22:55 2557988

Доброго времени суток...такой момент
Код:

;В данном случае ключ реестра не успевает импортироваться
${registry::RestoreKey} "$EXEDIR\Test\Backup.reg" $0
;Место для кода приведенного ниже
RMDir /r "$EXEDIR\Test"

Код:

;===Вариант решения 1
;помогает но что если для другого ПК не поможет (ему надо 5 сек например)
Sleep 1000

Код:

;===Вариант решения 2
;не помогает,т.е. возвращается код успеха (0) но не успевает занести данные
Sleep 500
IntCmp $0 0 +2 -1

Как решить эту проблему,рациональным способом?
теоретически код возврата должен быть после импорта, но на практике видимо иначе :(

Kopejkin 27-09-2015 16:42 2558208

Цитата:

Цитата Igor M
Прочитал статью "Uninstall only installed files" »

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

А сколько это - много файлов?
Знатоком не являюсь, но решал бы проблему "сложным" путем, т.е. записывал отдельно все свои файлы.
Для облегчения воспользовался бы инструментом Add files to installation из HM NIS Edit и переделал бы полученный список под свои нужды.
Любой текстовый редактор, тот же HM NIS Edit, быстро выполнит замену нужных кусков.

Например, более 400 файлов в папках NSIS:
читать дальше...

PHP код:

delete "$INSTDIR\Bin\GenPat.exe"
  
delete "$INSTDIR\Bin\LibraryLocal.exe"
  
delete "$INSTDIR\Bin\MakeLangId.exe"
  
delete "$INSTDIR\Bin\RegTool.bin"
  
delete "$INSTDIR\Bin\zip2exe.exe"

  
delete "$INSTDIR\Contrib\CRCCheck\CRCCheck.c"
  
delete "$INSTDIR\Contrib\CRCCheck\CRCCheck.ncb"
  
delete "$INSTDIR\Contrib\CRCCheck\CRCCheck.sln"
  
delete "$INSTDIR\Contrib\CRCCheck\CRCCheck.suo"
  
delete "$INSTDIR\Contrib\CRCCheck\CRCCheck.txt"
  
delete "$INSTDIR\Contrib\CRCCheck\CRCCheck.vcproj"
  
delete "$INSTDIR\Contrib\CRCCheck\Example.nsi"

  
delete "$INSTDIR\Contrib\Graphics\Checks\big.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Checks\classic-cross.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Checks\classic.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Checks\colorful.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Checks\grey-cross.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Checks\grey.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Checks\modern.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Checks\red-round.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Checks\red.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Checks\simple-round.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Checks\simple-round2.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Checks\simple.bmp"

  
delete "$INSTDIR\Contrib\Graphics\Header\nsis-r.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Header\nsis.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Header\orange-nsis.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Header\orange-r-nsis.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Header\orange-r.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Header\orange-uninstall-nsis.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Header\orange-uninstall-r-nsis.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Header\orange-uninstall-r.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Header\orange-uninstall.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Header\orange.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Header\win.bmp"

  
delete "$INSTDIR\Contrib\Graphics\Icons\arrow-install.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\arrow-uninstall.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\arrow2-install.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\arrow2-uninstall.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\box-install.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\box-uninstall.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\classic-install.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\classic-uninstall.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\llama-blue.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\llama-grey.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\modern-install-blue-full.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\modern-install-blue.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\modern-install-colorful.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\modern-install-full.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\modern-install.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\modern-uninstall-blue-full.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\modern-uninstall-blue.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\modern-uninstall-colorful.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\modern-uninstall-full.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\modern-uninstall.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\nsis1-install.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\nsis1-uninstall.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\orange-install-nsis.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\orange-install.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\orange-uninstall-nsis.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\orange-uninstall.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\pixel-install.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\pixel-uninstall.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\win-install.ico"
  
delete "$INSTDIR\Contrib\Graphics\Icons\win-uninstall.ico"

  
delete "$INSTDIR\Contrib\Graphics\Wizard\arrow.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Wizard\llama.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Wizard\nsis.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Wizard\nullsoft.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Wizard\orange-nsis.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Wizard\orange-uninstall-nsis.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Wizard\orange-uninstall.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Wizard\orange.bmp"
  
delete "$INSTDIR\Contrib\Graphics\Wizard\win.bmp"

  
delete "$INSTDIR\Contrib\Language files\Afrikaans.nlf"
  
delete "$INSTDIR\Contrib\Language files\Afrikaans.nsh"
  
delete "$INSTDIR\Contrib\Language files\Albanian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Albanian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Arabic.nlf"
  
delete "$INSTDIR\Contrib\Language files\Arabic.nsh"
  
delete "$INSTDIR\Contrib\Language files\Basque.nlf"
  
delete "$INSTDIR\Contrib\Language files\Basque.nsh"
  
delete "$INSTDIR\Contrib\Language files\Belarusian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Belarusian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Bosnian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Bosnian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Breton.nlf"
  
delete "$INSTDIR\Contrib\Language files\Breton.nsh"
  
delete "$INSTDIR\Contrib\Language files\Bulgarian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Bulgarian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Catalan.nlf"
  
delete "$INSTDIR\Contrib\Language files\Catalan.nsh"
  
delete "$INSTDIR\Contrib\Language files\Croatian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Croatian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Czech.nlf"
  
delete "$INSTDIR\Contrib\Language files\Czech.nsh"
  
delete "$INSTDIR\Contrib\Language files\Danish.nlf"
  
delete "$INSTDIR\Contrib\Language files\Danish.nsh"
  
delete "$INSTDIR\Contrib\Language files\Dutch.nlf"
  
delete "$INSTDIR\Contrib\Language files\Dutch.nsh"
  
delete "$INSTDIR\Contrib\Language files\English.nlf"
  
delete "$INSTDIR\Contrib\Language files\English.nsh"
  
delete "$INSTDIR\Contrib\Language files\Esperanto.nlf"
  
delete "$INSTDIR\Contrib\Language files\Esperanto.nsh"
  
delete "$INSTDIR\Contrib\Language files\Estonian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Estonian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Farsi.nlf"
  
delete "$INSTDIR\Contrib\Language files\Farsi.nsh"
  
delete "$INSTDIR\Contrib\Language files\Finnish.nlf"
  
delete "$INSTDIR\Contrib\Language files\Finnish.nsh"
  
delete "$INSTDIR\Contrib\Language files\French.nlf"
  
delete "$INSTDIR\Contrib\Language files\French.nsh"
  
delete "$INSTDIR\Contrib\Language files\Galician.nlf"
  
delete "$INSTDIR\Contrib\Language files\Galician.nsh"
  
delete "$INSTDIR\Contrib\Language files\German.nlf"
  
delete "$INSTDIR\Contrib\Language files\German.nsh"
  
delete "$INSTDIR\Contrib\Language files\Greek.nlf"
  
delete "$INSTDIR\Contrib\Language files\Greek.nsh"
  
delete "$INSTDIR\Contrib\Language files\Hebrew.nlf"
  
delete "$INSTDIR\Contrib\Language files\Hebrew.nsh"
  
delete "$INSTDIR\Contrib\Language files\Hungarian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Hungarian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Icelandic.nlf"
  
delete "$INSTDIR\Contrib\Language files\Icelandic.nsh"
  
delete "$INSTDIR\Contrib\Language files\Indonesian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Indonesian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Irish.nlf"
  
delete "$INSTDIR\Contrib\Language files\Irish.nsh"
  
delete "$INSTDIR\Contrib\Language files\Italian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Italian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Japanese.nlf"
  
delete "$INSTDIR\Contrib\Language files\Japanese.nsh"
  
delete "$INSTDIR\Contrib\Language files\Korean.nlf"
  
delete "$INSTDIR\Contrib\Language files\Korean.nsh"
  
delete "$INSTDIR\Contrib\Language files\Kurdish.nlf"
  
delete "$INSTDIR\Contrib\Language files\Kurdish.nsh"
  
delete "$INSTDIR\Contrib\Language files\Latvian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Latvian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Lithuanian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Lithuanian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Luxembourgish.nlf"
  
delete "$INSTDIR\Contrib\Language files\Luxembourgish.nsh"
  
delete "$INSTDIR\Contrib\Language files\Macedonian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Macedonian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Malay.nlf"
  
delete "$INSTDIR\Contrib\Language files\Malay.nsh"
  
delete "$INSTDIR\Contrib\Language files\Mongolian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Mongolian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Norwegian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Norwegian.nsh"
  
delete "$INSTDIR\Contrib\Language files\NorwegianNynorsk.nlf"
  
delete "$INSTDIR\Contrib\Language files\NorwegianNynorsk.nsh"
  
delete "$INSTDIR\Contrib\Language files\Polish.nlf"
  
delete "$INSTDIR\Contrib\Language files\Polish.nsh"
  
delete "$INSTDIR\Contrib\Language files\Portuguese.nlf"
  
delete "$INSTDIR\Contrib\Language files\Portuguese.nsh"
  
delete "$INSTDIR\Contrib\Language files\PortugueseBR.nlf"
  
delete "$INSTDIR\Contrib\Language files\PortugueseBR.nsh"
  
delete "$INSTDIR\Contrib\Language files\Romanian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Romanian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Russian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Russian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Serbian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Serbian.nsh"
  
delete "$INSTDIR\Contrib\Language files\SerbianLatin.nlf"
  
delete "$INSTDIR\Contrib\Language files\SerbianLatin.nsh"
  
delete "$INSTDIR\Contrib\Language files\SimpChinese.nlf"
  
delete "$INSTDIR\Contrib\Language files\SimpChinese.nsh"
  
delete "$INSTDIR\Contrib\Language files\Slovak.nlf"
  
delete "$INSTDIR\Contrib\Language files\Slovak.nsh"
  
delete "$INSTDIR\Contrib\Language files\Slovenian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Slovenian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Spanish.nlf"
  
delete "$INSTDIR\Contrib\Language files\Spanish.nsh"
  
delete "$INSTDIR\Contrib\Language files\SpanishInternational.nlf"
  
delete "$INSTDIR\Contrib\Language files\SpanishInternational.nsh"
  
delete "$INSTDIR\Contrib\Language files\Swedish.nlf"
  
delete "$INSTDIR\Contrib\Language files\Swedish.nsh"
  
delete "$INSTDIR\Contrib\Language files\Thai.nlf"
  
delete "$INSTDIR\Contrib\Language files\Thai.nsh"
  
delete "$INSTDIR\Contrib\Language files\TradChinese.nlf"
  
delete "$INSTDIR\Contrib\Language files\TradChinese.nsh"
  
delete "$INSTDIR\Contrib\Language files\Turkish.nlf"
  
delete "$INSTDIR\Contrib\Language files\Turkish.nsh"
  
delete "$INSTDIR\Contrib\Language files\Ukrainian.nlf"
  
delete "$INSTDIR\Contrib\Language files\Ukrainian.nsh"
  
delete "$INSTDIR\Contrib\Language files\Uzbek.nlf"
  
delete "$INSTDIR\Contrib\Language files\Uzbek.nsh"
  
delete "$INSTDIR\Contrib\Language files\Welsh.nlf"
  
delete "$INSTDIR\Contrib\Language files\Welsh.nsh"

  
delete "$INSTDIR\Contrib\Modern UI\ioSpecial.ini"
  
delete "$INSTDIR\Contrib\Modern UI\System.nsh"

  
delete "$INSTDIR\Contrib\Modern UI 2\Deprecated.nsh"
  
delete "$INSTDIR\Contrib\Modern UI 2\Interface.nsh"
  
delete "$INSTDIR\Contrib\Modern UI 2\Localization.nsh"
  
delete "$INSTDIR\Contrib\Modern UI 2\MUI2.nsh"

  
delete "$INSTDIR\Contrib\Modern UI 2\Pages\Components.nsh"
  
delete "$INSTDIR\Contrib\Modern UI 2\Pages\Directory.nsh"
  
delete "$INSTDIR\Contrib\Modern UI 2\Pages\Finish.nsh"
  
delete "$INSTDIR\Contrib\Modern UI 2\Pages\InstallFiles.nsh"
  
delete "$INSTDIR\Contrib\Modern UI 2\Pages\License.nsh"
  
delete "$INSTDIR\Contrib\Modern UI 2\Pages\StartMenu.nsh"
  
delete "$INSTDIR\Contrib\Modern UI 2\Pages\UninstallConfirm.nsh"
  
delete "$INSTDIR\Contrib\Modern UI 2\Pages\Welcome.nsh"

  
delete "$INSTDIR\Contrib\Modern UI 2\Pages.nsh"

  
delete "$INSTDIR\Contrib\UIs\default.exe"
  
delete "$INSTDIR\Contrib\UIs\modern.exe"
  
delete "$INSTDIR\Contrib\UIs\modern_headerbmp.exe"
  
delete "$INSTDIR\Contrib\UIs\modern_headerbmpr.exe"
  
delete "$INSTDIR\Contrib\UIs\modern_nodesc.exe"
  
delete "$INSTDIR\Contrib\UIs\modern_smalldesc.exe"
  
delete "$INSTDIR\Contrib\UIs\sdbarker_tiny.exe"

  
delete "$INSTDIR\Contrib\zip2exe\Base.nsh"
  
delete "$INSTDIR\Contrib\zip2exe\Classic.nsh"
  
delete "$INSTDIR\Contrib\zip2exe\Modern.nsh"

  
delete "$INSTDIR\COPYING"

  
delete "$INSTDIR\Docs\AdvSplash\advsplash.txt"

  
delete "$INSTDIR\Docs\Banner\Readme.txt"

  
delete "$INSTDIR\Docs\BgImage\BgImage.txt"

  
delete "$INSTDIR\Docs\Dialer\Dialer.txt"

  
delete "$INSTDIR\Docs\InstallOptions\Changelog.txt"
  
delete "$INSTDIR\Docs\InstallOptions\Readme.html"

  
delete "$INSTDIR\Docs\makensisw\License.txt"
  
delete "$INSTDIR\Docs\makensisw\Readme.txt"

  
delete "$INSTDIR\Docs\Math\Math.txt"

  
delete "$INSTDIR\Docs\Modern UI\Changelog.txt"

  
delete "$INSTDIR\Docs\Modern UI\images\closed.gif"
  
delete "$INSTDIR\Docs\Modern UI\images\header.gif"
  
delete "$INSTDIR\Docs\Modern UI\images\open.gif"
  
delete "$INSTDIR\Docs\Modern UI\images\screen1.png"
  
delete "$INSTDIR\Docs\Modern UI\images\screen2.png"

  
delete "$INSTDIR\Docs\Modern UI\License.txt"
  
delete "$INSTDIR\Docs\Modern UI\Readme.html"

  
delete "$INSTDIR\Docs\Modern UI 2\images\closed.gif"
  
delete "$INSTDIR\Docs\Modern UI 2\images\header.gif"
  
delete "$INSTDIR\Docs\Modern UI 2\images\open.gif"
  
delete "$INSTDIR\Docs\Modern UI 2\images\screen1.png"
  
delete "$INSTDIR\Docs\Modern UI 2\images\screen2.png"

  
delete "$INSTDIR\Docs\Modern UI 2\License.txt"
  
delete "$INSTDIR\Docs\Modern UI 2\Readme.html"

  
delete "$INSTDIR\Docs\MultiUser\Readme.html"

  
delete "$INSTDIR\Docs\nsDialogs\Readme.html"

  
delete "$INSTDIR\Docs\nsExec\nsExec.txt"

  
delete "$INSTDIR\Docs\NSISdl\License.txt"
  
delete "$INSTDIR\Docs\NSISdl\ReadMe.txt"

  
delete "$INSTDIR\Docs\Splash\splash.txt"

  
delete "$INSTDIR\Docs\StartMenu\Readme.txt"

  
delete "$INSTDIR\Docs\StrFunc\StrFunc.txt"

  
delete "$INSTDIR\Docs\System\System.html"
  
delete "$INSTDIR\Docs\System\WhatsNew.txt"

  
delete "$INSTDIR\Docs\TextReplace\Readme.txt"

  
delete "$INSTDIR\Docs\VPatch\Readme.html"

  
delete "$INSTDIR\Example\NewTextreplaceTestA.nsi"
  
delete "$INSTDIR\Example\NewTextreplaceTestW.nsi"

  
delete "$INSTDIR\Example\TextFiles\FindItAnsi1251.txt"
  
delete "$INSTDIR\Example\TextFiles\FindItUTF16LE.txt"
  
delete "$INSTDIR\Example\TextFiles\FindItUTF8.txt"
  
delete "$INSTDIR\Example\TextFiles\inputAnsi1251.txt"
  
delete "$INSTDIR\Example\TextFiles\inputUTF16LE.txt"
  
delete "$INSTDIR\Example\TextFiles\inputUTF8.txt"
  
delete "$INSTDIR\Example\TextFiles\ReplaceItAnsi.txt"
  
delete "$INSTDIR\Example\TextFiles\ReplaceItRecode.txt"
  
delete "$INSTDIR\Example\TextFiles\ReplaceWithUTF16BE.txt"
  
delete "$INSTDIR\Example\TextFiles\ReplaceWithUTF16LE.txt"

  
delete "$INSTDIR\Examples\AdvSplash\Example.nsi"

  
delete "$INSTDIR\Examples\Banner\Example.nsi"

  
delete "$INSTDIR\Examples\BgImage\Example.nsi"

  
delete "$INSTDIR\Examples\bigtest.nsi"
  
delete "$INSTDIR\Examples\example1.nsi"
  
delete "$INSTDIR\Examples\example2.nsi"
  
delete "$INSTDIR\Examples\FileFunc.ini"
  
delete "$INSTDIR\Examples\FileFunc.nsi"
  
delete "$INSTDIR\Examples\FileFuncTest.nsi"
  
delete "$INSTDIR\Examples\gfx.nsi"

  
delete "$INSTDIR\Examples\InstallOptions\test.ini"
  
delete "$INSTDIR\Examples\InstallOptions\test.nsi"
  
delete "$INSTDIR\Examples\InstallOptions\testimgs.ini"
  
delete "$INSTDIR\Examples\InstallOptions\testimgs.nsi"
  
delete "$INSTDIR\Examples\InstallOptions\testlink.ini"
  
delete "$INSTDIR\Examples\InstallOptions\testlink.nsi"
  
delete "$INSTDIR\Examples\InstallOptions\testnotify.ini"
  
delete "$INSTDIR\Examples\InstallOptions\testnotify.nsi"

  
delete "$INSTDIR\Examples\languages.nsi"
  
delete "$INSTDIR\Examples\Library.nsi"
  
delete "$INSTDIR\Examples\LogicLib.nsi"
  
delete "$INSTDIR\Examples\makensis.nsi"

  
delete "$INSTDIR\Examples\Math\math.nsi"
  
delete "$INSTDIR\Examples\Math\MathTest.exe"
  
delete "$INSTDIR\Examples\Math\mathtest.ini"
  
delete "$INSTDIR\Examples\Math\mathtest.nsi"
  
delete "$INSTDIR\Examples\Math\mathtest.txt"

  
delete "$INSTDIR\Examples\Memento.nsi"

  
delete "$INSTDIR\Examples\Modern UI\Basic.nsi"
  
delete "$INSTDIR\Examples\Modern UI\HeaderBitmap.nsi"
  
delete "$INSTDIR\Examples\Modern UI\MultiLanguage.nsi"
  
delete "$INSTDIR\Examples\Modern UI\StartMenu.nsi"
  
delete "$INSTDIR\Examples\Modern UI\WelcomeFinish.nsi"

  
delete "$INSTDIR\Examples\nsDialogs\example.nsi"
  
delete "$INSTDIR\Examples\nsDialogs\InstallOptions.nsi"
  
delete "$INSTDIR\Examples\nsDialogs\timer.nsi"
  
delete "$INSTDIR\Examples\nsDialogs\welcome.nsi"

  
delete "$INSTDIR\Examples\nsExec\test.nsi"

  
delete "$INSTDIR\Examples\one-section.nsi"

  
delete "$INSTDIR\Examples\Plugin\exdll-vs2008.sln"
  
delete "$INSTDIR\Examples\Plugin\exdll-vs2008.vcproj"
  
delete "$INSTDIR\Examples\Plugin\exdll.c"
  
delete "$INSTDIR\Examples\Plugin\exdll.dpr"
  
delete "$INSTDIR\Examples\Plugin\exdll.dsp"
  
delete "$INSTDIR\Examples\Plugin\exdll.dsw"
  
delete "$INSTDIR\Examples\Plugin\exdll_with_unit.dpr"
  
delete "$INSTDIR\Examples\Plugin\extdll.inc"

  
delete "$INSTDIR\Examples\Plugin\nsis\api.h"
  
delete "$INSTDIR\Examples\Plugin\nsis\pluginapi.h"
  
delete "$INSTDIR\Examples\Plugin\nsis\pluginapi.lib"

  
delete "$INSTDIR\Examples\Plugin\nsis.pas"

  
delete "$INSTDIR\Examples\primes.nsi"
  
delete "$INSTDIR\Examples\rtest.nsi"
  
delete "$INSTDIR\Examples\silent.nsi"

  
delete "$INSTDIR\Examples\Splash\Example.nsi"

  
delete "$INSTDIR\Examples\StartMenu\Example.nsi"

  
delete "$INSTDIR\Examples\StrFunc.nsi"

  
delete "$INSTDIR\Examples\System\Resource.dll"
  
delete "$INSTDIR\Examples\System\SysFunc.nsh"
  
delete "$INSTDIR\Examples\System\System.nsh"
  
delete "$INSTDIR\Examples\System\System.nsi"

  
delete "$INSTDIR\Examples\TextFunc.ini"
  
delete "$INSTDIR\Examples\TextFunc.nsi"
  
delete "$INSTDIR\Examples\TextFuncTest.nsi"

  
delete "$INSTDIR\Examples\TextReplace\TextReplaceTest.nsi"

  
delete "$INSTDIR\Examples\UserInfo\UserInfo.nsi"

  
delete "$INSTDIR\Examples\UserVars.nsi"
  
delete "$INSTDIR\Examples\VersionInfo.nsi"
  
delete "$INSTDIR\Examples\viewhtml.nsi"

  
delete "$INSTDIR\Examples\VPatch\example.nsi"
  
delete "$INSTDIR\Examples\VPatch\newfile.txt"
  
delete "$INSTDIR\Examples\VPatch\oldfile.txt"
  
delete "$INSTDIR\Examples\VPatch\patch.pat"

  
delete "$INSTDIR\Examples\waplugin.nsi"
  
delete "$INSTDIR\Examples\WordFunc.ini"
  
delete "$INSTDIR\Examples\WordFunc.nsi"
  
delete "$INSTDIR\Examples\WordFuncTest.nsi"

  
delete "$INSTDIR\Include\Colors.nsh"
  
delete "$INSTDIR\Include\FileFunc.nsh"
  
delete "$INSTDIR\Include\InstallOptions.nsh"
  
delete "$INSTDIR\Include\LangFile.nsh"
  
delete "$INSTDIR\Include\Library.nsh"
  
delete "$INSTDIR\Include\LogicLib.nsh"
  
delete "$INSTDIR\Include\Memento.nsh"
  
delete "$INSTDIR\Include\MUI.nsh"
  
delete "$INSTDIR\Include\MUI2.nsh"
  
delete "$INSTDIR\Include\MultiUser.nsh"
  
delete "$INSTDIR\Include\NewTextreplace.nsh"
  
delete "$INSTDIR\Include\nsDialogs.nsh"
  
delete "$INSTDIR\Include\ProcessFunc.nsh"
  
delete "$INSTDIR\Include\Sections.nsh"
  
delete "$INSTDIR\Include\StrFunc.nsh"
  
delete "$INSTDIR\Include\TextFunc.nsh"
  
delete "$INSTDIR\Include\TextReplace.nsh"
  
delete "$INSTDIR\Include\UnInstallLog.nsh"
  
delete "$INSTDIR\Include\UpgradeDLL.nsh"
  
delete "$INSTDIR\Include\Util.nsh"
  
delete "$INSTDIR\Include\VB6RunTime.nsh"
  
delete "$INSTDIR\Include\VPatchLib.nsh"

  
delete "$INSTDIR\Include\Win\WinDef.nsh"
  
delete "$INSTDIR\Include\Win\WinError.nsh"
  
delete "$INSTDIR\Include\Win\WinNT.nsh"
  
delete "$INSTDIR\Include\Win\WinUser.nsh"

  
delete "$INSTDIR\Include\WinCore.nsh"
  
delete "$INSTDIR\Include\WinMessages.nsh"
  
delete "$INSTDIR\Include\WinVer.nsh"
  
delete "$INSTDIR\Include\WinVer2.nsh"
  
delete "$INSTDIR\Include\WMI.nsh"
  
delete "$INSTDIR\Include\WordFunc.nsh"
  
delete "$INSTDIR\Include\x64.nsh"

  
delete "$INSTDIR\makensis.exe"
  
delete "$INSTDIR\makensisw.exe"

  
delete "$INSTDIR\Menu\images\header.gif"
  
delete "$INSTDIR\Menu\images\line.gif"
  
delete "$INSTDIR\Menu\images\site.gif"

  
delete "$INSTDIR\Menu\index.html"

  
delete "$INSTDIR\NSIS.chm"
  
delete "$INSTDIR\NSIS.exe"
  
delete "$INSTDIR\nsisconf.nsh"
  
  
delete "$INSTDIR\Plugins\AdvSplash.dll"
  
delete "$INSTDIR\Plugins\Banner.dll"
  
delete "$INSTDIR\Plugins\BgImage.dll"
  
delete "$INSTDIR\Plugins\CRCCheck.dll"
  
delete "$INSTDIR\Plugins\Dialer.dll"
  
delete "$INSTDIR\Plugins\InstallOptions.dll"
  
delete "$INSTDIR\Plugins\LangDLL.dll"
  
delete "$INSTDIR\Plugins\Math.dll"
  
delete "$INSTDIR\Plugins\md5dll.dll"
  
delete "$INSTDIR\Plugins\NewTextreplace.dll"
  
delete "$INSTDIR\Plugins\nsDialogs.dll"
  
delete "$INSTDIR\Plugins\nsExec.dll"
  
delete "$INSTDIR\Plugins\NSISdl.dll"
  
delete "$INSTDIR\Plugins\Splash.dll"
  
delete "$INSTDIR\Plugins\StartMenu.dll"
  
delete "$INSTDIR\Plugins\System.dll"
  
delete "$INSTDIR\Plugins\TextReplace.dll"
  
delete "$INSTDIR\Plugins\TypeLib.dll"
  
delete "$INSTDIR\Plugins\UserInfo.dll"
  
delete "$INSTDIR\Plugins\VPatch.dll"
  
delete "$INSTDIR\Plugins\WPatch.dll"
  
delete "$INSTDIR\Plugins\WPatchW.dll"
  
  
delete "$INSTDIR\Stubs\bzip2"
  
delete "$INSTDIR\Stubs\bzip2_solid"
  
delete "$INSTDIR\Stubs\lzma"
  
delete "$INSTDIR\Stubs\lzma_solid"
  
delete "$INSTDIR\Stubs\uninst"
  
delete "$INSTDIR\Stubs\zlib"
  
delete "$INSTDIR\Stubs\zlib_solid"
  
  
delete "$INSTDIR\uninst-nsis.exe" 


Не спеша ковырялся минут 5, не более.

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

K.A.V. 27-09-2015 21:44 2558349

Цитата:

Цитата nfs911
Как решить эту проблему,рациональным способом?
теоретически код возврата должен быть после импорта, но на практике видимо иначе »

Хотите сказать, команда не ждёт завершения исполнения импорта в реестр? Честно сказать, не использовал конкретно эту команду этого плагина, проверять лень
Воспользуйтесь исполнением regedit напрямую (хотя в документации к плагину сказано, что импорт также производится через regedit)
Код:

ExecWait '$WINDIR\regedit.exe /s "путь к reg файлу"'
Цитата:

Цитата Igor M
Столкнулся с необходимостью в деинсталляторе удалять только установленные инсталлером файлы, а не всю папку. »

Цитата:

Цитата Igor M
Неужели нет простого и лёгкого способа решить указанную проблему? »

1. Создавать список файлов вручную и закидывать их в скрипт, как предложил выше Kopejkin
2. Выполнять поиск файлов командой Locate в папке установки после распаковки всех файлов и создавать список в INI формате, записывая в файл, в денисталляторе обрабатывать файл и удалять файлы проходясь по списку.
3. Если используете графический интерфейс при установке, можно попробовать поковырять пример кода LOG-файл установки из нашего справочника, за место записи лог-файла парсить каждую строку на предмет типа команды, т.е. прочитали строку, в ней например такой текст:
Код:

Создание ярлыка: C:\Program Files (x86)\Моя программа\explorer.lnk
берём из строки первые X символов (для команды ярлыка это 17 символов, текст+пробел), если эти первые 17 символов = строке Создание ярлыка: , то отрезаем от строки первые 17 символов и остаётся только путь к ярлыку, его записываем в INI файл в секцию с ярлыками
По этой же логике делаем с другими командами, создание папок, копирование файлов и т.д....
"резать" строку по количеству символов можно командой StrCpy

nfs911 27-09-2015 22:39 2558361

Цитата:

Цитата K.A.V.
ExecWait '$WINDIR\regedit.exe /s "путь к reg файлу"' »

Это само собой...просто я думал в справке имели введу эквивалент результату,а не то что юзают запуск regedit'a
спс за уточнение))
Было бы хорошо реализовать через System::Call "advapi32:: ))))
Если найду время и желание - буду пробовать с помощью WinAPI реализовать...

Igor M 28-09-2015 00:16 2558381

Спасибо, за советы!
К сожалению, на мой взгляд, всё это - костыли: скрипты, списки файлов, парсинг... :(

Цитата:

Цитата Kopejkin
И еще непонятно, зачем вам удалять папку, которую вы не создавали? »

Ну, например, при необходимости убить результаты деятельности программы: логи, конфиги и т.п.

Kopejkin 28-09-2015 10:30 2558463

Цитата:

Цитата Igor M
Ну, например... »

Руководство пользователя. раздел 4.9.1.8. RMDir (стр. 66)

Dodakaedr 28-09-2015 21:09 2558672

Как записать путь в таком виде в реестре?
Код:

C:\PROGRA~1\PHOTOL~1\PHOTOL~1.EXE "%1"

nfs911 28-09-2015 22:59 2558693

Dodakaedr,


Код:

""C:\PROGRA~1\PHOTOL~1\PHOTOL~1.EXE $\"%1$\""
WriteRegStr HKLM "SOFTWARE\MyProg" "Path" ""C:\PROGRA~1\PHOTOL~1\PHOTOL~1.EXE $\"%1$\""


K.A.V. 29-09-2015 00:15 2558705

Цитата:

Цитата Dodakaedr
Как записать путь в таком виде в реестре? »

Используйте команду GetFullPathName с ключем /SHORT, учтите, что в пути не должно быть символов типа "%1", в команду посылаете только путь, а после преобразования пути уже можете добавить к нему остальное
Код:

GetFullPathName /SHORT $0 "$PROGRAMFILES"
StrCpy $0 '$0 "%1"'
MessageBox MB_OK|MB_ICONINFORMATION "$0"

+Эту команду можно выполнять только если директория существует, в противном случае (если папки не существует) - вам вернётся пустое значение
Протестируйте в общем

Есть также WinAPI функция, делающая тоже самое
Код:

StrCpy $0 '$PROGRAMFILES'
System::Call 'kernel32::GetShortPathName(t r0, t .r0, i ${NSIS_MAX_STRLEN}) i .r1'
StrCpy $0 '$0 "%1"'
MessageBox MB_OK|MB_ICONINFORMATION "$0"


ZaxBoys66 30-09-2015 17:06 2559399

Name "NSIS archive folder"

Page instfiles

OutFile "NSIS archive folder.exe"
InstallDir "$EXEDIR\NSIS archive folder"

SetCompressor /SOLID lzma

!define RUNASADMIN

!ifndef RUNASADMIN
RequestExecutionLevel 'admin' ;Require admin rights on NT6+ (When UAC is turned on)
!else
RequestExecutionLevel 'admin'
!endif

!include "FileFunc.nsh"
!include "LogicLib.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"

!insertmacro GetSize

Function .onInit
File "/oname=$TEMP\7za.exe" "7za\7za.exe"
FunctionEnd

var /global InSize
var /global OutSize
var /global SZ_1
var /global SZ_2
var /global SZ_3

Section "Program" P1

DetailPrint "Compressored filder..."

Setoutpath "$INSTDIR"

WriteINIStr "$INSTDIR\CatsSoft © 2015.url" "InternetShortcut" "URL" "http://portableroapps.blogspot.com/"

${If} ${FileExists} "$INSTDIR\CatsSoft © 2015.url"
nsExec::ExecToLog '"$TEMP\7za.exe" a "archive.7z" "$INSTDIR"'
${EndIf}
Delete "$TEMP\7za.exe"

${GetSize} "$INSTDIR" "/M=*.* /S=0K" $SZ_1 $SZ_2 $SZ_3
StrCpy $InSize 1024
StrCpy $InSize $SZ_1 / 1024
StrCpy $0 0
StrCpy $InSize $SZ_1
StrCpy $1 $InSize

IntCmp $1 1024 +3 +1 +3
StrCpy $1 "$1.0 KB"
Goto +12
IntOp $1 $1 * 100
IntOp $1 $1 / 1024
StrCpy $2 $1 "" -1
StrCpy $3 $1 1 -2
StrCpy $1 $1 -2
IntCmp $2 5 +1 +2 +1
IntOp $3 $3 + 1
StrCmp $3 10 +1 +3
StrCpy $3 0
IntOp $1 $1 + 1
StrCpy $1 "$1.$3 MB"
/*
How can pass here and GB
*/
StrCpy $OutSize $1

Messagebox MB_OK|MB_USERICON 'Size folder: $OutSize'

SectionEnd

Planetamars 02-10-2015 19:05 2560099

Подскажите как изменить путь в скрипте при установке портативной и обычной версии программы .

Planetamars 02-10-2015 21:51 2560148

ZaxBoys66, Спасибо огромное ! Буду пытаться прикрутить к своему скрипту.

MKN 06-10-2015 18:20 2561209

Иногда в Windows x64 необходимо определить разрядность установленного приложения (исполняемого файла).
Причём, установленного не в $PROGRAMFILES64 или $PROGRAMFILES, что могло бы служить ориентиром разрядности. А ещё имя исполняемого файла одинаково и для x32 и для x64. Как тут быть ? :)
Поможет функция GetBinaryType.

Код:

OutFile "GetBinaryType.exe"
/*
https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa364819(v=vs.85).aspx
    0: result := '32-bit Windows-based';
    1: result := 'MS-DOS – based';
    2: result := '16-bit Windows-based';
    3: result := 'PIF for MS-DOS – based';
    4: result := 'POSIX – based';
    5: result := '16bit-OS/2';
    6: result := '64-bit Windows-based';
*/
Section
  StrCpy $0 "$EXEDIR\unknown_bit.exe"
  System::Call `kernel32::GetBinaryType(t r0, *i .r2)`
  MessageBox MB_OK "$2"
SectionEnd


MKN 10-10-2015 14:37 2562475

Когда то рассматривалось, как определять дефолтовое приложение (путь и имя) для открытия определённых типов файлов с помошью функции FindExecutable.

Ту же операцию можно сделать немного проще с помощью функции AssocQueryString.
Код:

!define ASSOCSTR_EXECUTABLE 2
!define ASSOCF_NOTRUNCATE 0x00000020
!define ASSOCF_REMAPRUNDLL 0x00000080
!define ASSOCF_NOFIXUPS 0x00000100

System::Call 'SHLWAPI::AssocQueryString(i ${ASSOCF_NOTRUNCATE}|${ASSOCF_REMAPRUNDLL}|${ASSOCF_NOFIXUPS}, i ${ASSOCSTR_EXECUTABLE}, t ".html", t "open", t.r1, *i ${NSIS_MAX_STRLEN})i.r0'
MessageBox MB_OK "EXECUTABLE  $1"

Оба эти способа нормально работают в Windows 7, но к сожалению , не в Windows 10...

Используя AssocQueryString , в Windows 10, для штатных интегрированных приложений получаем - C:\Windows\system32\LaunchWinApp.exe
Возможно это связано с особенностями работы собственных приложений в новой ОС...

Для автономно установленных приложений (например, для Хрома и т.д. ) - всё нормально.

Как крайний выход из положения, в Windows 10 можно получить только имя дефолтового приложения, если использовать константу ASSOCSTR_FRIENDLYAPPNAME

Код:

!define ASSOCSTR_FRIENDLYAPPNAME 4

System::Call 'SHLWAPI::AssocQueryString(i ${ASSOCF_NOTRUNCATE}|${ASSOCF_REMAPRUNDLL}|${ASSOCF_NOFIXUPS}, i ${ASSOCSTR_FRIENDLYAPPNAME}, t ".htm", t "open", t.r1, *i ${NSIS_MAX_STRLEN})i.r0'
MessageBox MB_OK "FRIENDLYAPPNAME  $1"


lavey13 17-10-2015 14:49 2564830

Всем доброго времени суток! Имеется проблема решение которой затрудняюсь найти. В коде скрипта подключен плагин "nsArray". Массив полноценно, нормально работает при использовании его элементов. НО, при условии, что текст элементов написан на английском. Как только в элементе массива появляется русский текст, программа начинает крашиться, на этапе компиляции ошибок нет. Пробовал сохранять исходник в разных кодировках, безрезультатно. Сталкивался кто-нибудь?

nsArray::SetList MyArray "7-Zip" "Любой текст" "Adobe Reader" "Logitech Webcam" /end
${nsArray_ToString} MyArray $R9

kotkovets 19-10-2015 08:37 2565525

Цитата:

Цитата lavey13
плагин "nsArray" »

так к "буржую" обращайся с поддержкой кирилицы

Flix 19-10-2015 22:38 2565856

Цитата:

Цитата lavey13
Имеется проблема решение которой затрудняюсь найти. В коде скрипта подключен плагин "nsArray"... Как только в элементе массива появляется русский текст, программа начинает крашиться »

Не вижу проблем с кириллицей. Использовал NSIS v3.0b2, сценарий в кодировке UTF-8, активирован флаг компиляции Unicode.


wolkow70 22-10-2015 14:06 2566961

На Windows 10 выполняю
${WinVerGetMajor} $R0
${WinVerGetMinor} $R1
StrCpy $R0 $R0$R1
В результате в $R0 = 62, что соответствует Windows 8...
Как лучше определить, что юзаем десятку?

MKN 22-10-2015 15:30 2566994

Цитата:

Цитата wolkow70
Как лучше определить, что юзаем десятку? »

WinVer2.nsh от kotkovets правильно определяет ОС - Win10 + прочие параметры десятки, но... в пределах запуска скомпилированного скрипта с HDD...
Запускаю тот же скомпилированный скрипт с флешки - ОС Win10, почему то определяется как Win8 + прочие параметры восьмёрки...
И как это понимать ? :) Сначала было даже смешно..., но как работать с флешки ? :)

wolkow70 22-10-2015 15:45 2567002

MKN,
Windows 8.1 - 6.3
Windows 8 - 6.2
Windows 10 - 10.0
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx
У меня в реестре почему-то
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"ProductName"="Windows 10 Home"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"CurrentVersion"="6.3"

Цитата:

Цитата MKN
WinVer2.nsh от kotkovets »

Этот хедер не совместим одновременно со стандартным WinVer.nsh, который мне нужен в скрипте. Вот если бы отдельно функцию выдрать...

MKN 22-10-2015 15:56 2567010

Т.е. - при запуске exe-скрипта с флешки из под Win10 и с помощью чисто GetVersionEx, и с помощью WinVer2.nsh - ошибочная версия ОС. (при запуске с флешки из под W7 и W8 - всё ОК)
При запуске с флешки из под Win10 с помощью WMI.nsh ( т.е. с использованием WMIC) - всё определяется правильно :

Код:

;http://nsis.sourceforge.net/WMI_header
OutFile "OperatingSystemInfo.exe"
!include MUI2.nsh
!include WMI.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE "English"

Var WMI_Caption
Var WMI_Version
Var WMI_CSDVersion
Var WMI_ServicePackMajorVersion
Var WMI_ServicePackMinorVersion
Var WMI_PushVar

Section
; короткое описание версии операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Caption callback_Function
 StrCpy $WMI_Caption $WMI_PushVar

 ; версия ОС
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Version callback_Function
 StrCpy $WMI_Version $WMI_PushVar

; последний установленный сервис-пак (строка); если никакой сервис-пак не установлен, пустая строка.
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSDVersion callback_Function
 StrCpy $WMI_CSDVersion $WMI_PushVar

; версия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMajorVersion callback_Function
 StrCpy $WMI_ServicePackMajorVersion $WMI_PushVar

; подверсия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMinorVersion callback_Function
 StrCpy $WMI_ServicePackMinorVersion $WMI_PushVar
SectionEnd
 
Function callback_Function
System::Call "user32::OemToChar(t R2, t. r2)"
detailprint "$2"
StrCpy $WMI_PushVar $2
FunctionEnd

А такой код (ранее предложенный kotkovets), в Win10 - c HDD работате нормально, с флешки в Win10 - вообще не работает
Код:

OutFile "WMI_OperatingSystem.exe"
!include "LogicLib.nsh"

!macro IWbemClassObject->Get NameObject OUT
    System::Call "*(i,i,i)i.R4"
    System::Call "$R3->4(w'${NameObject}',i0,iR4,i0,i0)"
    System::Call "*$R4(i.R6,i,i.R5)"
    StrCmp $R6 3 0 +2
    IntFmt $R5 %u $R5
    StrCmp $R6 8 0 +2
    !ifdef NSIS_UNICODE
      IntFmt $R5 %s $R5
    !else
      IntFmt $R5 %S $R5
    !endif
    System::Call "ole32::VariantClear(iR4)"
    System::Free $R4
    StrCpy ${OUT} $R5
!macroend

Section
  System::Call "ole32::CoInitializeEx(i0,i2)"
  System::Call "ole32::CoCreateInstance(g'{4590f811-1d3a-11d0-891f-00aa004b2e24}',i0,i1,g'{dc12a687-737f-11cf-884d-00aa004b2e24}',*i.R0)i.R7"
  ${If} $R7 == 0
      System::Call "ole32::CoInitializeSecurity(i0,i-1,i0,i0,i2,i3,i0,i0,i0)"
      System::Call "$R0->3(w'root\CIMV2',i0,i0,i0,i0,i0,i0,*i.R1)i.R7"
      ${If} $R7 == 0
        System::Call "$R1->20(w'WQL', w'SELECT * FROM Win32_OperatingSystem',i48,i0,*i.R2)i.R7"
        System::Call "$R2->4(i0xffffffff,i1,*i.R3,*i)i.R7"
        ${If} $R7 == 0
             
                            !insertmacro IWbemClassObject->Get "Caption" $7
                      MessageBox MB_OK "Caption=$7"
                                !insertmacro IWbemClassObject->Get "Version" $7
                                    MessageBox MB_OK "Version=$7"
                                                       
              System::Call "$R0->2()"
              System::Call "$R1->2()"
              System::Call "$R2->2()"
              System::Call "$R3->2()"
        ${Else}
            System::Call "$R0->2()"
            System::Call "$R1->2()"
            System::Call "$R2->2()"
        ${EndIf}
      ${Else}
        System::Call "$R0->2()"
        System::Call "$R1->2()"
      ${EndIf}
  ${EndIf}
SectionEnd

Может Вячеслав скажет в чём тут дело ? (и подправит код...)

PS StdUtils плаг - также правильно определяет параметры Win10, и с флешки и с HDD. (кстати, он обновился Version 1.08, released 2015-10-10 )

wolkow70 22-10-2015 17:39 2567040

MKN,
Коды WMI работают, но нужно в какой-то переменной просто получить значение 10, а не полную версию Оси.
Можно конечно отрезать, но это уже гемор дополнительный.

kotkovets 22-10-2015 20:15 2567110

Цитата:

Цитата MKN
с флешки в Win10 - вообще не работает »

спотыкается здесь именно выделенным, возвращается не ноль в $R7, загадка, причины непонятна......
Код:

        System::Call "$R1->20(w'WQL', w'SELECT * FROM Win32_OperatingSystem',i48,i0,*i.R2)i.R7"
        System::Call "$R2->4(i0xffffffff,i1,*i.R3,*i)i.R7"
        ${If} $R7 == 0


MKN 24-10-2015 12:27 2567636

Пример "географического" кода для определения параметров локализации
(используются функции GetUserDefaultLangID GetLocaleInfo GetUserGeoID GetGeoInfo ) :

PHP код:

OutFile "GetGeoInfo_test.exe"

!include LogicLib.nsh
LCTYPE Constants   -  https://msdn.microsoft.com/en-us/library/ms906223.aspx
!define LOCALE_SCOUNTRY 6
!define LOCALE_SENGCOUNTRY 4098
!define LOCALE_SENGLANGUAGE 0x00001001
;  SYSGEOTYPE enumeration  -  https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd374071(v=vs.85).aspx
!define GEOCLASS_NATION 16
!define GEOID_NOT_AVAILABLE -1
!define GEO_ISO2 4
!define GEO_ISO3 5
!define GEO_OFFICIALNAME 9
!define GEO_LATITUDE 2
!define GEO_LONGITUDE 3

Section
System
::Call 'KERNEL32::GetUserDefaultLangID()i.r0'
    
DetailPrint LANGID=$0  ;  ID языкапо умолчанию используемого в локали текущего пользователя
System
::Call 'KERNEL32::GetLocaleInfo(i$0,i${LOCALE_SENGCOUNTRY},t.r1,i1000)'
    
DetailPrint LOCALE_SENGCOUNTRY=$1  Полное английское название страны региона
System::Call 'KERNEL32::GetLocaleInfo(i$0,i${LOCALE_SCOUNTRY},t.r1,i1000)'
    
DetailPrint LOCALE_SCOUNTRY=$1  Полное локализованное название страны региона.
System::Call 'KERNEL32::GetLocaleInfo(i$0,i${LOCALE_SENGLANGUAGE},t.r1,i1000)'
    
DetailPrint LOCALE_SENGLANGUAGE=$;  Полное английское название языка по международному стандарту кода языков ISO 639 )

текущий регион (местоположение)
Table of Geographical Locations  -  https://msdn.microsoft.com/en-us/library/dd374073.aspx
System::Call 'KERNEL32::GetUserGeoID(i${GEOCLASS_NATION})i.r0'
    
DetailPrint GEOID=$Geographical location identifier (Decimal). 203 Russia
${If} $<> ${GEOID_NOT_AVAILABLE} ; Only available if the user has set a country/location
${AndIf} $!= "error" GetUserGeoID is WinXP+

Извлекаем информацию о заданном географическом местоположении на основании GeoID
System
::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_ISO2},t.r1,i1000,i0)'
    
DetailPrint GEO_ISO2=$1  ;  2-буквенный код страны региона
System
::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_ISO3},t.r1,i1000,i0)'
    
DetailPrint GEO_ISO3=$1  ;  3-буквенный код страны региона
System
::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_OFFICIALNAME},t.r1,i1000,i0)'
    
DetailPrint GEO_OFFICIALNAME=$1  ;  Официальное название страны
System
::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_LATITUDE},t.r1,i1000,i0)'
координаты расположения страны (точка на карте в центре страны)
    
DetailPrint GEO_LATITUDE=$1  Широта местаЭто значение число с плавающей точкой.
System::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_LONGITUDE},t.r1,i1000,i0)'
    
DetailPrint GEO_LONGITUDE=$1  Долгота местаЭто значение числo с плавающей точкой.
${EndIf}
SectionEnd 

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

MKN 25-10-2015 11:12 2567889

Да... Похоже для определения Windows 10 надо использовать новую функцию - IsWindowsVersionOrGreater
http://stackoverflow.com/questions/3...ect-windows-10
http://www.tek-tips.com/faqs.cfm?fid=7848

Осталось адаптировать эту функцию под NSIS...

MKN 27-10-2015 13:01 2568673

Вариант определения major и minor версий ОС с помощью функции NetWkstaGetInfo.
В Win 10 работатет (и с флешки тоже)

Код:

OutFile WinVer-NetWkstaGetInfo.exe
InstallDir $TEMP
ShowInstDetails show
RequestExecutionLevel admin
Page instfiles
# Примечание: В старых версиях NSIS (в том числе 2,46) System plug-in не поддерживае тип р, нужный для правильной работы кода

; используется структура WKSTA_INFO_100 https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa371402(v=vs.85).aspx
; а именно : DWORD wki100_ver_major  и  DWORD wki100_ver_minor;

Section
    System::Call "netapi32::NetWkstaGetInfo(pn,i100,*p.R1)i.R2" 
    System::Call "*$R1(i,p,p,i.R3,i.R4)"
# в $R3 - основной номер версии ОС ver_major, в $R4 - доп. номер версии**ver_minor
    IntOp $R0 $R3 << 16
    IntOp $R0 $R0 | $R4
    System::Call "netapi32::NetApiBufferFree(pR1)"
;Результат в шестнадцатеричной системе счисления
    # 0x00050000  5.0  Windows 2000
    # 0x00050001  5.1  Windows XP
    # 0x00050002  5.2  Windows XP (x64),  Windows Server 2003, Windows Server 2003 R2
    # 0x00060000  6.0  Windows Vista,        Windows Server 2008
    # 0x00060001  6.1  Windows 7,                Windows Server 2008 R2
    # 0x00060002  6.2  Windows 8,                Windows Server 2012
    # 0x00060003  6.3  Windows 8.1,            Windows Server 2012 R2
    # 0x000A0000  10.0 Windows 10,            Windows Server Technical Preview
    IntFmt $R0 "0x%08X" $R0
DetailPrint "$R0"
; получаем ver_major и ver_minor "в десятичном виде"
    IntOp $0 $R0 >> 16
    IntOp $1 $R0 & 0xFFFF
DetailPrint "$0.$1"
SectionEnd


wolkow70 27-10-2015 14:57 2568712

MKN,
Я для своих нужд так сделал:

Var IsOSWin10
StrCpy $IsOSWin10 "0"

Push $R0
Push $R1
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "ProductName"
StrCpy $R1 $R0 10
${If} $R1 == "Windows 10"
StrCpy $IsOSWin10 "1"
${EndIf}
Pop $R1
Pop $R0

${If} $IsOSWin10 == "1"
Выполняем комманды для Windows 10
${EndIf}

kotkovets 27-10-2015 21:40 2568852

Цитата:

Цитата MKN
Вариант определения major и minor версий ОС с помощью функции NetWkstaGetInfo »

будет время попытаюсь, вшить эти директивчики десяточные в winver2
Цитата:

Цитата MKN
# Примечание: В старых версиях NSIS (в том числе 2,46) System plug-in не поддерживае тип р, нужный для правильной работы кода »

нормально всё работает на 2,46, вместо p - i (integer)

wolkow70 29-10-2015 07:37 2569271

MKN,
Подкорректируйте пожалуйста код NetWkstaGetInfo для 2,46, с учетом замечания
kotkovets,
Цитата:

Цитата kotkovets
нормально всё работает на 2,46, вместо p - n (integer) »


MKN 29-10-2015 10:34 2569318

wolkow70,
Можно ещё проще, без канители с конвертированием. ( Я ведь такой код уже выкладывал в прошлом году... )
Код:

System::Call  "netapi32::NetWkstaGetInfo(i0, i100, *i r0 r0) i.r6"
System::Call  "*$0(i.r1, w.r2, w.r3, i.r4, i.r5)"
MessageBox MB_OK "$2 $3 domain (platform_id $1 - ver OS $4.$5) "
System::Call  "netapi32::NetApiBufferFree(*i r0) i.r6"

но, как рекомендуют, если вдруг функция выполнится с ошибкой , так :
Код:

!include LogicLib.nsh
System::Call "netapi32::NetWkstaGetInfo(i0, i100, *i 0 r0) i.r1"
${If} 0 = $1
System::Call "*$0(i.r1, w.r2, w.r3, i.r4, i.r5)"
MessageBox MB_OK "$2 $3 domain (platform_id $1 - ver OS $4.$5) "
${EndIf}
${IfThen} $0 <> 0 ${|} System::Call "netapi32::NetApiBufferFree(ir0)" ${|}

Есть ещё такой занятный код - версия ОС берётся из ресурсов какой-либо системной DLL, например из kernel32.dll.
Работает в Win10

Код:

Outfile "OS-Info_test.exe"

!ifndef RT_VERSION
!define RT_VERSION      16
!endif
!ifndef VS_FILE_INFO
!define VS_FILE_INFO    ${RT_VERSION}
!endif
!ifndef VS_VERSION_INFO
!define VS_VERSION_INFO 1
!endif

Section
    StrCpy $R0 0
    System::Call 'kernel32::LoadLibrary(t"kernel32.dll")p.R1'  ;  System::Call "kernel32::LoadLibrary(t '\path\your.dll(exe)') i .r0"
    IntCmp $R1 0 error
    System::Call 'kernel32::FindResource(pR1,p${VS_VERSION_INFO},p${VS_FILE_INFO})p.R2'
    IntCmp $R2 0 ok
    System::Call 'kernel32::LoadResource(pR1,pR2)p.R3'
    IntCmp $R3 0 ok
    System::Call 'kernel32::LockResource(pR3)p.R4'
    IntCmp $R4 0 ok
    System::Call "*$R4(&i2,&i2.R5,&i2,&w16,&i2,i,i,i.R6)"
    IntCmp $R5 0 ok
    IntFmt $R0 "0x%08X" $R6
ok:
    System::Call "kernel32::FreeLibrary(pR1)"
error:
IntOp $0 $R0 >> 16
IntOp $1 $R0 & 0xFFFF
DetailPrint "$0.$1"
MessageBox MB_OK "ver $0.$1"
SectionEnd

Этот код можно использовать для определения версий не только DLL, но и EXE.
Жаль, что только до одного знака подверсии... Возможно можно как то подкорректировтаь...

Также интересна функция System::Call 'ntdll::RtlGetVersion , работающая в Win10
Но с её синтаксисом я не разобрался...

wolkow70 29-10-2015 13:28 2569380

MKN,

Цитата:

Цитата MKN
Можно ещё проще, без канители с конвертированием. ( Я ведь такой код уже выкладывал в прошлом году... ) »

Похоже, что-то не то в конце получается:

DetailPrint
0x00000000
0.0
Completed

MKN 29-10-2015 13:40 2569385

Цитата:

Цитата wolkow70
Похоже, что-то не то в конце получается: »

У меня всё нормально работает и после компиляции NSIS 3 и после NSIS 2.46 и на всех ОС.

wolkow70 29-10-2015 13:48 2569388

Цитата:

Цитата MKN
У меня всё нормально работает и после компиляции NSIS 3 и после NSIS 2.46 и на всех ОС. »

Можно более полный блок кода?

MKN 29-10-2015 15:05 2569419

Цитата:

Цитата wolkow70
Можно более полный блок кода? »

:) Куда уж полнее, чем уже дан... Выложи ка свой, не работающий код.

wolkow70 29-10-2015 17:29 2569463

MKN,

Собственно с вашего копировал...

Код:

OutFile WinVer-NetWkstaGetInfo.exe
InstallDir $TEMP
ShowInstDetails show
RequestExecutionLevel admin
Page instfiles
!include LogicLib.nsh
# Примечание: В старых версиях NSIS (в том числе 2,46) System plug-in не поддерживае тип р, нужный для правильной работы кода

; используется структура WKSTA_INFO_100 https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa371402(v=vs.85).aspx
; а именно : DWORD wki100_ver_major  и  DWORD wki100_ver_minor;

Section

System::Call "netapi32::NetWkstaGetInfo(i0, i100, *i 0 r0) i.r1"
${If} 0 = $1
System::Call "*$0(i.r1, w.r2, w.r3, i.r4, i.r5)"
MessageBox MB_OK "$2 $3 domain (platform_id $1 - ver OS $4.$5) "
${EndIf}
${IfThen} $0 <> 0 ${|} System::Call "netapi32::NetApiBufferFree(ir0)" ${|}

;Результат в шестнадцатеричной системе счисления
    # 0x00050000  5.0  Windows 2000
    # 0x00050001  5.1  Windows XP
    # 0x00050002  5.2  Windows XP (x64),  Windows Server 2003, Windows Server 2003 R2
    # 0x00060000  6.0  Windows Vista,        Windows Server 2008
    # 0x00060001  6.1  Windows 7,                Windows Server 2008 R2
    # 0x00060002  6.2  Windows 8,                Windows Server 2012
    # 0x00060003  6.3  Windows 8.1,            Windows Server 2012 R2
    # 0x000A0000  10.0 Windows 10,            Windows Server Technical Preview
    IntFmt $R0 "0x%08X" $R0
DetailPrint "$R0"
; получаем ver_major и ver_minor "в десятичном виде"
    IntOp $0 $R0 >> 16
    IntOp $1 $R0 & 0xFFFF
DetailPrint "$0.$1"
SectionEnd


MKN 29-10-2015 17:49 2569471

wolkow70,
В примерах были разные переменные для версий. И во втором варианте НЕ нужно кода конвертации.
Т.е. в итоге :
Код:

OutFile WinVer-NetWkstaGetInfo.exe
InstallDir $TEMP
ShowInstDetails show
RequestExecutionLevel admin
Page instfiles
!include LogicLib.nsh

Section
System::Call "netapi32::NetWkstaGetInfo(i0, i100, *i 0 r0) i.r1"
${If} 0 = $1
System::Call "*$0(i.r1, w.r2, w.r3, i.r4, i.r5)"
;MessageBox MB_OK "ver OS $4.$5) "
DetailPrint "$4.$5"
${EndIf}
${IfThen} $0 <> 0 ${|} System::Call "netapi32::NetApiBufferFree(ir0)" ${|}
SectionEnd


Dodakaedr 03-11-2015 08:35 2570942

Объясните, пожалуйста, почему если указать в строке 'StrCmp $R0 "0"' 0 +5 сообщение показываеться, а если +4 то нет.
Код
Код:

outfile "test.exe"
!include "Registry.nsh"
Autoclosewindow true
Silentinstall silent
section "Main"
${registry::KeyExists} "HKCU\Software\11" $R0
StrCmp $R0 "0" 0 +4
${registry::MoveKey} "HKCU\SOFTWARE\11" "HKCU\SOFTWARE\11_backup" $R4
${registry::Unload}
goto +2
MessageBox mb_ok|mb_iconinformation "Ключа нет"
quit
sectionend


K.A.V. 03-11-2015 10:00 2570968

Цитата:

Цитата Dodakaedr
Объясните, пожалуйста, почему если указать в строке 'StrCmp $R0 "0"' 0 +5 сообщение показываеться, а если +4 то нет. »

Потому что строки:
Код:

${registry::MoveKey} "HKCU\SOFTWARE\11" "HKCU\SOFTWARE\11_backup" $R4
${registry::Unload}

это не команды, а макросы, а в макросах может содержаться несколько команд
Макрос в NSIS своеобразная "оболочка" для команд, в макросы можно заключить несколько часто используемых команд+удобно потом ориентироваться в коде
Т.е. прописывая сроку с макросом, при компиляции эта самая строка может развернуться в несколько десятков строк (в зависимости от команд, которые прописаны в теле макроса) и, соответственно, при использовании всяких +2 +3 +5 прыжков на строку, которая прописана за макросом, может оказаться проблемой и вы получите нерабочий/не правильно работающий код

Конкретно в вашем коде - макрос ${registry::MoveKey} содержит в себе 2 строки команд:
Код:

!macro registry::MoveKey _PATH_SOURCE _PATH_TARGET _ERR
        registry::_MoveKey /NOUNLOAD `${_PATH_SOURCE}` `${_PATH_TARGET}`
        Pop ${_ERR}

!macroend

Из-за чего ваш код стал не рабочим
Для решения этой проблемы либо создавайте метку и указывайте её в качестве цели "прыжка" (за место +4), либо еще лучше, пользуйтесь конструкциями с ${If}
Код:

outfile "test.exe"
!include "Registry.nsh"
Autoclosewindow true
Silentinstall silent
section "Main"
${registry::KeyExists} "HKCU\Software\11" $R0
${If} $R0 == "0"
  ${registry::MoveKey} "HKCU\SOFTWARE\11" "HKCU\SOFTWARE\11_backup" $R4
  ${registry::Unload}
${Else}
  MessageBox mb_ok|mb_iconinformation "Ключа нет"
${EndIf}
quit 
sectionend


Sancho5555 03-11-2015 14:19 2571071

У меня такой вопрос, как сделать перенос строки $\r$\n с помощью команды SendMessage $ListBox ${LB_ADDSTRING}?

Код:

${NSD_CreateListBox} 100 40 20% 12u ""
Pop $ListBox

Function
; Код
SendMessage $ListBox ${LB_ADDSTRING} 0 "STR:Строка1$\r$\nСтрока2" ; перенос строки $\r$\n не работает
FunctionEnd

Function
; Код
SendMessage $ListBox ${LB_ADDSTRING} 0 "STR:Строка1$\r$\nСтрока2"
FunctionEnd

Function
; Код
SendMessage $ListBox ${LB_ADDSTRING} 0 "STR:Строка1$\r$\nСтрока2"
FunctionEnd


K.A.V. 03-11-2015 16:26 2571122

Цитата:

Цитата Sancho5555
У меня такой вопрос, как сделать перенос строки $\r$\n с помощью команды SendMessage $ListBox ${LB_ADDSTRING}? »

Какой перенос строки у ListBox'a?
Этот элемент представляет собой список строк, "однострочных строк" если можно так выразиться, никакого переноса там не может быть

ZaxBoys66 09-11-2015 21:37 2573160

Two mode instalation: Portable and Standard in to single installer

https://mega.co.nz/#!wwYHHQgJ!zdmS5T...VZpdj4CCE85GSw

Compile With NSIS Unicode

https://mega.co.nz/#!1pgTxRZK!KaG_RJ...Xm0Vo2PLyEeDbo

Dodakaedr 16-11-2015 22:42 2575532

Подскажите, пожалуйста, какие есть способы шифровки\дешифровки файлов в nsis. Требуется зашифровать содержимое *.txt файла и *.reg файла.

MKN 17-11-2015 12:24 2575682

Dodakaedr,
http://nsis.sourceforge.net/DcryptDll_plug-in
http://nsis.sourceforge.net/NsisCrypt_plug-in

Dodakaedr 17-11-2015 12:32 2575687

NsisCrypt_plug-in для строк, не подходит
DcryptDll_plug-in вроде оно, но могу понять имеющийся там пример. Можете привести пример конкретно по шифровки\дешифровки txt, reg файлов?

MKN 17-11-2015 13:41 2575708

Dodakaedr,
См. пример http://nsis.sourceforge.net/NSIS_Ins...ion_Protection
а также DcryptDllReadme.html
Конкретно для шифрования строк может быть полезен плаг : http://nsis.sourceforge.net/Blowfish_plug-in

Salmo 20-11-2015 16:06 2577041

Добрый день уважаемые... Для фильтрации зависших приложений всегда пользовался к\с - tasklist /fi "status eq not responding", но не везде есть эта утилита. Подскажите, пожалуйста, как на NSIS определять статус приложения, найти зависшее и сделать дальнейшие манипуляции с ним... Спасибо.

MKN 20-11-2015 17:11 2577072

Цитата:

Цитата Salmo
как на NSIS определять статус приложения, найти зависшее и сделать дальнейшие манипуляции с ним... »

Это возможно, только если кто то из программистов возьмётся (что маловероятно) адаптировать для NSIS следующее :
http://www.manhunter.ru/assembler/19...ilozheniy.html
http://rsdn.ru/article/qna/baseserv/hungapp.xml

K.A.V. 20-11-2015 18:54 2577111

Цитата:

Цитата Salmo
как на NSIS определять статус приложения, найти зависшее и сделать дальнейшие манипуляции с ним »

+
Цитата:

Цитата MKN
Это возможно, только если кто то из программистов возьмётся (что маловероятно) адаптировать для NSIS следующее : »

Можно взять функцию IsHungAppWindow и подсовывать ей HWND окна приложения (если речь о каком-то конкретном приложении)
Перечислить все окна в системе уже знаете как из справочника, если нужно получить список всех не отвечающих приложений

Код:

findwindow $0 notepad
System::Call user32::IsHungAppWindow(i$0)i.r1

$1 = 1 если приложение не отвечает

Salmo 21-11-2015 23:06 2577558

K.A.V., Добрый день\вечер. кодик написал, скомпилировал, зависшие окна находит.... но теперь надо по дескриптору окна определить имя процесса\исполняемого файла...как? Не судите строго, я занимаюсь этим не регулярно и инфа в старых мозгах не держится... :sorry:

K.A.V. 21-11-2015 23:40 2577565

Цитата:

Цитата Salmo
по дескриптору окна определить имя процесса\исполняемого файла. »

Получаем сведения о процессе по HWND окна

Salmo 22-11-2015 00:25 2577578

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

Salmo 27-11-2015 20:58 2579455

Добрый вечер. Кто подскажет причину того, что при использовании примера из справки раздела Работа с процессами, ProcessFunc.nsh, этот код на Windows 8.1 x64 (в отличии от ХР) при убивании процесса explorer и повторном запуске командой Exec "explorer.exe", не приводит к загрузке Рабочего стола, а открывается только (и то редко, чаще остается голый фон) папка "Этот компьютер"? Такая же проблема у утилиты jack.exe при перезапуске оболочки (ну это к слову)

${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}

Продолжу...

Добавил полный путь в команду Exec "$WinDir\explorer.exe" и Рабочий стол загрузился. Посмотрел в Анвире разницу в командах запуска. При использовании системой переменной Path Explorer запускался через процесс svchost.exe, что приводило к открытию папки, а с полным путем прямой командой exe_шником от имени пользователя, что приводило к загрузке стола. Так что использовать Path не всегда предсказуемо...

MKN 10-12-2015 18:13 2583477

NSIS 2.47 released December 8, 2015
http://sourceforge.net/p/nsis/news/2...-247-released/

Kopejkin 11-12-2015 13:36 2583763

NSIS 2.48 Released December 10, 2015

Serg866 12-12-2015 16:06 2584134

А что у них за прикол обновлять вторую и третью версию НСИС?
Может кто знает чем отличаются 2.48 и 3.0b2?

Flix 12-12-2015 17:25 2584145

Цитата:

Цитата Serg866
Может кто знает чем отличаются 2.48 и 3.0b2? »

Если коротко:
3.хх — полноценная поддержка Unicode.
2.48 и ниже — только ANSI.

wolkow70 15-12-2015 17:00 2585156

Salmo,
Я делаю так:

ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 700
StrCmp $0 0 0 NotExec
${If} ${RunningX64}
${DisableX64FSRedirection}
Exec "explorer.exe"
${EnableX64FSRedirection}
${Else}
Exec "explorer.exe"
${EndIf}
NotExec:

ZaxBoys66 15-12-2015 22:51 2585252

; Please someone help me with this script?
; How can put 1% percentage progress bar and function simultaneously.

!include nsDialogs.nsh
!include LogicLib.nsh
Var hInfo
Var hPBar

Function myTimer
InetBgDL::GetStats
${If} $2 = 0
${NSD_KillTimer} myTimer
${NSD_SetText} $hInfo "Completed. (Status=$0)"
SendMessage $hPBar ${PBM_SETRANGE32} 0 100
SendMessage $hPBar ${PBM_SETPOS} 100 0
Return
${EndIf}
IntOp $2 $2 + $1
StrCmp $4 "" 0 +2
StrCpy $4 "?"
${NSD_SetText} $hInfo "Status=$0$\nCompleted $1 of $2 files$\nDownloaded $3 of $4 bytes"
SendMessage $hPBar ${PBM_SETRANGE32} 0 $4
SendMessage $hPBar ${PBM_SETPOS} $3 0
FunctionEnd

Function myPage
nsDialogs::Create 1018
Pop $0

${NSD_CreateLabel} 0 0 100% 50% "Starting download..."
Pop $hInfo

${NSD_CreateProgressBar} 0 55% 100% 10u ""
Pop $hPBar

${NSD_CreateTimer} myTimer 1000
InetBgDL::Get /RESET "https://download.mozilla.org/?product=firefox-41.0.2-SSL&os=win&lang=en-US" "$PluginsDir\ff.exe" /END

nsDialogs::show
${NSD_KillTimer} myTimer
FunctionEnd

Page Custom myPage
Page InstFiles

MaGoth 16-12-2015 15:30 2585422

Цитата:

Цитата Flix
Если коротко:
3.хх — полноценная поддержка Unicode.
2.48 и ниже — только ANSI. »

Шта ?! :o
2.48 и ниже Юникод также поддерживают по полной и лучше чем 3.0 (!)
2.48 сейчас уже в юнике выйти должна..
Различия в версиях 2х и 3х, только в ориентире 3-й на УГ ОСи Мелкософта, Вин7, 8, 10...

Flix 16-12-2015 22:34 2585525

MaGoth, прежде чем нести ахинею, почитайте историю официальных релизов.

Версия 3.0 альфа (релиз 19 мая 2013), цитата
"MakeNSIS can now generate ANSI and Unicode installers. Source files can be UTF8SIG, UTF16BOM or traditional MBCS text files (which are converted to Unicode with ACP unless you specify a different codepage). The default plugins are now stored in sub-folders based on their CPU target and character set encoding."

MaGoth 16-12-2015 23:37 2585548

Эм. т.е. я по твоему не в официальном работаю 2.46.5 Unicode ?! :)

MKN 17-12-2015 08:35 2585594

Наверное вся разница в том, что версии 2.46 - две: ANSI и Unicode
А версия 3 - одна, совмещающая обе кодировки + якобы адаптирована под новые ОС + учтены баги (выявленные) v2.46...

Flix 17-12-2015 12:44 2585685

Цитата:

Цитата MaGoth
я по твоему не в официальном работаю 2.46.5 Unicode ? »

Да! Это сторонняя разработка на базе исходного кода NSIS - форк. Разработчики официальной версии NSIS никакого отношения к вашей 2.46.5 Unicode не имеют, не развивают её и не разрабатывают. Загляните в репозитарий официальной разработки NSIS на sourceforge и найдите там вашу 2.46.5 Unicode.
Цитата:

Цитата MKN
А версия 3 - одна, совмещающая обе кодировки »

Верно. Версия 3 позволяет создать инсталлятор как в кодировке ANSI, так и в Unicode. :)

MaGoth 18-12-2015 06:16 2586017

Цитата:

Цитата Flix
Да! Это сторонняя разработка на базе исходного кода NSIS - форк. »

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

Ибо, идём на страничку разрабов "оригинальной" версии Нсис, Project Members и видим на ней в числе разрабов этого товарища: Jim Park.

А теперь идем на страницу репозитария Гитхаба для Юникодного Нсис: jimpark/unsis и наблюдаем там же в авторах, все того-же самого Джима.


Очень странное утверждение, когда разраб один, а разработка сторонняя...

Flix 19-12-2015 11:10 2586366

Цитата:

Цитата MaGoth
Очень странное утверждение, когда разраб один, а разработка сторонняя... »

Это не мое утверждение. Так написано на главной страничке NSIS. :)

MKN 19-12-2015 11:17 2586370

Натолкнулся на статью : Почему вам (никогда) не следует использовать ShellExecute и WinExec
http://www.gunsmoker.ru/2015/01/neve...llExecute.html

Вот те раз...
Цитата:

Говоря кратко: ShellExecute и WinExec - это устаревшее *овно мамонта начала 90-х годов. Они созданы в действительно доисторические времена. 640 Кб. Сегменты. Ближние и дальние указатели. Нет виртуальной памяти. Кооперативная многозадачность. Эти функции устарели в 1995 году. Ни один код, написанный после 1995 года, не должен использовать эти функции.

Правильное решение
Ответ: вместо функции ShellExecute следует использовать функцию ShellExecuteEx, а вместо функции WinExec следует использовать функцию CreateProcess.

K.A.V. 19-12-2015 12:43 2586397

Цитата:

Говоря кратко: ShellExecute и WinExec - это устаревшее говно мамонта начала 90-х годов. Они созданы в действительно доисторические времена. 640 Кб. Сегменты. Ближние и дальние указатели. Нет виртуальной памяти. Кооперативная многозадачность. Эти функции устарели в 1995 году. Ни один код, написанный после 1995 года, не должен использовать эти функции.
Вообще без комментариев. Думаешь, есть прогеры, которые пользуются функцией WinExec? Сколько ей лет?
Такое ощущение, что автор застрял в каком-то прошлом типа 90-го года, тогда был программистом, а потом уснул, проснулся тем же программистом в 2015 году и написал сразу же статью, чтобы предостеречь современных прогеров от использования WinExec в своём коде

Цитата:

Как мы знаем, в современных 32-битных (и выше) Windows (т.е. Windows 95 и старше)
Может, мой мозг неправильно понимает суть написанного предложения, но я понял это как:
Windows 95 - современная

Цитата:

Цитата MKN
Натолкнулся на статью »

Сделай вид, что не видел её

MKN 19-12-2015 13:12 2586406

Цитата:

Цитата K.A.V.
есть прогеры, которые пользуются функцией WinExec? »

Гы... В прошлом году здесь упоминали. Для запуска батника с скрытым окном консоли.
System::Call 'kernel32.dll::WinExec(t "$EXEDIR\My.bat", i 0) i.r0'
И ведь работает... :)

K.A.V. 19-12-2015 14:28 2586435

Цитата:

Цитата MKN
Гы... В прошлом году здесь упоминали »

Я не про NSIS со всякими обходными путями решения, я про прогеров, пишущих на нормальном языке типа с++
В винде куча функций типа WinExec, которые давно устарели и существуют только в целях совместимости при переходе из оси в ось

Цитата:

Цитата MKN
И ведь работает... »

Код:

execshell open "$desktop\1.bat" "" SW_HIDE
и ведь это тоже работает...но кому-то проще было заюзать винапи :)

ZaxBoys66 21-12-2015 20:09 2587165

Please help my with this script

How can I synchronize percentage at the same time progress bar.

MKN 22-12-2015 12:49 2587352

ZaxBoys66,

Use http://nsis.sourceforge.net/Inetc_plug-in

Цитата:

inetc::get /caption "2005 report" /canceltext "interrupt!" "http://download.ap.bittorrent.com/track/stable/endpoint/utorrent/os/windows" "$EXEDIR\uTorrent.exe" /end
Pop $1 # return value = exit code, "OK" means OK
MessageBox MB_OK "Download Status: $1"

Serg866 25-12-2015 01:53 2588127

Друзья! Вот такой к вам вопрос:
Можно ли добавлять кликабельные ссылки в MessageBox ?
Например всплывает мессадж с ошибкой и там ссылка на страницу с подробным описанием ошибки и методами её исправления.

MKN 25-12-2015 08:26 2588147

Цитата:

Цитата Serg866
Можно ли добавлять кликабельные ссылки в MessageBox ? »

Нет.

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

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

Или, самое простое - обычный MessageBox , с текстом-описанием ошибки и заключительный вопрос : "Открыть такую то страницу для детальной информации об ошибке ?" + кнопки "Да" "Нет"

Serg866 25-12-2015 12:20 2588216

Цитата:

Цитата MKN
Можно использовать messagebox plugin, скомпоновав messagebox таким образом, чтобы в нём был и нужный текст
и кнопка(и) с надписью-ссылкой, кликнув которую, открываешь нужную страницу. »

А где найти данный плагин и будет ли он работать с третьей версией НСИС?

http://nsis.sourceforge.net/MessageBox_plug-in
как я понимаю автор сам удалил свою разработку...

Sancho5555 25-12-2015 13:19 2588249

Вложений: 1
Serg866,
С третьей плагин работает.

MKN 25-12-2015 16:46 2588298

Собственные MessageBox (с кликабельными ссылками и пр.) можно делать с помощью DlgHost Plugin
http://nsis.sourceforge.net/File:DlgHostPlugin.zip

Пример :

PHP код:

!include nsDialogs.nsh
OutFile 
"DlgHostDialog-test.exe"
Page custom MyPage
Page InstFiles
Var dlg
Var Link

!ifndef INC__DLGHOST_PLUGIN
!define INC__DLGHOST_PLUGIN 20110619
!define DLGHOST_DLGBOXMSG_INITDLG 0
!define DLGHOST_DLGBOXMSG_SHOWDLG 1
!endif

Function 
CloseDlgHostDialog
Pop 
$0
DlgHost
::Close
FunctionEnd

Function ShowNSDChildDlg
GetFunctionAddress 
$0 MyMB
DlgHost
::DlgBox "* $0 p 150u 100u Заголовок DlgBox"
FunctionEnd

Function MyPage
nsDialogs
::Create 1018
Pop $dlg
${NSD_CreateLabel125u 50u 80u 10u "MyPage"
nsDialogs::Show
FunctionEnd

Function MyMB
${Select} $0
${Case} ${DLGHOST_DLGBOXMSG_INITDLG}
nsDialogs::Create 1018
Pop 
$1
DlgHost
::SetClient $1
    
${NSD_CreateLabel5u 5u 80u 25u "MessageBox Txt1$\nMessageBox Txt2$\nMessageBox Txt3"
Pop $1

${NSD_CreateLink5u 30u 80u 10u "MyLink"
Pop $Link
${NSD_OnClick$Link ClickMyLink
        
${NSD_CreateButton25604515u "&Close"
Pop $1
${NSD_OnClick} $1 CloseDlgHostDialog
    
${Case} ${DLGHOST_DLGBOXMSG_SHOWDLG}
nsDialogs::Show
${EndSelect}
FunctionEnd

Function ClickMyLink
ExecShell 
"open" "http://forum.oszone.net" 
FunctionEnd

Section
Call ShowNSDChildDlg
SectionEnd 

ShowNSDChildDlg вызываете ессно откуда надо и при необходимых условиях.
Содержимое DlgHost.nsh включено в код.

MaGoth 26-12-2015 02:18 2588440

Вопрос имеется.
Есть ли какая-то специфика в создании ярлыка для раб стола и меню пуска, и прикручивании к нему определенной иконки ?!
Ибо сделал у себя работает у других нет. :dont-know

MKN 26-12-2015 09:54 2588456

Цитата:

Цитата MaGoth
Есть ли какая-то специфика в создании ярлыка для раб стола и меню пуска, и прикручивании к нему определенной иконки ?! »

Всё как всегда... :
CreateShortCut "$DESKTOP\Your Program.lnk" "$INSTDIR\Your Program.exe" "" "$INSTDIR(or FullPatch)\myicon.ico"

Ну, и конечно при необходимости :
SetShellVarContext all
или
SetShellVarContext current

MaGoth 26-12-2015 16:52 2588558

Цитата:

Цитата MKN
Всё как всегда... : »

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

Flix 27-12-2015 11:57 2588741

Вышел релиз NSIS 2.50 (изменения).

Также NSIS v3.0 перешла в стадию beta 3 (изменения).

С наступающим Новым годом! :wink2:

K.A.V. 27-12-2015 12:59 2588751

Цитата:

Цитата Stealthmax
В данном случае, сохраняю состояние в INI и при закрытии установщика восстанавливаю оттуда.
А можно ли это состояние без записи сохранить и восстановить? »

Ну так создайте себе свою переменную и храните в ней значение, в чем проблема то?

MaGoth 01-01-2016 20:19 2590387

Привет народ,
Подскажите где разжиться файликом определения венды последней версии для ЮТФ8 или 16 ЛЕ?
И напомните плиз, как запустить консоль без вывода ее окон, помню что где-то было это расписано, даже делал раньше но в справке ни нашел..

Спасибо.

K.A.V. 01-01-2016 20:44 2590401

Цитата:

Цитата MaGoth
И напомните плиз, как запустить консоль без вывода ее окон, помню что где-то было это расписано, даже делал раньше но в справке ни нашел.. »

nsExec: запуск консольных утилит либо ExecDos плагин

MaGoth 01-01-2016 21:11 2590406

Цитата:

Цитата K.A.V.
nsExec: запуск консольных утилит »

Ога, спс..
А с первым вопросом не подскажешь что и как ?!
Ибо у меня со старым файлом что-то компилится не желает под юником... :dont-know
Особо интересует Вин 10 и определение архитектуры винды.

K.A.V. 02-01-2016 08:05 2590455

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

Dodakaedr 02-01-2016 18:47 2590578

Как программно обновить информацию об ассоциациях?

Serg866 02-01-2016 20:32 2590608

Ребят, всегда мне помогаете с решением вопросов по инсталлеру.
Спасибо вам!

Ещё одна задача у меня возникла:
нужно сделать проверку на размер файла, т.е не хеш-сумма, а именно размер по байтам.
Соответственно если размер совпадает - продолжение установки, если нет - прерывание.

K.A.V. 02-01-2016 20:49 2590611

Цитата:

Цитата Stealthmax
но при этом сами кнопки MessageBox берут язык системной локали. Как обойти это? »

А никак, точнее, "простым стандартным способом" - никак, тоже с этим столкнулся делая многоязычные инсталлеры - просто смирился
Как вариант либо писать свои messagebox (ну типа плагином показывать свои сообщения со своим текстом на кнопках), либо ковырять исходники NSIS...

Цитата:

Цитата Dodakaedr
Как программно обновить информацию об ассоциациях? »

Что имеется в виду? Если честно, не совсем понятно
Если вы про "обновить значки" в системе после манипуляций в реестре, чтобы файлы с новым зарегистрированным расширением приняли описание файла/нужный значок - то может быть вам нужна команда
Код:

${RefreshShellIcons}
подключить не забудьте
Код:

!include "FileFunc.nsh"
Цитата:

Цитата Serg866
нужно сделать проверку на размер файла »

Ну так справочку то когда читать начнём?
GetSize + StrCmp для сравнения с другим размером
Код:

        ${GetSize} "$windir" "/M=explorer.exe /S=0B /G=0" $0 $1 $2
        MessageBox MB_OK|MB_ICONINFORMATION "$0"


ZaxBoys66 02-01-2016 21:52 2590621

I have a question.

It is possible that NSIS can download files using the program Aria2c.exe?

Documentation

https://aria2.github.io/manual/ru/ht...ml#cmdoption-d

Serg866 02-01-2016 22:04 2590623

Цитата:

Цитата K.A.V.
Ну так справочку то когда читать начнём?
GetSize + StrCmp для сравнения с другим размером »

Благодарствую!
Я видел этот пример в справке, но не сразу разобрался как его для себя адаптировать.

Получился такой пример кода секции:

Код:

Section
 ${GetSize} "E:\Program Files\NSIS-3.0b2\Examples" "/M=2.nsi /S=466B /G=0" $0 $1 $2
Pop $0
StrCmp $0 "466" +3
MessageBox MB_OK "Ошибка"
Quit
SectionEnd

вроде работает).

Dodakaedr 02-01-2016 23:40 2590631

K.A.V.,
Цитата:

Если вы про "обновить значки" в системе
Да про это. Спасибо!

MaGoth 03-01-2016 07:02 2590668

Цитата:

Цитата K.A.V.
MaGoth, я с юникодом вообще не работал (и пока не собираюсь), так что по вопросам данных сборок я ничего подсказать не могу »

Членово...


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

  ReadINIStr $0 "$INSTDIR\System\Gothic.ini" "[ENGINE]" "zTexCacheOutTimeMSec"
  MessageBox MB_OK $0

- выводится только пустой массагин-бокс;


или при использовании Энума:
Код:

  EnumINI::Section "$INSTDIR\System\Gothic.ini" "[ENGINE]"
  Pop $R2
; $R2 - количество параметров
  StrCmp $R2 "error" done3
  loop3:
    IntCmp $R2 "0" done3 done3 0
    Pop $R3
    ReadINIStr $R4 "$INSTDIR\System\Gothic.ini" "[ENGINE]" "$R3"

  MessageBox MB_OK|MB_ICONINFORMATION "Параметр: $R3 $\n Значение: $R4"

    IntOp $R2 $R2 - 1
  Goto loop3
  done3:

- вообще ничего не выводится (здесь скорее всего либу надо под Юник пилить ?!).

Кусок кода из ини файла для тестов:
Код:

...
[ENGINE]

zDetailTexturesEnabled=1
; ... here you can define if the engine should support detail textures (default: 1)

zSubdivSurfacesEnabled=0
; ... with this setting you can activate subdiving surface for progressive meshes (untestet, default: 0)

zTexCacheOutTimeMSec=240000
zTexCacheSizeMaxBytes=32000000
zSndCacheOutTimeMSec=10000
zSndCacheSizeMaxBytes=20000000
; ... with these settings you can tune the memory usage of the texture and sound resources.
; if you have more ram than 512 MB, greater values will improve performance
...

Кто-нить сталкивался с подобным и как побороть ?! (Нсиська на юниках... 2.46.5)

Цитата:

Цитата Stealthmax
Как можно принудительно задать язык интерфейса, не используя »

Зачем оно вам нужно?

Цитата:

Цитата Stealthmax
Использую LoadLanguageFile и LangString для отображения сообщений на разных языках, но при этом сами кнопки MessageBox берут язык системной локали. Как обойти это? »

А глянуть можно что у вас за кнопки такие особенные?!

Ибо у меня все стандарное используется и все на мультилангах работает, пример:
Код:

...
  wrong:
  MessageBox MB_YESNO|MB_ICONQUESTION "$(TextInstallationListInv)" IDYES done
    Pop $R0
    Abort
...
  StrCmp $VerifyMessageOnce "done" +3
  MessageBox MB_OK|MB_ICONINFORMATION "$(TextVerifyInstDir)"
  StrCpy $VerifyMessageOnce "done"
  Abort
  done:
...


LangString TextInstallationListInv ${LANG_ENGLISH} "Installation list is invalid.$\r$\nAre you sure you want to continue deinstallation?"
LangString TextInstallationListInv ${LANG_ROMANIAN} "Directorul în care doriți să instalați nu este valid.$\r$\nSunteți sigur că doriți să continuați dezinstalarea?"
LangString TextInstallationListInv ${LANG_GERMAN} "Die Installation Liste ist ungultig.$\r$\nFortsetzen zu deinstallieren?"
LangString TextInstallationListInv ${LANG_RUSSIAN} "Инсталляционный перечень недействителен.$\r$\nВсё равно продолжить деинсталляцию?"
LangString TextInstallationListInv ${LANG_ITALIAN} "Il percorso d'installazione sembra non essere corretto.$\r$\nSei sicuro di voler continuare la disinstallazione?"
LangString TextInstallationListInv ${LANG_CZECH} "Zvolený adresář se zdá být nesprávný.$\r$\nOpravdu chcete pokračovat v odinstalaci?"
LangString TextInstallationListInv ${LANG_POLISH} "Folder instalacji wydaje się być nieprawidłowy.$\r$\nCzy jesteś pewien że chcesz kontynuować odinstalowywanie?"
LangString TextInstallationListInv ${LANG_SPANISH} "El directorio de la instalación parece ser inválido.$\r$\n¿Está seguro que quiere continuar con la desinstalación?"
;--------------------------------
LangString TextVerifyInstDir ${LANG_ENGLISH} "Choose the directory containing installed 'Gothic II - Night of the Raven'."
LangString TextVerifyInstDir ${LANG_ROMANIAN} "Alegeți directorul unde se află instalat 'Gothic II - Noaptea Corbului'"
LangString TextVerifyInstDir ${LANG_GERMAN} "Wählen Sie das Verzeichnis aus, in welchem sich 'Gothic II - Die Nacht des Raben' befindet."
LangString TextVerifyInstDir ${LANG_RUSSIAN} "Выберите каталог, в который установлена игра 'Готика 2 - Ночь Ворона'."
LangString TextVerifyInstDir ${LANG_ITALIAN} "Scegli la cartella in cui è installato 'Gothic II - La Notte del Corvo'."
LangString TextVerifyInstDir ${LANG_CZECH} "Vyberte adresář, v němž je nainstalován 'Gothic II - Noc Havrana'."
LangString TextVerifyInstDir ${LANG_POLISH} "Wybierz folder zawierający zainstalowane 'Gothic II - Noc Kruka'."
LangString TextVerifyInstDir ${LANG_SPANISH} "Elija el directorio que tiene instalado 'Gothic II - La Noche del Cuervo'."


K.A.V. 03-01-2016 09:03 2590672

Цитата:

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

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

У вас:
Код:

ReadINIStr $0 "$INSTDIR\System\Gothic.ini" "[ENGINE]" "zTexCacheOutTimeMSec"
А должно быть:
Код:

ReadINIStr $0 "$INSTDIR\System\Gothic.ini" "ENGINE" "zTexCacheOutTimeMSec"
У вас:
Код:

EnumINI::Section "$INSTDIR\System\Gothic.ini" "[ENGINE]"
А должно быть:
Код:

EnumINI::Section "$INSTDIR\System\Gothic.ini" "ENGINE"

MKN 03-01-2016 10:56 2590690

Цитата:

Цитата Stealthmax
Нарыл тут некий "MessageBox Plug-in", но следы его теряются »

Я ведь уже дал пример своего MB с помощью DlgHost Plugin.

MaGoth 03-01-2016 12:10 2590712

Цитата:

Цитата K.A.V.
В команде ReadINIStr при указании секции из которой мы читаем, символы квадратных скобок не нужны »

Интересно, и чего об этом нигде не отражено? :closed-to
Сейчас проверим в работе..

MaGoth 03-01-2016 19:16 2590836

Цитата:

Цитата Stealthmax
В таком случае кнопка отмены принимает значение системной локали, игнорируя язык установщика. »

Т.е. Кнопки "ОК", "Кансел" и прочее подобное ?! Я правильно понял, это у вас не переводится ?
Здесь скорее всего проблема не в этом, а в том что сам инсталлер подстраивается под язык винды(об этом забывать не стоит).
Например, если вы запустите свой инсталлер в немецкой/английской Винде, то должны увидеть, что эти мессаги сменятся на язык установленный по уполчанию в системе, их не требуется переводить. :yes:
За исключением случаев, в которых вы наклепали своих именований для кноп, но с этим я не парился, поэтому ничего не скажу... :dont-know

MaGoth 03-01-2016 21:16 2590872

Цитата:

Цитата Stealthmax
Ну об этом я и веду речь - очевидный недостаток NSIS. Получается, что часть компонентов заимствована согласно API ОСи, что ни есть правильно, недостаток кода. »

Да, такая привязка очень членовая вещь.. Но опять-же, не в ней может быть дело, приведу как пример случай из своей практики.
Адаптировал одну прогу на 8 лангов, все в ЮТФ 16-ЛЕ, по умолчанию знаю, что все тексты хоть врознь, хоть в кучу будут корректно отображаться на экране. Запускаю польску прогу и вижу кучу ?????
Оказалась проблема в том, что винда по своему некоторые функции мультиланга обрабатывает, не зависимо от того что я хотел бы видеть, но при этом, все тексты корректно отобразились у поляка на компе..
Короче, тут надо реально тестить и смотреть как оно отображается на компе у носителей языка, ну, ли брать в руки бубен и переписывать все это хозяйство под себя.
Но я лично с этим заморачиваться не стал, забил бол на это дело. Что и тебе советую... :yes:

K.A.V. 06-01-2016 09:24 2591613

Цитата:

Цитата Stealthmax
Ну об этом я и веду речь - очевидный недостаток NSIS. Получается, что часть компонентов заимствована согласно API ОСи, что ни есть правильно, недостаток кода. »

лол
Загляните в исходники NSIS и разочаруйтесь в нём раз и навсегда, все (ну или почти все) команды, доступные в NSIS - это API функции (конечно же, если речь ведём про Windows), по вашему мнению получается, что весь NSIS это один сплошной недостаток, т.к. NSIS юзает для функционала команды из библиотек системы.
Я, например, не считаю это каким-то недостатком, что NSIS работает с API, т.к. в этом его уникальность и гибкость, к NSIS можно без труда наклепать плагин для расширения функционала и он будет работать, чего нет "из коробки" - разраб может допилить функционалом через плагин или даже с помощью system-плагина, если нужно не что-то сильно навороченное
Как ни странно, но на NSIS можно писать не только инсталлеры, но и приложения, правда это всё выглядит не очень удобно и функционально, если проект серьёзный

Что касается стандартных текстов на кнопках сообщений - юзается api функция MessageBox и да, никакие строки в NSIS-коде не заставят эту функцию показывать текст в зависимости от языка инсталлера, т.к. текст зависит от языка системы пользователя
Почему не стали писать свой функционал кнопок? А зачем? Какой смысл усложнять код и извращаться с кастомными кнопками в NSIS? В таком виде пользователю хотя бы всегда будет понятно, на какую кнопку он жмёт - Да или Отмена, а не что-то начирканное кастомное писателем инсталлятора, который не дай бог написал свой первый инсталлер и залил его в сеть

MKN 06-01-2016 10:31 2591624

Цитата:

Цитата K.A.V.
показывать текст в зависимости от языка инсталлера »

Для того ведь и делают собственные MessageBox с любыми кнопками и любым на них текстом на любом языке с любыми зависимостями...
В чём проблема... И при SilentInstall_е всё работает, если внятно поставить задачу...

ps К слову, о гибкости NSIS. Сам NSIS + Plugins + необходимые дополнения - и можно сделать практически всё, что душе угодно. :) Лучше нет ни одного подобного инсталлятора, тем более бесплатного... (разве что Inno на пятки наступает... ( но тут уже виноваты ленивые разработчики NSIS и не менее ленивые пользователи_nsis_программеры, которые упорно не хотят улучшать и расширять функционал NSIS :) )

Serg866 08-01-2016 19:05 2592546

Почему-то некоторые антивирусы ругаются на инсталлеры НСИС. Авира и Аваст.

MKN 09-01-2016 09:15 2592659

Цитата:

Цитата Serg866
Почему-то некоторые антивирусы ругаются на инсталлеры НСИС. Авира и Аваст. »

Если бы они (и все остальные) только на NSIS ругались... Брешут ведь, как дурные собаки почти на всё что увидят... :)
Обычное дело для антивирусов , не блещущих интеллектом... :)
Тут поможет только проверенный способ - добавить "угрозу" в исключения антивируса. Но ничто не поможет, если у пользователя параноидальный страх преред любым сообщением антивируса... :)

lavey13 21-01-2016 20:21 2597854

Доброго времени суток господа. Подскажите пожалуйста по вопросу решение которого пока не удается найти. Суть в следующем. Есть несколько nsi скриптов, главный выступает в роли интерфейса с кнопками и некоторым небольшим функционалом, также есть отдельно написанные nsi скрипты, которые я вызываю через exewait из скрипта-интерфейса. Вопрос в следующем, можно ли как то эти отдельные скрипты сразу включить в основной? По принципу подключения плагинов или nsh файлов? Т.к. хочется иметь на выходе один Exe, а не 4 например. Я конечно понимаю, что можно все в один код попробовать перенести, но это осложняется суммарно большим количеством кода, переменных, функций и соответственно большими временными затратами на отладку. Хотелось бы найти более практичный метод. Заранее спасибо.

Dodakaedr 21-01-2016 23:51 2597919

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

outfile "test find key.exe"
!include "Registry.nsh"
!include "logicLib.nsh"

section main
;создание ключа для примера
${registry::Write} "HKLM\SOFTWARE\Classes\CLSID\{EF67C328-46СС-87D7-EA63-D8A946C17D7D}" "" "" "REG_SZ" $8
${registry::Unload}
${registry::Open} "HKLM\SOFTWARE\Classes\CLSID" "/K=1 /G=0 /V=0 /S=0 /NS='46СС'" $0
  ${DoUntil} $0 = 0
      ${registry::Find} $0 "$1" "$2" "$3" "$4"
      StrCpy $9 "$1" 4 -24
      StrCmp $9 '46СС' finish loop
      finish:
      ;${IfThen} "$9" == "" ${|}${Break}${|}  # поиск завершен, выход из цикла
      ${|}${Break}${|}
      ;StrCmp $9 '46СС' 0 +2
      MessageBox mb_ok|mb_iconinformation 'Ключ: $1'
loop:
  ${loop}
  ${registry::Unload}
sectionend


Dodakaedr 24-01-2016 19:24 2598692

Есть какой-то макрос получения ID элемента чужого окна? При запуске чужой программы ID элементов постоянно меняется(в моем случаи id кнопок постоянно разные при запуске чужой программы). Или подскажите, пожалуйста, какие есть еще способы получения хендла кнопок, кроме как GetDlgItem?

K.A.V. 24-01-2016 20:30 2598703

Цитата:

Цитата lavey13
также есть отдельно написанные nsi скрипты, которые я вызываю через exewait из скрипта-интерфейса. Вопрос в следующем, можно ли как то эти отдельные скрипты сразу включить в основной? По принципу подключения плагинов или nsh файлов? »

Так а в чем проблема то? Берёте содержимое не из основного скрипта и запихиваете в отдельный файл с расширением nsh, в основном скрипте инклудите этот файл и всё. Привели бы пример, как у вас там всё выглядит, просто нужно распихать всё по функциям как нужно и в основном скрипте лишь делать вызов конкретных функций

Пример:
Основной файл скрипта
Код:

!include "MyFile.nsh" ; инклудим файл, который лежит рядом с основным скриптом, из этого файла вызовем функцию

Name "TEST"
OutFile "TEST.exe"
                     
Function .onInit 
call Function_MyFile  ; вызываем функцию из MyFile.nsh
MessageBox MB_OK|MB_ICONINFORMATION "$myvar"
FunctionEnd

Section
SectionEnd

MyFile.nsh
Код:

var myvar

Function Function_MyFile
StrCpy $myvar "TEST TEXT"
FunctionEnd

Цитата:

Цитата Dodakaedr
Есть какой-то макрос получения ID элемента чужого окна? »

ID это вы имеете в виду хэндл или идентификатор элемента, который сам разработчик назначает элементу и который прописан в ресурсах?

Цитата:

Цитата Dodakaedr
какие есть еще способы получения хендла кнопок, кроме как GetDlgItem »

Перебором с поиском по типу элемента с помощью FindWindowEx с указанием класса элемента (Button, ComboBox, Edit, Static и т.д.) и имени окна, имя окна у кнопки вроде бы - это её текст (могу ошибаться, отвечаю по памяти, не помню точно, так это или нет)
Какая задача перед вами стоит? Что требуется делать с кнопками?

Dodakaedr 24-01-2016 22:46 2598737

K.A.V.,
Цитата:

Какая задача перед вами стоит? Что требуется делать с кнопками?
Нужно определить идентификатор кнопки, который указывает разработчик, а потом её нажать. Задача то простая, но есть маленькое "но". В моём случаи идентификатор кнопки генерируется при каждом запуске проги новый, что не позволяет точно определить идентификатор(ID) кнопки. Покажите, пожалуйста, пример использования winapi функции findwindowex.

K.A.V. 25-01-2016 07:58 2598778

Dodakaedr, прочитайте в оригинальной справке к NSIS описание команды FindWindow, юзать winapi не обязательно, вам нужно будет написать цикл while и в команде поиска окна указывать в качестве родителя предыдущее найденное окно. Попробуйте написать код сами

MKN 26-01-2016 10:49 2599197

Dodakaedr,
Цитата:

Цитата Dodakaedr
идентификатор кнопки генерируется при каждом запуске проги новый »

Без API наверное не обойтись... В частности - EnumChildWindows. Был хороший макрос, перечисляющий параметры элементов окна. Не то в справочнике, не то на nsis.sourceforge.net...
При меняющихся ID элементов, можно как вариант, скинуть все найденные ID в переменную, а потом, выбирать нужный ID, исходя из порядкового номера элемента.

lavey13 26-01-2016 15:57 2599346

Подскажите еще по такому вопросу. Использую плагин NsisCrypt, при шифровании - дешифровании текста, на моем ПК приложение работает корректно. При запуске его на других ПК появляется ошибка "Error while acquiring Windows CryptoAPI context". Вроде как есть решение, есть баг репорт, но совершенно не пойму как его использовать. Был бы очень благодарен если поможете разобраться.
https://sourceforge.net/p/angabin/bugs/1/

MKN 26-01-2016 17:00 2599364

lavey13,
Похоже, это баг самого плагина.
уже обсуждалось :
http://stackoverflow.com/questions/1...t-on-all-but-d
там же, вроде как и предложен фикс для NsisCrypt.cpp

lavey13 26-01-2016 17:02 2599366

MKN, то есть нужно брать код этого фикса, заменить в исходнике NsisCrypt.cpp и скомпилировать весь проект плагина в dll?

MKN 26-01-2016 17:04 2599367

lavey13,
получается, именно так...

ZaxBoys66 26-01-2016 20:39 2599435

NSIS How to send Email with CMD use bmail.exe or blat.exe

My example not work

ExecWait '"$SYSDIR\cmd.exe" /c $PLUGINSDIR\bmail.exe "bmail -s smtp.mail.yahoo.com -p 587 -t myemail@yahoo.com -f fromemail@yahoo.com -h -a NSIS -b Not Work..."'

MaGoth 27-01-2016 21:54 2599842

Хм. народ вопрос имеется по ини-шкам..
Все правится меняется это хорошо, одна бяда, строки уезжают в конец секции.
Как внести изменения в файл без танцев с бубнами и переездом строк на новое местоположение ?!

Кусок примера инишки значения параметров которые надо изменить.:
Код:

[ENGINE]
...
zTexCacheOutTimeMSec=240000
zTexCacheSizeMaxBytes=100000000
zSndCacheOutTimeMSec=10000
zSndCacheSizeMaxBytes=20000000
...

У кого какие мысли есть ?!

K.A.V. 29-01-2016 17:19 2600473

Dodakaedr, я персонально в личке никому не отвечаю по NSIS, зачем тогда нужен форум?
Я же вам тут написал, при поиске указывайте в качестве родителя предыдущее найденное окно и прочитайте описание команды FindWindow в оригинальной справке, я же не просто так это всё написал.
Ну, а раз вам перечисление не нужно и текст на кнопке не меняется, то вам и цикл не нужен
Ваш код должен быть таким:
Код:

    FindWindow $0 "" "ИМЯ ОКНА ПОДСТАВЬТЕ сами, модеров форума не хочу смущать :)" 

    FindWindow $1 "${WNDCLASS}" "${WNDTITLE}" $0
    FindWindow $2 "${WNDCLASS}" "${WNDTITLE2}" $0
   
    SendMessage $1 ${BM_CLICK} 0 0
    SendMessage $2 ${BM_CLICK} 0 0
    SendMessage $0 ${WM_CLOSE} 0 0

Что делает этот код:
При указании 3-го параметра в команде FindWindow, мы заставляем искать наши кнопки в конкретном окне-родителе, т.е. в окне вашего приложения
Если не понимаете суть родительских-дочерних окон и как это всё устроено - советую почитать инфу на просторах интернета, чтобы было понимание, как всё это дело в винде устроено

MKN 29-01-2016 17:36 2600479

K.A.V.,
FindWindow [HWND] [Class] [Title] работает почему то далеко не со всякими окнами... Есть окна (особливо в некоторых кейгенах), где даже с элемента на элемент нельзя переместиться никакими силами (ни конкретным указанием на, как будто найденные параметры элемента, ни эмуляцией нажатий стрелок, Tab_а и пр.)

K.A.V. 30-01-2016 08:44 2600617

Цитата:

Цитата MKN
FindWindow [HWND] [Class] [Title] работает почему то далеко не со всякими окнами... Есть окна (особливо в некоторых кейгенах), где даже с элемента на элемент нельзя переместиться никакими силами (ни конкретным указанием на, как будто найденные параметры элемента, ни эмуляцией нажатий стрелок, Tab_а и пр.) »

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

Насчет перебора допустим, кнопок, вот вам код, как это должно выглядеть, может кому пригодится
Пример на поиске кнопок и определения их текста в окне MakeNSISW (GUI-комплиятор в папке NSIS)
Скрытый текст
Код:

!include "LogicLib.nsh"
!include "WinMessages.nsh"

Name "TEST"
OutFile "TEST.exe"
                     
Function .onInit 
      StrCpy $1 "1" ; Чтобы while с первого же раза не закрылся
      FindWindow $0 "#32770" "MakeNSISW"
      IsWindow $0 +3 0 ; проверка на существование окна
      MessageBox MB_OK|MB_ICONSTOP "Окно MakeNSISW не найдено"
      quit   
   
      ${While} $1 != "0" ; когда кнопок больше не останется - выход из цикла
        FindWindow $1 "Button" "" $0 $2 ; $0 - указываем, что мы будем искать кнопки в окне MakeNSISW, т.е. указываем окно-родителя, $2 - мы указываем предыдущую найденную кнопку, чтобы не стоять на месте с определением первой кнопки
        SendMessage $1 ${WM_GETTEXTLENGTH} 0 0 $4 ; получаем количество символом текста на кнопке
        IntOp $4 $4 + 1 ; к количеству символов текста на кнопке прибавляем 1, т.к. кнопки у нас с "&"
        System::Call 'User32::GetWindowText(i$1, t.r3, i$4)' ; получаем текст на кнопке
        StrCpy $2 $1 ; помещаем в переменную $2 HWND найденной кнопки, чтобы продолжить поиск кнопок с этой найденной кнопки
        IsWindow $1 0 +2 ; проверяем существование кнопки, чтобы в конце определения не получить лишний мессадж
        MessageBox MB_OK|MB_ICONINFORMATION "HWND кнопки: $1$\nТекст на кнопке: '$3'"
      ${EndWhile}
quit 
FunctionEnd

Section
SectionEnd



Пример на поиске кнопки "Close" в MakeNSISW (GUI-комплиятор в папке NSIS)
Скрытый текст
Код:

!include "LogicLib.nsh"
!include "WinMessages.nsh"

Name "TEST"
OutFile "TEST.exe"
                     
Function .onInit 
      StrCpy $1 "1" ; Чтобы while с первого же раза не закрылся
      FindWindow $0 "#32770" "MakeNSISW"
      IsWindow $0 +3 0 ; проверка на существование окна
      MessageBox MB_OK|MB_ICONSTOP "Окно MakeNSISW не найдено"
      quit

      ${While} $1 != "0" ; когда кнопок больше не останется - выход из цикла
        FindWindow $1 "Button" "" $0 $2 ; $0 - указываем, что мы будем искать кнопки в окне MakeNSISW, т.е. указываем окно-родителя, $2 - мы указываем предыдущую найденную кнопку, чтобы не стоять на месте с определением первой кнопки
        SendMessage $1 ${WM_GETTEXTLENGTH} 0 0 $4 ; получаем количество символом текста на кнопке
        IntOp $4 $4 + 1 ; к количеству символов текста на кнопке прибавляем 1, т.к. кнопки у нас с "&"
        System::Call 'User32::GetWindowText(i$1, t.r3, i$4)' ; получаем текст на кнопке
        StrCpy $2 $1 ; помещаем в переменную $2 HWND найденной кнопки, чтобы продолжить поиск кнопок с этой найденной кнопки
          ${If} $1 != "0" ; проверяем существование кнопки, чтобы в конце определения не входить лишний раз в if
              ${If} $3 == "&Close" ; если текст на кнопке "&Close"  - это наша кнопка
                  MessageBox MB_YESNO|MB_ICONQUESTION "Кнопка Close найдена, нажимаем?" idno +2
                  SendMessage $1 ${BM_CLICK} 0 0
              ${EndIf} 
          ${EndIf}
      ${EndWhile}
quit 
FunctionEnd

Section
SectionEnd


Dodakaedr 30-01-2016 19:56 2600749

Подскажите, существует ли плагин или макрос по работе с фаерволом (добавление, удаление и проверка правил)?

MKN 02-02-2016 10:46 2601639

K.A.V.,
- Поиск нужной кнопки по тексту на кнопке, не годится для случаев, когда никакого текста нет... Т.е. когда на кнопке - скин-картинка с текстом (OK, Cancel и т.п. ).
Такое встречается очень часто. Особенно в окнах, назовём их тактично, так : "продуктов сопровождения для разных приложений" :). Там же , как правило, отключены и табы и др. Нужно поизгиляться для перемещения между разными элементами (комбобоксы с выпадающими списками, разные текстовые поля, кнопки и пр. )
Такие "приложения" - отличный полигон для изучения-применения возможностей NSIS :)

А ещё, совершенно не понятно, как с помощью NSIS можно кликать кнопками в окнах с IEFrame (в инсталляторах Corel и др ).
Для AutoIt для этого вроде как есть специальная библиотека. чего делать в NSIS, не ясно...

Цитата:

Цитата Dodakaedr
существует ли плагин или макрос по работе с фаерволом (добавление, удаление и проверка правил)? »

http://nsis.sourceforge.net/NSIS_Simple_Firewall_Plugin
http://nsis.sourceforge.net/LiteFirewall_Plugin

или использовать команды из скрипта :
http://webistore.ru/administrirovani...andnoj-stroke/

Serg866 03-02-2016 04:39 2601981

Парни, вас приветствует Serg866.

Возникла нестандартная задача, нужно проверить содержимое текстового файла.
По принципу: если есть фраза "version1.1", то один путь установки, если нет - другой путь.
Может примерчики скинете какие-нибудь?
В справке только пример как заменять текст в текстовиках...

BuZzOFF 03-02-2016 09:43 2602032

Цитата:

Цитата Serg866
Возникла нестандартная задача, нужно проверить содержимое текстового файла. »

Увы, сейчас нет nsis'а под рукой...
Тут посмотри => http://nsis.sourceforge.net/WordFind
И в теме тоже были примеры использования ${WordFind}.

MKN 03-02-2016 16:00 2602223

Цитата:

Цитата Serg866
нужно проверить содержимое текстового файла.
По принципу: если есть фраза "version1.1" »

самое простое - NewTextReplace NSIS plugin
работает и с ANSI и с UNICOD

Serg866 05-02-2016 00:25 2602679

Спасибо, господа!

Не хотелось бы плагины подключать сторонние.
Обычно я делаю это только если нельзя решить задачу стандартными средствами НСИС.

Но ${WordFind} что-то сложная штука.
Мне непонятны опции. Задача искать заданное слово во всём текстовом файле, независимо ни от количества строк, ни от чего. Какой параметр надо для этого задать я не пойму.

Что означают параметры +2}}, +2*}, -02, E+1{ и т.д.

BuZzOFF 05-02-2016 08:30 2602711

Цитата:

Цитата Serg866
По принципу: если есть фраза "version1.1", то один путь установки, если нет - другой путь. »

Цитата:

Цитата Serg866
Задача искать заданное слово во всём текстовом файле, независимо ни от количества строк, ни от чего. »

Нужно зациклить. В теме есть примеры. На их основе накидал. Опять же без NSIS'а... Не могу проверить.
Как-то так...
Код:

Section
Call test
${If} $0 == 1
  ; если фраза найдена
${Else}
  ; если фраза не найдена
${EndIf}
SectionEnd

Function test
ClearErrors
${LineSum} "$DESKTOP\test.txt" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обнуляем счетчик
read:
 IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
 IntCmp $R1 $R0 0 0 end ; если значение текущей строки больше, чем общее количество строк в файле - переход на метку end
 ${LineRead} "$DESKTOP\test.txt" "$R1" $R3 ; читаем содержимое строки
 ${WordFind} "$R3" "version1.1" "E+1{" $R2 ; ищем фразу в строке
  IfErrors read 0 ; если фраза не найдена - переход на метку read
 StrCpy $0 1
end:
FunctionEnd


MKN 05-02-2016 10:09 2602728

Цитата:

Цитата Serg866
Не хотелось бы плагины подключать сторонние. »

Какие же это сторонние плагины ? Самые что ни на есть родные - NSIS_овские, которые просто обязаны быть у пользователя. :)
Что за проблема, добавить к имеющейся куче "боксовых" плагинов - ещё один или столько, сколько надо, и писать в скрипте одну-две строчки , вместо полутора десятков...

ps Как вариант, можно так :

PHP код:

OutFile "FileReadFromEnd_Test.exe"
!include "TextFunc.nsh"
!include "WordFunc.nsh"

Section
${FileReadFromEnd"$EXEDIR\MyFile.txt" "Read"
IfErrors 0 +2
MessageBox MB_OK 
"Error (файл не найден)"
SectionEnd

Function Read
${WordFind"$9" "version1.1" "E+1{" $; $9-current line http://nsis.sourceforge.net/FileReadFromEnd
IfErrors notfound found
    found
:
MessageBox MB_OK 'Found' IDOK end
    notfound
:
MessageBox MB_OK 'Not found'
    
end:
Push $0
FunctionEnd 

здесь MessageBox - для наглядности результата построчного поиска "version1.1" , в MyFile.txt (начало поиска - почему то с нижней строки)

Serg866 05-02-2016 14:03 2602845

BuZzOFF, MKN
Ещё раз спасибо, всё разжевали мне.


P.S: нашёл ещё такой вариант
http://nsis.sourceforge.net/Search_for_text_in_file
------------------------------------


единственная проблема:
если текстовик большого размера (5 мб например),
то инсталлер виснет...
Может быть есть решение специально для больших текстовиков?

MKN 05-02-2016 15:42 2602879

Цитата:

Цитата Serg866
единственная проблема:
если текстовик большого размера (5 мб например), то инсталлер виснет...
Может быть есть решение специально для больших текстовиков? »

Это что же за задача такая , где надо использовать такие огромные текстовые файлы ? :) Неужели более неоткуда взять несчастный номер версии ?
Для больших файлов можно использовать изврат с плагином nsisFile. Искать HEX значение искомой строки , "внутри" файла (version1.1 - берём в шестнадцатиричном виде).
Находит пулей.

K.A.V. 05-02-2016 18:08 2602923

Цитата:

Цитата Serg866
если текстовик большого размера (5 мб например),
то инсталлер виснет... »

Он не виснет, он долго думает
Дело, в общем то, не в размере файла, а в количестве строк, давно всем известная проблема NSIS - он не может с одинаковой скоростью читать каждую строку по мере сдвига от начала, говоря простым языком - при использовании команд типа LineRead происходит замедление скорости чтения в зависимости от позиции читаемой строки
Попробуйте написать код с отображением порядкового номера читаемой строки и вы увидите, сколько примерно строк NSIS будет читать без понижения скорости

Serg866 06-02-2016 04:10 2603021

Цитата:

Цитата MKN
Это что же за задача такая , где надо использовать такие огромные текстовые файлы ? Неужели более неоткуда взять несчастный номер версии ?
Для больших файлов можно использовать изврат с плагином nsisFile. Искать HEX значение искомой строки , "внутри" файла (version1.1 - берём в шестнадцатиричном виде).
Находит пулей. »

Ну этот файл - лог закачек. И у каждого юзера этот файл может быть очень большого размера, в зависимости от того сколько контента он скачивал. Вот мне нужно определить наличие в этом логе инфы о скачивании моей программы. Кроме version1.1 там есть ещё название проги.

Попробую nsisFile, благо там есть юникод-версия плагина.
То есть надо определить хекс-значение заданной фразы и прописать это значение, используя nsisFile::FileFindBytes ?
-----------------------

Serg866 06-02-2016 04:54 2603023

Цитата:

Цитата K.A.V.
Он не виснет, он долго думает
Дело, в общем то, не в размере файла, а в количестве строк, давно всем известная проблема NSIS - он не может с одинаковой скоростью читать каждую строку по мере сдвига от начала, говоря простым языком - при использовании команд типа LineRead происходит замедление скорости чтения в зависимости от позиции читаемой строки
»

А можно какой-либо прогресс-бар или же просто сообщение типа "ждите" прикрутить на время обработки файла? Чтоб юзер не думал что установщик завис.

P.S: я почему подумал что завис инсталлер - в диспетчере задач процесс стал жрать большое количество ресурсов и я его вырубил.

K.A.V. 06-02-2016 07:26 2603032

Цитата:

Цитата Serg866
А можно какой-либо прогресс-бар или же просто сообщение типа "ждите" прикрутить на время обработки файла? Чтоб юзер не думал что установщик завис. »

Можете стандартный баннер заюзать, но он маленький по размеру
Либо используйте другие баннеры типа Nxs plug-in
Пример с баннером при поиске файлов:
Скрытый текст

Код:

!include "WinMessages.nsh"
!include "FileFunc.nsh"

Name "TEST"
OutFile "TEST.exe"


                     
Function .onInit
Banner::show ""
Banner::getWindow
  Pop $R1
  GetDlgItem $R2 $R1 1030
  ${Locate} "$WINDIR" "/L=F" "LocateCallBack"
Banner::destroy
 
quit 
FunctionEnd


Function LocateCallBack
  SendMessage $R2 ${WM_SETTEXT} 0 "STR:$R7"
        Push $0
FunctionEnd


Section
SectionEnd


MKN 06-02-2016 09:10 2603041

Цитата:

Цитата Serg866
То есть надо определить хекс-значение заданной фразы и прописать это значение, используя nsisFile::FileFindBytes ? »

Да

Serg866 10-02-2016 05:11 2604359

Дорогие знатоки NSIS и конечно маэстро K.A.V., хочу у вас проконсультироваться относительно файла hosts
То, что мне нужно описано вот в этом примере :
http://forum.oszone.net/post-2507451-1625.html

А вопрос следующий: как такую операцию с изменением файла hosts проделать "втихарца", чтобы ни антивирусы, ни сама система не ругались? Ведь файл-то системный и по сути один из ключевых...
И сопутствующие вопросы - имеет ли значение версия системы 32-битная или 64-битная?
И важен ли тут атрибут RequestExecutionLevel admin, который прописываю в скрипте?

Ну и быть может есть альтернативные способы как заблокировать доступ к сайту с помощью NSIS (без редактирования файла hosts)?

Заранее спасибо, коллеги.

MKN 10-02-2016 11:21 2604441

Цитата:

Цитата Serg866
Ведь файл-то системный »

Надо стать владельцем файла, получить к нему полный доступ. Версия ОС значения не имеет. RequestExecutionLevel - в зависимости от задачи.
Цитата:

Цитата Serg866
быть может есть альтернативные способы как заблокировать доступ к сайту с помощью NSIS (без редактирования файла hosts)? »

Командой из скрипта создать правило для брандмауэра. На предыдущей страницы уже была ссылка на примеры.
Насчёт ругани антивирусов - это уже сам пользователь пусть укрощает "дурость" своего антивируса. Против дури лекарства нет... :)

Serg866 11-02-2016 02:04 2604752

Цитата:

Цитата MKN
Надо стать владельцем файла, получить к нему полный доступ. Версия ОС значения не имеет. RequestExecutionLevel - в зависимости от задачи. »

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

Цитата:

Цитата MKN
Командой из скрипта создать правило для брандмауэра. На предыдущей страницы уже была ссылка на примеры.
Насчёт ругани антивирусов - это уже сам пользователь пусть укрощает "дурость" своего антивируса. Против дури лекарства нет... »

Как правило мало кто укрощает антивирус.
Обычно сразу закрывают прогу и спешно удаляют её.

NSIS Simple Firewall Plugin не поддерживает юникод, а мне нужен юникод
LiteFirewall Plugin вроде не может добавлять блокировку сайта.
Команды из скрипта я не разобрал, но там сразу написано что документация для всех новых систем. А мне надо чтобы и в XP тоже работала блокировка сайта.

MKN 11-02-2016 10:51 2604818

Цитата:

Цитата Serg866
Недостаточно того что инсталлер запускается из под администратора? »

Для XP достаточно. Для старших ОС - нет.
Цитата:

Цитата Serg866
Ну а как получить доступ? »

Есть плагины, есть системные команды.
Цитата:

Цитата Serg866
Как правило мало кто укрощает антивирус. Обычно сразу закрывают прогу и спешно удаляют её. »

Мало кто из разработчиков ПО предупреждает пользователей о возможной неадекватной реакции антивируса на их продукт. И тем более никто не даёт внятных рекомендаций, что пользователю делать. Это - хреновые разработчики, раз им плевать, что их продукт сразу же будет удалён из за тупости какого то антивируса... Да и пользователи такие же...

Если с Firewall_ами не получается, используй записи в hosts.

ps Попробуй запускать из скрипта - Hosts Commander
Это гораздо лучше, чем горожа из NSIS кода.
http://code.google.com/archive/p/hostscmd/
http://habrahabr.ru/post/109180/

Serg866 11-02-2016 15:23 2604956

Цитата:

Цитата MKN
ps Попробуй запускать из скрипта - Hosts Commander
Это гораздо лучше, чем горожа из NSIS кода.
http://code.google.com/archive/p/hostscmd/
http://habrahabr.ru/post/109180/ »

Спасибо.
Hosts Commander вроде подходит.
Но опять же как на него реагируют системы старше XP и основные антивири.
Бьют тревогу или нет. Может кто юзал?

upd: почитал комменты на хабре.
Не буду юзать...

MKN 11-02-2016 15:30 2604961

Цитата:

Цитата Serg866
upd: почитал комменты на хабре.
Не буду юзать... »

Посмотри на даты комментов. Многое уже изменилось. Да и вообще - никогда не верь комментам, пока не проверишь сам :)
Зря я эту ссылку дал...

Serg866 11-02-2016 18:15 2605059

Цитата:

Цитата MKN
Посмотри на даты комментов. Многое уже изменилось. Да и вообще - никогда не верь комментам, пока не проверишь сам
Зря я эту ссылку дал... »

Да скорее это я зря эту тему поднял.
Получается нет "бесшумного" способа подправить файл hosts.
И вообще в целом блокирнуть адрес сайта, не нарвавшись на УГ-антивири, UAC и прочую фигню.

Просто есть один говёный сайт, ворующий мою программу... Они устанавливают прогу, модифицируют её и перепаковывают. Мне это не нравится. И я хотел всем своим юзерам к этому сайту доступ закрыть. Но значит не судьба.

MKN 12-02-2016 10:12 2605274

Цитата:

Цитата Serg866
Получается нет "бесшумного" способа подправить файл hosts. »

Ну как же нет ? :) Как править строки в hosts рассказал K.A.V.

"Отобрать" файл hosts у системы (W7 и выше) - способов навалом. От классического командного, типа

nsExec::exec 'takeown.exe /F "$SYSDIR\drivers\etc\hosts"' ; текущий пользователь становится владельцем файла
nsExec::exec 'icacls.exe "$SYSDIR\drivers\etc\hosts" /grant $UserName:F /T' ; полный доступ текущего пользователя к файлу

как получить $UserName - тоже куча способов
от обычных ExpandEnvStrings $UserName %username%
до API_шных - GetUserName
Примеров - море

Для получения разных вариантов доступа есть плагин - AccessControl. Выбирай и пробуй...

Боишься беспокойства от UAC- есть и плагин, есть и другие способы

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

Зачем придумывать проблемы, когда всё давно уже решено... :)

Serg866 12-02-2016 18:14 2605491

А этот плагин может задать брендмауэру блокировку сайта?
Он юникод поддерживает. Только я не понимаю какое правило использовать

http://nsis.sourceforge.net/LiteFirewall_Plugin

MKN 12-02-2016 18:40 2605504

Serg866,
У LiteFirewall Plugin всего два правила :
Добавление приложения в список исключений брандмауэра Windows - liteFirewall::AddRule
Удаление приложения из списка исключений брандмауэра Windows - liteFirewall::RemoveRule

Serg866 13-02-2016 07:39 2605604

MKN
Ну окей, тогда с помощью этого плагина как задавать блокировку сайта?
Может ради этого на ANSI перейду.

http://nsis.sourceforge.net/NSIS_Simple_Firewall_Plugin


Плохо что в справочнике нет ничего на эту тему.

MKN 13-02-2016 11:25 2605623

Цитата:

Цитата Serg866
с помощью этого плагина как задавать блокировку сайта?
Плохо что в справочнике нет ничего на эту тему. »

Зачем это в справочнике, всё ведь уже расписано в доках к плагинам ?
Simple_Firewall_Plugin похоже не блокирует отдельные сайты. Детально не изучал...

А почему разонравился способ редактирования HOSTS ? :)

Нужный адрес добавляется без проблем.

Ессно, ничего не получится, если hosts защищён антивирусом.
Поэтому и надо, перед установкой твоей программы - сообщить пользователю, что делать !
Т.е. , если установлен антивирус, определить какой это антивирус, и дать пользователю в сообщении пошаговые рекомендации, как в настройках антивируса проверить, включена ли защита hosts, и как её отключить.
Хорошо бы для каждого типа антивируса - своё сообщение. Или хотя бы для нескольких основных антивирей. (Можно сделать и для всех, не велик труд, и на будущее пригодится. )
:)
Или в readme программы указать (пример из какой то проги) :
Цитата:

Важно!: Некоторые антивирусные программы, включая Essential Microsoft Security (Windows Defender) не позволяют модифицировать хост файл из предосторожности.
Это сделано для предотвращения модификации хост файла вирусами, шпионским или вредоносным ПО.
Если вы столкнулись с этой проблемы, необходимо временно отключить антивирусное программное обеспечение или отключить защиту хост-файла.
Как определить , какой антивирус установлен в ОС :

Код:

;http://nsis.sourceforge.net/WMI_header
OutFile AntiVirusProduct.exe
!include WMI.nsh

Section
${WMIGetInfo} root\SecurityCenter2 AntiVirusProduct displayName Info
SectionEnd

Function Info
MessageBox MB_OK "Установлен : $2"
FunctionEnd

в Windows XP надо использовать SecurityCenter (а не SecurityCenter2 ! )

Можно обойтись и без WMI.nsh. Просто использовать в скрипте команду для wmic.

Serg866 13-02-2016 16:21 2605698

Я такой скрипт не потяну. Очень много всего надо определять.
И плюс результат всё равно не стоит свеч.
Один фиг у людей будут антивири ругаться.
Одно дело, когда какой-то левый антивирь срабатывает у 2 человек из 100, а тут у каждого второго будет срабатывать. Слишком рисковано...

ZaxBoys66 18-02-2016 21:19 2607686

NSIS Check Defrag Disk

NSIS used command line check,defrag disk and clean History,Cookies browsers,empty recycle bin

NSIS used command line to shutdown,restart,sleep,hibernate PC

NSIS Download files with async progressbar

Kopejkin 20-02-2016 16:39 2608342

Какие требования предъявляются к bmp-изображениям, чтобы на создаваемой nsDialogs страничке их (изображений) фон был бы прозрачен?

Flix 20-02-2016 18:50 2608370

Kopejkin, попробуйте использовать 32-бит изображения Bitmap. 32-бит Bitmap - это стандартное растровое изображение с глубиной 24-бит, плюс альфа-канал (прозрачность) с глубиной 8-бит (24+8=32). Обычный редактор изображений Microsoft Paint поддерживает создание и запись изображений в формате BMP только с глубиной 24-бит. Поэтому для получения 32-бит Bitmap изображений воспользуйтесь программами сторонних разработчиков, например, Axialis IconWorkshop, Paint.Net с плагином BMPX и др.

Альтернативный вариант (в теории) — это использовать вместо BMP формат ICO (и соответственно макрокоманду ${NSD_CreateIcon} вместо ${NSD_CreateBitmap}). При этом предварительно конвертируйте ваши изображения в 32-бит формат ICO.

Dodakaedr 21-02-2016 09:47 2608483

Есть такой макрос
Код:

!define ANSIToUTF8 "!insertmacro ANSIToUTF8"
!macro ANSIToUTF8 SOURCE_STRING OUTPUT_STRING
      Push `${SOURCE_STRING}`
      System::Store SR2
      System::Call "kernel32::MultiByteToWideChar(i0,i0,tR2,i-1,i0,i0)i.R1"
      IntOp $R1 $R1 * 2
      System::Alloc $R1
      Pop $R0
      System::Call "kernel32::MultiByteToWideChar(i0,i0,tR2,i-1,iR0,iR1)"
      System::Call "kernel32::WideCharToMultiByte(i65001,i0,iR0,i-1,t.s,iR1,i0,i0)"
      System::Free $R0
      System::Store L
      Pop `${OUTPUT_STRING}`
!macroend

Можно его как-то сделать противоположным? То есть UTF8ToANSI.

Вопрос снят. Нашел Utf8Converter

Dodakaedr 21-02-2016 10:43 2608496

Вложений: 1
Помогите, пожалуйста, разобраться с ini файлом. Не определяется секция и при записи нового значения создается дубль секции.

Flix 21-02-2016 15:21 2608585

Dodakaedr, NSIS не умеет работать с INI-файлами в кодировках отличной от ANSI. А ваш файл INI имеет кодировку UTF-8. По этой причине и получается ошибка. Воспользуйтесь плагином Unicode для преобразования кодировок. Примерный код сценария будет следующий:

Пример сценария
Код:

# Обработка INI-файлов кодировке UTF-8
# Используемые плагины:
#  - Unicode v1.1 (http://nsis.sourceforge.net/Unicode_plug-in)
#  - EnumINI (http://nsis.sourceforge.net/EnumINI_plug-in)

outfile "TestINI.exe"

Section main
  ; Выполняем конвертацию исходного файла INI из кодировки UTF-8 в ANSI
  ; во временный файл с именем _Config.ini
  unicode::FileUnicode2Ansi "$EXEDIR\Config.ini" "$EXEDIR\_Config.ini" AUTO
  ; Извлекаем из стека результат обращения к функции
  Pop $1
  ; Проверяем наличие в INI-файле секции с именем "General"
  EnumINI::SectionExist "$EXEDIR\_Config.ini" "General"
  ; Извлекаем из стека результат обращения к функции
  Pop $1
  ; Выполняем сравнение значения переменной $1 с "1"
  StrCmp $1 "1" 0 +6
    ; Если результат сравнения положительный (секция существует), то...
    ; Показываем уведомление пользователю
    MessageBox MB_OK|MB_ICONINFORMATION "Указанная секция существует."
    ; Записываем во временный новый INI-файл значение для заданного ключа
    WriteINIStr "$EXEDIR\_Config.ini" "General" "RutaBaseExtraccion" "$EXEDIR\"
    ; Выполняем конвертацию временного файла INI из кодировки ANSI в UTF-8
    ; и перезаписываем исходный файл INI
    unicode::FileAnsi2Unicode "$EXEDIR\_Config.ini" "$EXEDIR\Config.ini" UTF-8
    ; Извлекаем из стека результат обращения к функции
    Pop $1
  ; Переходим на команду удаления временного файла INI (_Config.ini)
  Goto +2
  ; Если результат сравнения отрицательный (секция НЕ существует), то...
  ; Показываем уведомление пользователю
  MessageBox MB_OK|MB_ICONSTOP "Указанная секция не существует!!!"
  ; Удаляем временный файл INI, он больше не нужен.
  Delete "$EXEDIR\_Config.ini"
SectionEnd


Рекомендую ввести дополнительные проверки как, например, наличие самого файла INI и результатов конвертирования.
К сожалению, оба используемых плагина сделаны в редакции ANSI, поэтому пользоатели NSIS Unicode оказываются в пролёте.

K.A.V. 21-02-2016 16:00 2608600

Цитата:

Цитата Flix
К сожалению, оба используемых плагина сделаны в редакции ANSI, поэтому пользоатели NSIS Unicode оказываются в пролёте. »

Не пробовал никто CallAnsiPlugin plug-in?

lavey13 23-02-2016 15:08 2609277

А возможно как то отключить автоматический detailprint таких команд как rename и delete?

Serg866 09-03-2016 12:23 2614164

Привет.

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

С уважением, Serg866

MKN 09-03-2016 13:02 2614172

Цитата:

Цитата Serg866
проверка подключения к интернету »

Самое простое - использовать штатный плагин Dialer (он уже входит в "боксовый пакет" NSIS)
Код:

Dialer::GetConnectedState
Pop $1
MessageBox MB_OK "$1"

Если интернет есть, то в $1 - online
если нет, то в в $1 - offline

Можно также использовать (но совершенно ни к чему) :
; http://msdn.microsoft.com/ru-ru/libr...(v=vs.85).aspx
Код:

System::Call 'wininet.dll::InternetGetConnectedState(*i .r0, i 0) i.r1'
IntFmt $R1 "0x%X" "$0"  ; (connection in hex)
MessageBox MB_OK "$1 $R1 "
; есть сеть - $1 == 1
; нет - $1 == 0

; $R1 - описание соединения: Modem=0x01, LAN=0x02, Proxy=0x04, RAS=0x10, Offline=0x20 Configured=0x40 и др
; также в $R1 может быть результат сложения разных сочетаний... Например :
; Значение 0x12 представляет собой сочетание INTERNET_CONNECTION_LAN (0x02) и INTERNET_CONNECTION_RAS_INSTALLED (0x10)

Далее для твоей задачи, обыкновенная логика и открытие нужного url

Serg866 09-03-2016 16:50 2614255

MKN. Красава! То что надо.
С проверкой я понял, а команду для открытия url как прописывать?
если что у меня в скрипте один url уже есть (линк на созданной странице)

kotkovets 10-03-2016 09:09 2614496

Цитата:

Цитата Serg866
команду для открытия url как прописывать? »

через shell.
Код:

ExecShell "open" "http://nsis.sf.net/"

Serg866 10-03-2016 12:06 2614562

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

Условно это вот так выглядит

RMDir /r $DESKTOP\Моя папка

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

Sancho5555 10-03-2016 12:52 2614594

Serg866, вот так удаляет:

RMDir /r "$DESKTOP\Моя папка"

Sancho5555 10-03-2016 15:14 2614680

В справочнике, в разделе "Работа с реестром" есть макрос ${StrToHex} "строка" $var - Конвертирование строки в HEX.
Не подскажите, как сделать наоборот конвертирование HEX в строку, или ${HexToStr}?

MKN 10-03-2016 15:56 2614697

Цитата:

Цитата Sancho5555
HEX в строку »

Registry_plug-in
${registry::HexToStr} "[hex_string]" $var

И ещё когда то kotkovets, приводил такой код :
Код:

конвертация 16-ричное число в десятичное, десятичное в ASCII

  IntFmt $1 "%i" 0x37 ;16-ричное число в десятичное
 ;-------------------------------------------------------------------
  IntFmt $1 "%c" $1 ;десятичное в ASCII


Dodakaedr 11-03-2016 19:15 2615039

Подскажите, пожалуйста, в чем проблема? Почему если в конце ключа реестра стоит цифра то этот ключ пропускается? Для большей понятности:
Скрытый текст
Код:

outfile "test find key.exe"
!include "Registry.nsh"

function "_bak"
StrCpy $0 0
loop:
  EnumRegKey $1 HKLM "SOFTWARE" $0
  StrCmp $1 "" done
  IntOp $0 $0 + 1
  StrCpy $9 "$1" 14
  StrCmp $9 "ComSysControl." wel loop
  wel:
  ${registry::MoveKey} "HKLM\SOFTWARE\$1" "HKLM\SOFTWARE\$1_bak" $r9
  ${Registry::UnLoad}
  goto loop
done:
functionend

Section
${registry::Write} "HKLM\SOFTWARE\ComSysControl.UserVars.1" "" "" "REG_SZ" $9
${registry::Write} "HKLM\SOFTWARE\ComSysControl.UserVars" "" "" "REG_SZ" $9
${registry::Write} "HKLM\SOFTWARE\ComSysControl.Win_ini.1" "" "" "REG_SZ" $9
${registry::Write} "HKLM\SOFTWARE\ComSysControl.Win_ini" "" "" "REG_SZ" $9
${registry::Unload}
call _bak
SectionEnd


MKN 12-03-2016 10:01 2615146

Цитата:

Цитата Dodakaedr
Почему если в конце ключа реестра стоит цифра то этот ключ пропускается? »

Всё нормально :

Код:

OutFile "test find key.exe"
!include "Logiclib.nsh"
!include "Registry.nsh"

var err

Section
; для тестирования
${registry::Write} "HKLM\SOFTWARE\Test.test.ttt.aaaaaaaa.1" ".test" "5" "REG_SZ" $err
${registry::Write} "HKLM\SOFTWARE\Test.test.ttt.bbbbbbbb.1" ".test" "7" "REG_SZ" $err

${Do}
EnumRegKey $1 HKLM "SOFTWARE" $0
IntOp $0 $0 + 1
StrCpy $9 $1 14 ;первые 14 символов из $1(Test.test.ttt.) помещаем в $9
${If} $9 == "Test.test.ttt."  ; условие
DetailPrint $1 ;для информации
ClearErrors
MessageBox MB_OK "Условие найдено. Далее - необходимое действие"
${EndIf}
${LoopUntil} $1 == ""
SectionEnd


Dodakaedr 12-03-2016 18:14 2615285

Цитата:

Цитата MKN
Всё нормально : »

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

Скрытый текст



Код:

OutFile "test find key22.exe"
!include "Logiclib.nsh"
!include "Registry.nsh"

var err

Section
; для тестирования
${registry::Write} "HKLM\SOFTWARE\ComSysControl.UserVars.1" ".test" "5" "REG_SZ" $err
${registry::Write} "HKLM\SOFTWARE\ComSysControl.UserVars" ".test" "7" "REG_SZ" $err

${Do}
EnumRegKey $1 HKLM "SOFTWARE" $0
IntOp $0 $0 + 1
StrCpy $9 $1 14 ;первые 14 символов из $1(Test.test.ttt.) помещаем в $9
${If} $9 == "ComSysControl."  ; условие
;DetailPrint $1 ;для информации
;ClearErrors
;MessageBox MB_OK "Условие найдено. Далее - необходимое действие"
${registry::MoveKey} "HKLM\SOFTWARE\$1" "HKLM\SOFTWARE\$1_bak" $r9
${Registry::UnLoad}
${EndIf}
${LoopUntil} $1 == ""
SectionEnd


MKN 13-03-2016 20:08 2615639

Цитата:

Цитата Dodakaedr
С тестовыми ключами да, но если подставить требуемые, то результат тот же »

Значит дело конкретно в твоих ключах. Либо нет доступа к ключу, либо скрипту(плагину) не нравится название ключа.
В частности, подозрение вызывает "UserVars" в составе ключа.

Sancho5555 16-03-2016 15:14 2616659

Вложений: 1
Есть плагин от K.A.V. для установки прозрачности окна инсталлятора - для примера код:
Скрытый текст
Код:

!include "MUI2.nsh"
!define TBM_SETPOS 0x0405
!define TBM_GETPOS 0x0400
!define TBM_SETRANGEMIN 0x0407
!define TBM_SETRANGEMAX 0x0408

!addplugindir "."
!insertmacro MUI_LANGUAGE "Russian"

Name "transparent plugin example"
OutFile "transparent.exe"
XPStyle on

Var transparent
Var Slider
Var Move
Var Label
Var Button

Page custom Create

Function Slider
  SendMessage $Slider ${TBM_GETPOS} 0 0 $Move
  transparent::SetTransparentWindowStyle "$Move"
  ${NSD_SetText} $Label "$Move"
FunctionEnd

Function Create
  nsDialogs::Create 1018
  Pop $transparent
       
  nsDialogs::CreateControl "msctls_trackbar32" "0x50010000|0x00000018" "" 80u 100u 200 60 ""
  Pop $Slider
  SendMessage $Slider ${TBM_SETRANGEMIN} 1 50
  SendMessage $Slider ${TBM_SETRANGEMAX} 1 255
  SendMessage $Slider ${TBM_SETPOS} 1 255
  transparent::SetTransparentWindowStyle "255"
       
  ${NSD_CreateLabel} 215u 104u 30u 30u ""
  Pop $Label
       
  ${NSD_CreateButton} 20u 103u 51u 12u "Обзор"
  Pop $Button
  ${NSD_OnClick} $Button Example
       
  ${NSD_CreateTimer} Slider 50
  nsDialogs::Show $transparent
FunctionEnd

Function Example
  nsDialogs::SelectFolderDialog /NOUNLOAD "" ""
  Pop $0
FunctionEnd

Section
SectionEnd


Прозрачность работает, но после нажатия кнопки "Обзор" transparent плагин перестаёт работать.
В чём может быть проблема?

K.A.V. 17-03-2016 16:18 2617094

Цитата:

Цитата Sancho5555
Прозрачность работает, но после нажатия кнопки "Обзор" transparent плагин перестаёт работать. »

Нет такой проблемы, по крайней мере у меня, всё работает
Попробуйте так

Sancho5555 18-03-2016 11:29 2617346

Цитата:

Цитата K.A.V.
Нет такой проблемы, по крайней мере у меня, всё работает »

Заметил у себя на Win8 X64 работает через раз, после загрузки системы, буду разбираться.

MKN 19-03-2016 13:19 2617712

Подскажите, как поместить видео в собственное окно на кастомной странице ?

код, в котором это не получается... (видео окно рядом с кастомным) :

Код:

!include MUI2.nsh
Page custom MyPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
OutFile "test_video.exe"
!define WS_BORDER 0x00800000
Var dlg

Function MyPage
nsDialogs::Create 1018
Pop $dlg

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t " здесь должно быть видео",\
                      i${DEFAULT_STYLES}|${WS_BORDER}|${WS_VISIBLE},\         
                      i130,i50,i200,i150,i$dlg,i222,i0,i0) i.R7'
SetCtlColors $R7 `0x0000FF` `0x99FFFF`

System::Call "winmm::mciSendStringA(t 'open $\"$EXEDIR\video.wmv$\" alias vvv parent $R7', i 0, i 0, i 0)"
        System::Alloc 16
        Pop $1
        System::Call "user32::GetWindowRect(i $R7, 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)"
 nsDialogs::Show
        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

тестовый комплект : http://rghost.ru/private/8RjjlkHVT/7...a877c9ac07d1af

K.A.V. 19-03-2016 14:25 2617734

Цитата:

Цитата MKN
Подскажите, как поместить видео в собственное окно на кастомной странице ? »

Код:

!include MUI2.nsh
Page custom MyPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
OutFile "test_video.exe"
!define WS_BORDER 0x00800000
Var dlg

Function MyPage
nsDialogs::Create 1018
Pop $dlg

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t " здесь должно быть видео",\
                      i${DEFAULT_STYLES}|${WS_BORDER}|${WS_VISIBLE},\         
                      i130,i50,i200,i150,i$dlg,i222,i0,i0) i.R7'
SetCtlColors $R7 `0x0000FF` `0x99FFFF`

        System::Call "winmm::mciSendStringA(t 'open $\"$EXEDIR\video.wmv$\" alias vvv parent $R7 style child', i 0, i 0, i 0)"
        System::Alloc 16
        Pop $1
        System::Call "user32::GetWindowRect(i $R7, i $1)"
        System::Call "*$1(i.r2, i.r3, i.r4, i.r5)"
        System::Free $1
        System::Call "winmm::mciSendStringA(t 'put vvv destination $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)"
 nsDialogs::Show
        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


MKN 19-03-2016 14:45 2617742

K.A.V.,
Я ведь специально убрал style child из кода, т.к. с ним видео не было и в помине. А без него было, рядом в отдельном окне.
И сейчас скомпилил , запустил - нет никакого видео ! Но, совершенно случайно подвинул окно в сторону - и видео появилось.
Т.е. , пока не подвигаешь окно - видео нет. Что за чертовщина ?

K.A.V. 19-03-2016 14:56 2617748

Цитата:

Цитата MKN
И сейчас скомпилил , запустил - нет никакого видео ! Но, совершенно случайно подвинул окно в сторону - и видео появилось.
Т.е. , пока не подвигаешь окно - видео нет. Что за чертовщина ? »

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

MKN 21-03-2016 08:39 2618154

Цитата:

Цитата K.A.V.
глюки с NSIS и системой »

На другой машине то же самое. Видео нет, пока чуть не сдвинешь окно... И RedrawWindow не помогает...
Приблизительно такой же эффект разбирался здесь :
http://rsdn.ru/forum/media/340319.hot
Было ли решение, не ясно...

Serg866 26-03-2016 11:08 2619912

Всё не оставляю попыток изменить файл hosts без ругани самой системы и антивирусов.
Как думаете, можно воспользоваться методом, описанным здесь?
http://www.cyberforum.ru/cmd-bat/thread859941.html

MKN 29-03-2016 12:09 2620876

Расшифровываем URI ( Uniform Resource Identifier )
http://ru.wikipedia.org/wiki/URI
здесь об URI человеческим языком : http://handynotes.ru/2009/09/uri-url-urn.html

Если ещё проще, то часто встречающиеся ссылки вида :
http://ru.wikipedia.org/wiki/%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0"
- это и есть URI.

Для декодирования/кодирования URI, у китайских товарищей есть плагин.
Код:

!addplugindir .
OutFile nsURI.exe
InstallColors /windows
ShowInstDetails show
Section
nsURI::decodeURI "http://ru.wikipedia.org/wiki/%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0"
    Pop $R0
    DetailPrint $R0
SectionEnd

Также, при необходимости , используем:
nsURI::encodeURI
nsURI::encodeURIComponent
nsURI::decodeURIComponen

trobbobsom 29-03-2016 19:19 2621028

Добрый вечер!

Подскажите пожалуйста,я уже перерыл половину интернета...

не меняется иконка инсталера

Вот код который использую :

Код:

!include "MUI.nsh"

!define MUI_ICON "2.ico"

я уже не знаю что попробовать,перепробовал все..

Версия ос : win10
Версия nsis : 2.5

Dodakaedr 29-03-2016 19:50 2621042

trobbobsom, добавьте это
Код:

Icon "icon.ico"
иконка в данном случаи должна находится возле скрипта

trobbobsom 30-03-2016 11:01 2621212

Цитата:

Цитата Dodakaedr
trobbobsom, добавьте это
Код:
Icon "icon.ico"
иконка в данном случаи должна находится возле скрипта »

Спасибо огромнейшее!!! Работает! Вы мне очень помогли!

Dodakaedr 03-04-2016 14:05 2622624

Подскажите, пожалуйста, какая противоположная команда этой:
Код:

rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 .\elfPr.inf

Painkiller 03-04-2016 14:22 2622626

Цитата:

Цитата Dodakaedr
Подскажите, пожалуйста, какая противоположная команда этой: »

Может так :
Код:

ExecWait "$SYSDIR\rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\elfPr.inf"

Dodakaedr 03-04-2016 14:54 2622631

Painkiller, Нет, имеется ввиду удаление. Команду которую я привел использую для установки драйвера, а вот противоположную команду не нашел(для удаления, если такая существует).

MKN 03-04-2016 16:54 2622663

Цитата:

Цитата Dodakaedr
а вот противоположную команду не нашел(для удаления, если такая существует). »

конечно существует :
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultUninstall 132 path-to-uninstall-dir\infname.inf

Dodakaedr 03-04-2016 21:13 2622742

MKN,
Цитата:

конечно существует :
А записи с реестра не удаляет? проверил еще раз - удаляет.

Begin2Fly 04-04-2016 01:32 2622807

NSIS 3.0 RC1
https://sourceforge.net/projects/nsi...elease/3.0rc1/

Dodakaedr 04-04-2016 08:44 2622834

Знаю есть команда обновления иконок (${RefreshShellIcons}), а обновление трея есть? Иконка зависает в трее.

K.A.V. 04-04-2016 19:39 2623064

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

Painkiller 04-04-2016 19:43 2623065

Цитата:

Цитата Dodakaedr
Знаю есть команда обновления иконок (${RefreshShellIcons}), а обновление трея есть? Иконка зависает в трее. »

Код:

StrCpy $1 0
 FindWindow $0 "Shell_TrayWnd" ""
 FindWindow $0 "TrayNotifyWnd" "" $0
 FindWindow $0 "SysPager" "" $0
 FindWindow $0 "ToolbarWindow32" "" $0
 ${While} $1 != 1920
 SendMessage $0 ${WM_MOUSEMOVE} 0 $1
 IntOp $1 $1 + 1
 ${EndWhile}


MKN 05-04-2016 10:19 2623205

Никто не решил проблему неправильного oпределения версии Windows 10 в WinVer2.nsh (от kotkovets) при запуске скрипта с флешки ?
(вопрос уже поднимался http://forum.oszone.net/post-2567002.html)

Begin2Fly 05-04-2016 12:24 2623250

MKN, можно хекс-редактором поменять в манифесте makensis.exe висту на вынь10
https://msdn.microsoft.com/ru-ru/lib...(v=vs.85).aspx

MKN 05-04-2016 12:36 2623254

Цитата:

Цитата Begin2Fly
можно хекс-редактором поменять в манифесте makensis.exe висту на вынь10 »

При этом определяется с флешки правильно ?

Что то не находится такое...

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

Begin2Fly 05-04-2016 12:41 2623255

MKN, ищите вот это: {e2011457-1546-43c5-a5fe-008deee3d3f0} и меняйте на это: {8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
Во всяком случае, в юникодовой версии 2.46.5 помогло. Да, с флешки определялась как 6.2, а после фикса стала 10.0

MKN 05-04-2016 12:47 2623256

Цитата:

Цитата Begin2Fly
ищите вот это: {e2011457-1546-43c5-a5fe-008deee3d3f0} »

Такое есть в 2.46 но нет в 3 версии. Вероятно находится в другом файле...

Begin2Fly 05-04-2016 12:57 2623267

MKN, в третьей RC1 нормально работает, кстати, там прописано всё.

MKN 05-04-2016 13:01 2623270

Цитата:

Цитата Begin2Fly
в третьей RC1 нормально работает »

Хорошая новость. :) Я пока не опробовал RC1...

Begin2Fly 05-04-2016 13:05 2623273

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

MKN 05-04-2016 13:16 2623278

Плиточный интерфейс (как в Windows 10) на собственной странице



Такой фейс можно сделать с помощью SkinButton.dll

Скин представляет собой PNG файл, состоящий из четырёх отдельных изображений, слитых воедино. Сверху вниз :
1 - исходный вид кнопки
2 - на кнопку наведён указатель мыши
3 - кнопка нажата
4 - кнопка не активна

Комплект для примера TI-Test.zip во вложении

Чтобы не возиться с рисованием кнопок, сделал скин-генератор : http://rghost.ru/private/8XSNhhbWz/7...53c703d6ecf437
Как работает - всё очевидно из фейса.



Ессно и скины и скин генератор каждый может переделать как угодно и как позволяет фантазия... :)

ZaxBoys66 11-05-2016 15:54 2633865

NSIS Download Video Youtube

NSIS Download and convert Youtube Video MP4 to Audio MP3
Reqiured download and push in output directory youtube-dl.exe,ffmpeg.exe,ffprobe.exe
Compiled with NSIS Ansi 2.51

Dodakaedr 04-06-2016 22:09 2640260

Подскажите как правильно задать условие для работы инсталлятора? Нужно чтобы он запускался только от 7 и выше.

Begin2Fly 04-06-2016 22:52 2640277

Цитата:

Цитата Dodakaedr
Подскажите как правильно задать условие для работы инсталлятора? Нужно чтобы он запускался только от 7 и выше. »

1. Надо получить версию Windows. Как вы это сделаете - решать только вам: либо из реестра, либо из свойств системного файла, либо через API Windows, либо через функционал NSIS. В шапке есть, например, WinVer2.nsh. В справочнике по NSIS есть инструкции.
2. Собственно, задать условие в функции .onInit, например так:
(в переменной $OS хранится номер версии)
Код:

${IfNot} $OS == "6.1" ; Windows 7
${AndIfNot} $OS == "6.2" ; Windows 8
${AndIfNot} $OS == "6.3" ; Windows 8.1
${AndIfNot} $OS == "10.0" ; Windows 10
        MessageBox MB_OK|MB_TOPMOST|MB_USERICON "Программа работает только на Windows 7, 8 и 10."
        Quit
${EndIf}


Dodakaedr 04-06-2016 23:14 2640283

Begin2Fly, благодарю. Если так указать
Код:

${If} $os < "6.1" ; Windows 7
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "Программа работает только на Windows 7, 8 и 10."
Quit
${EndIf}

будет работать? Проверить нет возможности.

MKN 06-06-2016 08:30 2640639

Dodakaedr,

Код:

!include "WinVer.nsh"

Function .onInit
${If} ${AtLeastWin7}  ;запуск, только начиная от Win7
MessageBox MB_OK "Win7"
${Else}
MessageBox MB_OK "NO Win7 !"
${EndIf}
FunctionEnd


Krinkels 20-06-2016 00:05 2644072

Вложений: 1
Представляю Botva3.dll. Переделана из Botva2.dll, и переименована, дабы не путаться. Для оригинальных функций сделаны функции обертки( для комфортной работы с nsis ) + чуть чуть переписан код.
Желательно потестить более сведущим в nsis нежели мне. В архиве либа + пара примеров

Begin2Fly 10-07-2016 01:21 2649364

NSIS 3.0
https://sourceforge.net/projects/nsi.../NSIS%203/3.0/

aesoem 31-07-2016 20:09 2655796

Парни, чет не пойму...
вставляю в код
Код:

!define MUI_ICON "путь к иконке"
даже на стандартный
Код:

!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
не рагирует
компилю, все без проблем, а значок стандартный ....
____________________________________________________
вот... нашел
Icon "D:\YandexDisk\DELPHI\ICO\Vista_Icons\Alerts\Alert 10.ico"

BuZzOFF 13-08-2016 11:10 2659384

Здравствуйте. Подскажите, пожалуйста, можно ли заблокировать один из элементов ListView?
По типу "EnableWindow $var 0". Чтоб отображался, но был не кликабельным...



Пытался загуглить, но ничего не нашёл.

ZaxBoys66 28-08-2016 14:44 2663738

NSIS Script Generator

I created a script generator for NSIS ansi and I hope to be useful to users.


DeDyJIR 18-09-2016 11:35 2669822

Подскажите почему установленная программа определяется как 32bit, хотя реально установлена 64bit. Проблема nsis или надо что-то дописывать?

Begin2Fly 18-09-2016 15:57 2669863

DeDyJIR, информацию для деинсталляции надо записывать в соответствующий раздел.
SetRegView 64 поможет, прочитайте в справочнике.

MKN 29-09-2016 16:25 2673397

Круглые разноцветные кнопки.



Делаем их с помощью уже известной SkinButton.dll (см. тему выше)
Только меняем рисунки в png скине :

На самом деле, кликабельная область - квадрат, но благодаря прозрачности PNG мы видим круг. (Единственное, кнопки не нужно делать большого размера и соблюдать пропорции.)
Генерировать скин с кругами можно таким же образом, как и с прямоугольниками. Только используем соответствующую команду ImageMagick, которую можно добавить в скин генератор.

Serg866 09-10-2016 03:36 2676277

Вложений: 1
Коллеги, моё почтение.

Разбираюсь с паролем на инсталлятор.
Вроде всё работает как надо, кроме кнопки Отмена.
Ну то есть при нажатии "Отмена" диалог должен закрываться, а он выдаёт текст из MessageBox MB
То ли конфликт какой у плага с MessageBox, то ли лыжи не едут.

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

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


Код:

!include "LogicLib.nsh"

SetCompressor /SOLID lzma
Name "InputBox"
OutFile "InputBox.exe"
RequestExecutionLevel user
ShowInstDetails show
Unicode true
XPStyle on

Page instfiles

# Just for testing
!addplugindir /x86-unicode "..\bin"

Function .onInit
InitPluginsDir
Dialogs::InputBox 0 "Заголовок" "Введите кодовую фразу" "GO!" "Отмена" 0
StrCmp $0 "Это пароль" okPass 0
MessageBox MB_ICONSTOP|MB_YESNO "Пароль неверный!!$\r$\nПовторить ввод пароля?" IDYES -2
quit
okPass:
FunctionEnd

Section ""
sleep 100
SectionEnd


Begin2Fly 09-10-2016 04:37 2676282

Цитата:

Цитата Serg866
Задача как понимаете чтобы при клике на отмену - диалог закрывался вообще без появления мессаджбокса. »

Код:
Код:

!include "LogicLib.nsh"

SetCompressor /SOLID lzma
Name "InputBox"
OutFile "InputBox.exe"
RequestExecutionLevel user
ShowInstDetails show
XPStyle on

Page instfiles

Function .onInit
InitPluginsDir
Dialogs::InputBox 0 "Заголовок" "Введите кодовую фразу" "GO!" "Отмена" 1 2
${if} $1 = 1
        StrCmp $2 "pass" okPass 0
        MessageBox MB_ICONSTOP|MB_YESNO "Пароль неверный!$\r$\nПовторить ввод пароля?" IDYES -3 IDNO 0
        Quit
${else}
        Quit
${endif}

okPass:
FunctionEnd

Section ""
sleep 100
SectionEnd


ZaxBoys66 03-11-2016 18:51 2684407

How can color ComboBox?
How can color ComboBox control with the same color as the window?
I tried but it does not work SetCtlColors

MKN 05-11-2016 09:45 2684818

ZaxBoys66,
Похоже, что тебе ответили на http://forums.winamp.com/showthread.php?t=398803
Особенно забавно :) :
Цитата:

Don't expect this to get fixed because the ComboBox is a really stupid control, it custom draws its borders and the sizes are locked down.

Dodakaedr 17-11-2016 11:54 2688258

Подскажите, пожалуйста, имеет ли значение версия nsis для работы этого примера из справки?
Код:

!include "MUI2.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile Test.exe
Caption "Replace text"

Section
  ${LineFind} "$EXEDIR\file.txt" "" "1:-1" "Replace"
  IfErrors 0 +2
  MessageBox MB_ICONSTOP|MB_OK "Файл не найден!"
SectionEnd

Function Replace
  ${WordReplace} '$R9' 'Counter-Strike' 'www.counter-strike.net' "+" '$R9'
  #здесь пишем еще раз макрос ${WordReplace} при небходимости

  Push $0
FunctionEnd

Пользуюсь версией 3.0b2. Ложу файл file.txt возле установщика с единственной в файле строкой Counter-Strike для примера, но замена не происходит.

MKN 17-11-2016 13:17 2688268

Цитата:

Цитата Dodakaedr
Ложу файл file.txt возле установщика с единственной в файле строкой Counter-Strike для примера, но замена не происходит. »

в таком коде и не произойдёт... ${WordReplace} поместит результат замены в переменную, а не сделает замену в файле...
Для замены текста в файле нужен другой код. Примеры есть в теме.

Dodakaedr 17-11-2016 13:26 2688270

MKN, каким должно быть содержание файла file.txt чтобы заработал пример?

MKN 17-11-2016 13:33 2688273

Dodakaedr,
Не пойму, где всё-таки надо произвести замену ? Если в файле, то нужен другой код. Если в переменной, то проще такой код :
Код:

!include "MUI2.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile Test.exe

Section
${LineRead} "$EXEDIR\file.txt" "1" $R0
MessageBox MB_OK '$R0'
${WordReplace} "$R0" "Counter-Strike" "www.counter-strike.net" "+" $R1
MessageBox MB_OK '$R1'
SectionEnd

Если, к примеру, в file.txt будет такой текст : bla-bla-bla Counter-Strike
то после выполнения кода в $R1 будет : bla-bla-bla www.counter-strike.net

Dodakaedr 17-11-2016 13:52 2688276

Цитата:

Цитата MKN
Если в файле, то нужен другой код »

Да, в самом файле. В справке статья называется "Замена строки в текстовом файле.". Оба месаджа идентичны, вот что выдает ваш код
Скрытый текст

MKN 17-11-2016 15:10 2688301

Цитата:

Цитата Dodakaedr
вот что выдает ваш код »

мой код выдаёт что и должен (для ANSI)

Для UNICOD используй функцию FileReadUnicode или, что ещё лучше, соответствующий плагин.
Цитата:

Цитата Dodakaedr
В справке статья называется "Замена строки в текстовом файле." »

Хмм... См. статью "Замена фразы в текстовом файле"

.Земляк. 25-11-2016 16:00 2690467

вопрос к знатокам правильный или нет синтаксис проверки 2х значений
Код:

....
 md5dll::GetMD5File "${DLL}" ; вычисляем MD5
  Pop $R1
 IntCmp $R1 "${MD5}" next 0 0 ; если MD5 равно 1му значению 
 IntCmp $R1 "${PATCH_MD5}" next Done Done ; если MD5 равно 2му значению 
Done:
  MessageBox MB_OK "Модифицирован или другой версий патч не будет установлен.$\r$\n$\r$\nПодерживаемая версия ${PRODUCT_VERSION}"
  Goto end
next:
....

если значение сходится по одну из значений продолжить установку

diakov 25-11-2016 22:31 2690549

Ребят, подскажите как исправить ложный детект антивирусов установщика NSIS, провел кучу экспериментов, тупо на пустой инсталл три детекта, все время одни и те же пассажиры недовольны:
Bkav HW32.Packed.3558 20161125
McAfee-GW-Edition BehavesLike.Win32.Dropper.hh 20161125
Qihoo-360 HEUR/QVM20.1.0000.Malware.Gen 20161125
Как это обойти? Может есть какие то упаковщики, протекторы или еще какие то варианты?

Flix 26-11-2016 02:26 2690571

Цитата:

Цитата diakov
как исправить ложный детект антивирусов установщика NSIS »

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

Из личного опыта общения:
Qihoo-360 - работают оперативно. Обычно отвечают в течении суток; :good:
McAfee-GW-Edition - реагируют в течении месяца, может и более. Вообще у них политика - ты должен быть их клиентом, купить подписку и зарегистрироваться на их сервисе. Короче клиентов они обрабатывают в первую очередь, всех остальных в порядке живой очереди; :read:
Bkav - вьетнамская антивирусная лаборатория. До них я так и не достучался, то ли английского не понимают, то ли гуглоперевод на вьетнамский. :insane:

Если часто собираешь несколько различных инсталляторов (не один или два в месяц), то естественно никакого терпения не хватит воевать с ложными срабатываниями. Поэтому, например, попробуй использовать UPX, но не последней версии (3.09.1!), а, например, 3.08. Я остановился на версии 1.20, не всегда, но в большинстве случаев помогает.

Также разный результат получается при установке различных режимов компрессии (ZLib, BZip2, LZMA), отключение Админправ, а также изменение других параметров инсталлятора.

Но если инсталлятор действительно содержит какую-то заразу, то вряд ли удастся её замаскировать.

diakov 26-11-2016 08:28 2690588

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

BuZzOFF 05-12-2016 19:34 2693268

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

"Название №1"; "Версия: 1.0"
"Название №1"; "Версия: 1.2"
"Название №1"; "Версия: 3.0"
"Название №2"; "Версия: 5.0"
"Название №2"; "Версия: 7.2"
"Название №3"; "Версия: 1.5"
"Название №4"; "Версия: 1.8"

Все они циклом считываются и добавляются в ListView (к примеру, как тут). 1 программа, 1 строчка.
Как отфильтровать так, чтоб добавлялась только последняя версия каждой программы.
Никак не могу сообразить...

BuZzOFF 12-12-2016 12:15 2694999

NSIS 3.01
nsis-3.01-setup.exe

Begin2Fly 12-12-2016 12:24 2695004

Цитата:

Цитата BuZzOFF
NSIS 3.01 »

С каждым разом всё хуже... Теперь даже сорсфорж ругается..

MKN 13-12-2016 12:44 2695318

Цитата:

Цитата BuZzOFF
Как отфильтровать так, чтоб добавлялась только последняя версия каждой программы. »

Предположим у нас есть файл list.txt со списком одноимённых приложений разных версий :
Код:

Camera Raw CC 9.6 win32
Camera Raw CC 9.6.1 win32
Camera Raw CC 9.6.2 win32

Прочтём его и отфильтруем версии (как вариант) :

Код:

OutFile NewVerFilter.exe
!include "LogicLib.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"

Var /global Str
Var /global Ver
Var /global SumVer
Var /global Ver1
Var /global Ver2
Var /global Ver3

Section
FileOpen $R4 "$EXEDIR\list.txt" r
IfErrors done
ClearErrors
${LineSum} "$EXEDIR\list.txt" $8 ; количество строк в list.txt

StrCpy $3 0

${Do}
IntOp $3 $3 + 1 ; нумерация читаемых строк
${LineRead} "$EXEDIR\list.txt" "$3" $Str  ; читаем строку № $3
;MessageBox MB_OK|MB_ICONINFORMATION "$3 -$Str "
${If} $Str == ""
Goto Next
${EndIf}

; выбираем версию из названия приложения
${WordFind2X} "$Str" " " "" "-3}}" $Ver 
StrCpy $Ver $Ver -9 ; отсекаем n символов от конца (n-количество, в зависимости от того, как построен список приложений)
;MessageBox MB_OK|MB_ICONINFORMATION "$Ver"

StrCpy $SumVer "$SumVer$Ver-" ; собираем все версии в одну переменную, добавив разделитель -

Next:
${If} $3 > $8 ; если номер текущей строки > кол-ва строк - выход из цикла
${ExitDo}
${EndIf}
${Loop}
done:
FileClose $R4

MessageBox MB_OK|MB_ICONINFORMATION "Все версии: $SumVer"  ;  9.6-9.6.1-9.6.2-

; разделяем версии для дальнейшего сравнения
${WordFind} "$SumVer" "-" "+1" "$Ver1" ;
${WordFind} "$SumVer" "-" "+2" "$Ver2" ;
${WordFind} "$SumVer" "-" "+3" "$Ver3" ;
MessageBox MB_OK|MB_ICONINFORMATION "$Ver1$\r$\n$Ver2$\r$\n$Ver3"

;далее последовательно сравниваем и оставляем только самую новую версию :

${VersionCompare} "$ver1" "$ver2" $R0
;если $R0=0  - Версии равны   
;если $R0=1  - $ver1 новее   
;если $R0=2  - $ver2 новее
MessageBox MB_OK|MB_ICONINFORMATION "$R0"

; и далее логика сравнения версий и оставление более новой....

SectionEnd

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

BuZzOFF 13-12-2016 13:42 2695337

MKN, спасибо, конечно. Но это всё же немного не то...
Как я понимаю это будет работать только если известно кол-во приложений в списке.
Цитата:

Цитата MKN
Var /global Ver1
Var /global Ver2
Var /global Ver3 »

Цитата:

Цитата MKN
${WordFind} "$SumVer" "-" "+1" "$Ver1" ;
${WordFind} "$SumVer" "-" "+2" "$Ver2" ;
${WordFind} "$SumVer" "-" "+3" "$Ver3" ; »

Загвоздка в том что это как раз таки и не известно. Список обновляется.

MKN 13-12-2016 13:47 2695339

Цитата:

Цитата BuZzOFF
это будет работать только если известно кол-во приложений в списке. »

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

BuZzOFF 14-12-2016 09:19 2695515

MKN, спасибо за наводку. Я куда-то не в ту степь думал... Всё оказалось проще.
Ток не файлами сделал, а с nsArray. Но принцип тот же.

MKN 14-12-2016 10:44 2695542

Цитата:

Цитата BuZzOFF
не файлами сделал, а с nsArray »

Действительно, уже всё давно придумано. :)
Даже есть пример - nsArray_VersionSort.nsi на http://forums.winamp.com/showthread.php?t=330425
где каша из версий выстраивается в возрастающую последовательность версий.

Интересный плагин http://nsis.sourceforge.net/File:NsArray.zip
Но уж очень мутный в освоении... Добавить бы в Справочник практических примеров с этим плагином ...
Но наши NSIS-гуру к сожалению тему и форум почему то забросили...

Flix 21-12-2016 16:40 2697440

Цитата:

Цитата BuZzOFF
Подскажите, пожалуйста, можно ли заблокировать один из элементов ListView? »

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



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

BuZzOFF 22-12-2016 05:52 2697578

Flix, спасибо! Чуть позже гляну.
Если мне не изменяет память, этот плагин работает на IO.

Serg866 13-01-2017 03:24 2703140

Ребят, подскажите как добавить полосу прокрутки текста на свою страницу, созданную в NsDialogs?

Begin2Fly 13-01-2017 03:37 2703142

Цитата:

Цитата Serg866
Ребят, подскажите как добавить полосу прокрутки текста на свою страницу, созданную в NsDialogs? »

Добавить к контролу стиль ${WS_VSCROLL} или ${WS_HSCROLL} для вертикальной и горизонтальной полос прокруток соответственно.

ZaxBoys66 13-01-2017 13:09 2703226

PHP код:

# Copyright CatsSoft

# ...:: INFO ::... #

Name "iTEST"
OutFile "iTEST.exe"
InstallDir "$TEMP\iTEST"

# ...:: COMPRESS ::... #

SetCompressor /SOLID /FINAL lzma

# ...:: RUN ::... #

RequestExecutionLevel user

# ...:: SHOW / HIDE ::... #

ShowInstDetails nevershow
ShowUninstDetails NeverShow

# ...:: INCLUDES ::... #

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

# ...:: BRANDING ::... #

BrandingText /TRIMRIGHT " "

# ...:: PAGE ::... #

Page custom page1.create
Page instfiles

# ...:: LANGUAGES ::... #

!insertmacro MUI_LANGUAGE "English" # first language

# ...:: INIT ::... #

Function .onInit
FunctionEnd

# ...:: PAGE 1 ::... #

Function page1.create

  
# ...:: VARIABLES ::... #

  
var /GLOBAL Dialog

  
var /GLOBAL Path.READ

  
var /GLOBAL PATH.FILE
  
var /GLOBAL Btn_Add

  
var /GLOBAL Btn_Read

  GetDlgItem 
$0 $HWNDPARENT 1
  ShowWindow 
$${SW_HIDE}
  
GetDlgItem $0 $HWNDPARENT 2
  ShowWindow 
$${SW_HIDE}
  
GetDlgItem $0 $HWNDPARENT 3
  ShowWindow 
$${SW_HIDE}
  
GetDlgItem $0 $HWNDPARENT 1990
  ShowWindow 
$${SW_HIDE}
  
GetDlgItem $0 $HWNDPARENT 1991
  ShowWindow 
$${SW_HIDE}
  
GetDlgItem $0 $HWNDPARENT 1992
  ShowWindow 
$${SW_HIDE}

  
System::Call "user32::SetWindowPos(i$HWNDPARENT,i,i,i,i 632,i 466,i 0x16)"
  
nsDialogs::Create /NOUNLOAD 1044
  Pop $Dialog
  
${If} $Dialog == error
   Abort
  
${EndIf}
  
System::Call "user32::MoveWindow(i$Dialog,i0,i0,i 632,i 466,i0)"

  
# ...:: PATH FILES ::... #

  
nsDialogs::CreateControl /NOUNLOAD EDIT 0x40000000|0x10000000|0x04000000|0x00010000|0x00000080 0 257915u ""
  
Pop $PATH.FILE

  CreateFont 
$"$(^Font)" "12" "100"
  
SendMessage $PATH.FILE ${WM_SETFONT} $0 0 

  
# ...:: BUTTON ADD FILES ::... #

  
nsDialogs::CreateControl /NOUNLOAD BUTTON 0x40000000|0x10000000|0x04000000|0x00010000 0 82565u 15u ""
  
Pop $Btn_Add
  Strcpy 
$1 $Btn_Add
  GetFunctionAddress 
$"on.Click.Add.Files"
  
nsDialogs::onClick /NOUNLOAD $$3

  SendMessage $Btn_Add 
'${WM_SETTEXT}' '0' "STR:$(^BrowseBtn)"

  
# ...:: LOCATION OF READ ::... #

  
nsDialogs::CreateControl /NOUNLOAD EDIT 0x40000000|0x10000000|0x04000000|0x00010000|0x00000080|0x00000004|0x00200000|0x00100000|0x00000800 0 21596190u "" # 0x00000100|0x00000200
  
Pop $PATH.READ

  CreateFont 
$"$(^Font)" "12" "100"
  
SendMessage $PATH.READ ${WM_SETFONT} $0 0 

  
# ...:: BUTTON READ ::... #

  
nsDialogs::CreateControl /NOUNLOAD BUTTON 0x40000000|0x10000000|0x04000000|0x00010000 0 145u 245u 120u 25u "Read Now ..." Read
  Pop $Btn_Read
  StrCpy 
$1 $Btn_Read
  GetFunctionAddress 
$"On.Click.Read.Files"
  
nsDialogs::onClick /NOUNLOAD $$3

  CreateFont 
$"$(^Font)" "12" "100"
  
SendMessage $Btn_Read 0x0030 $0 0

  nsDialogs
::Show

FunctionEnd

# ...:: ADD FILES ::... #

Function "on.Click.Add.Files"
  
var /GLOBAL MYFILES
  nsDialogs
::SelectFileDialog /NOUNLOAD "open" "C:\" "Files|*.txt;*.ini;*.pls;*.m3u;*.bat;*.nsi;*.nsh;*.dat;*.htm;*.html;*.css;*.js;*.xml;*.rtf;*.log;*.reg;*.lng;*.data;*.json|*.*"
  Pop $0
    StrCpy $MYFILES "
$0"
    ${NSD_SetText} $PATH.FILE "
$MYFILES"
FunctionEnd

# ...:: READ FILES ::... #

Function "
On.Click.Read.Files"
FileOpen $4 "
$MYFILES" r
loop:
    FileRead $4 $1
    SendMessage $PATH.READ ${EM_REPLACESEL} 0 "
STR:$1"
    IfErrors +1 loop
FileClose $4
FunctionEnd

# ...:: SECTION ::... #

Section "
Main" SEC01
SectionEnd

# ...:: END PAGE ::... #

Function .onGUIEnd
FunctionEnd 


Serg866 13-01-2017 17:17 2703308

Цитата:

Цитата Begin2Fly
Добавить к контролу стиль ${WS_VSCROLL} или ${WS_HSCROLL} для вертикальной и горизонтальной полос прокруток соответственно. »

Спасибо. А как это сделать по уму?
Хочу добавить длинный прокручиваемый текст, чтобы нельзя было ничего вводить в окне инсталлятора и чтобы курсор не мигал)
В официальной справке нашёл пример, но там текст редактируется в окошке инсталлятора
Код:

Function fnCustomInit
nsDialogs::Create 1018
                Pop $label
        nsDialogs::CreateControl EDIT \
                "${__NSD_Label_STYLE}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}" \
                "${__NSD_Label_EXSTYLE}" \
                0 50% 100% 40% \
                "This IS a$\r$\nmulti-line$\r$\nedit control"
                Pop $hwnd
 nsDialogs::Show
FunctionEnd


Begin2Fly 13-01-2017 17:31 2703314

Цитата:

Цитата Serg866
Спасибо. А как это сделать по уму? »

По вкусу: https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Serg866 13-01-2017 18:14 2703324

Цитата:

Цитата Begin2Fly

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

Begin2Fly 13-01-2017 18:22 2703328

Цитата:

Цитата Serg866
как отключить редактирование текста внутри окна »

SendMessage $hwnd ${EM_SETREADONLY} 1 0

Serg866 14-01-2017 14:13 2703523

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

den.filipchenko0000 15-01-2017 04:58 2703671

Всем привет! Понадобилось перепаковать одну программу. С nsis до этого был не очень знаком. Поэтому возникла проблема. В секции install пишу:
SetOutPath $PLUGINSDIR
SetOverwrite on
File logo.wav
И так далее...
При попытке создать инсталятор makensis, делаю через командную строку, выбивает, что такой файл не найден. Если пишу полный путь, к примеру:
File D:\myprogs\$PLUGINSDIR\logo.wav
Все работает, файл находится.
Вручную прописывать путь к каждому файлу не вариант, там тысячи файлов, ещё и с подпапками. Рекурсивно все файлы, тоже не подойдет. Видел, что так должно работать, без указания полного пути всмысле, но почему у меня не работает? Файл nsi лежит рядом с $PLUGINSDIR.

Begin2Fly 15-01-2017 05:24 2703672

Цитата:

Цитата den.filipchenko0000
File D:\myprogs\$PLUGINSDIR\logo.wav »

Естественно, файл не найден. Компилятор воспринимает это примерно как D:\myprogs\C:\Users\ИМЯ_ПОЛЬЗОВАТЕЛЯ\AppData\Local\Temp\nsgE66E.tmp\logo.wav
Начните с чтения справочника, потом вопросы задавайте.

den.filipchenko0000 15-01-2017 07:47 2703678

Begin2Fly Begin2Fly вне форума
Справочник я читал, а вот вы мое сообщение, видимо, по-диагонали... Пишу же:
Если написать:
File logo.wav
То файл не находит.
А если написать:
File D:\myprogs\$PLUGINSDIR\logo.wav
То все находит. Вот и вопрос, неужели у каждого файла нужно полный путь прописывать, почему с кратким не находит?

K.A.V. 15-01-2017 12:00 2703709

Цитата:

Цитата den.filipchenko0000
Файл nsi лежит рядом с $PLUGINSDIR. »

Цитата:

Цитата den.filipchenko0000
File D:\myprogs\$PLUGINSDIR\logo.wav »

никак не сходится с вашим утверждением
Цитата:

Цитата den.filipchenko0000
Справочник я читал »

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

Цитата:

Цитата Begin2Fly
Компилятор воспринимает это примерно как D:\myprogs\C:\Users\ИМЯ_ПОЛЬЗОВАТЕЛЯ\AppData\Local\Temp\nsgE66E.tmp\logo.wav »

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

Serg866 15-01-2017 16:37 2703744

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

MKN 17-01-2017 11:23 2704116

Цитата:

Цитата Serg866
самоудаление инсталлятора после окончания установки »

пропиши удаление инсталлятора (с ключом /REBOOTOK), в функции .onInstSuccess (см. Справочник)
Также можно использовать http://nsis.sourceforge.net/SelfDel_plug-in

Flix 17-01-2017 22:24 2704284

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

Kopejkin 22-01-2017 21:59 2705385

Подскажите, пожалуйста, где грабли?
Пытаюсь на Windows 10(x64) импортировать данные реестра из файла в HKEY_LOCAL_MACHINE\SOFTWARE\Licenses.
Вместо этого импорт выполняется в HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Licenses.

Используемый сценарий
Код:

Name "RegistryTest"
OutFile "RegistryTest.exe"

!include "Registry.nsh"
!include "x64.nsh"
         
Page components
Page instfiles


Section "Save to the file"
${If} ${RunningX64}
SetRegView 64
${registry::SaveKey} "HKEY_LOCAL_MACHINE\SOFTWARE\Licenses222" "$EXEDIR\save222.reg" "/U=1 /G=1" $0
${registry::Unload}
StrCmp $0 0 0 +2
MessageBox MB_OK "файл успешно создан" IDOK
StrCmp $0 -1 0 +2
MessageBox MB_OK "ошибка" IDOK
${EndIf}
SectionEnd

Section "Restore from the file"
${If} ${RunningX64}
SetRegView 64
${registry::RestoreKey} "$EXEDIR\tree.reg" $R0
${registry::Unload}
StrCmp $R0 0 0 +2
MessageBox MB_OK "файл успешно импортирован" IDOK
StrCmp $R0 -1 0 +2
MessageBox MB_OK "ошибка" IDOK
${EndIf}
SectionEnd



P.S. ExecWait '$WINDIR\regedit.exe /s "$EXEDIR\tree.reg"' - это работает аналогично импорту в сценарии...

Flix 24-01-2017 17:43 2705893

Цитата:

Цитата Kopejkin
Подскажите, пожалуйста, где грабли? »

Команда SetRegView имеет влияние только на внутренние команды компилятора NSIS, а именно на команды вида ReadReg... и WriteReg.... В вашем сценарии для работы с данными реестра используется внешний инструмент - плагин, которому абсолютно по барабану команда SetRegView. Он (плагин) про неё просто ничего не знает, тем более он использует стандартный инструмент Windows по работе с реестром - regedit.exe. Аналогичная картина и с использованием вами инструмента regedit.exe напрямую. По умолчанию весь импорт ключей реестра из внешних файлов выполняется в WOW6432Node.

Вам нужно или переделать сценарий так, чтобы получить необходимые строки для импорта в реестр и потом задействовать стандартные команды NSIS ReadReg... и WriteReg.... Или воспользоваться консольной программой для доступа к реестру reg.exe с параметрами /reg:32 или /reg:64, которые определяют область видимости реестра. Все параметры reg.exe описаны здесь или можно выяснить в командной строке (reg /?). В вашем случае команда сценария будет примерно такой:

ExecWait '$SYSDIR\reg.exe import "$EXEDIR\tree.reg" /reg:64'

Не уверен, но параметра 'silent' или подавления запроса на импорт данных в реестр программа reg.exe не имеет. Ну и, конечно, не забываем по права Администратора.

Flix 29-01-2017 16:57 2707240

Возможно кому будет интересна альтернативная разработка NSIS без ограничения 2Гб.

Автор: jasonfriday13. Проект: https://sourceforge.net/projects/nsisbi/
Проект создан базе NSIS v3.01. Системные требования: ОС Windows 64-bit.

От автора (перевод):
Цитата:

Эта модификация NSISBI позволяет обойти текущее ограничение 2Гб для файла установки. В этой версии добавлена поддержка использования раздельных файлов для данных инсталляции, что теоретически позволяет получить максимальный размер инсталлятора до 8Эб (эксабайт - 10 в степени 18). Одиночные файлы по прежнему ограничены пределом 2Гб.

Компилятор NSIS (makensis) разработан для работы на ПК с 64-бит ОС, поскольку только на этих системах возможно использование функции для создания инсталляторов с рамерами более 2Гб.

По умолчанию работа модифицированного компилятора аналогична работе классического NSIS и ничем от него не отличается. Это все тот же знакомый вам NSIS. Чтобы активировать функцию преодоления ограничения на 2Гб, используйте в сценарии команду "SetExOutFile" с параметрами "auto | off | on". Параметр "off" отключает функцию и компилятор NSIS работает в стандартном режиме (с ограничением в 2Гб). Параметр "on" включает функцию и компилятор разбивает файл установки на исполняемую часть и архивную, с данными установки. Параметр "auto" позволяет компилятору автоматически принять решение о разделении файла установки. Если размер инсталлятора превысит размер 4Гб, то он переключится на создание внешнего файла с данными. Обратите внимание, если функция активна ("SetExOutFile" с параметром "auto" или "on"), то сжатие данных (команда "SetCompressor") с флагом /SOLID не поддерживается. Это просто не представляется возможным в виду особенностей данного алгоритма.

Также существует команда "Target", не отраженная в документации NSIS. Эта команда позволяет выбрать целевую архитектуру, для которой предназначен создаваемый пакет установки. Допустимые параметры: x86-ansi, x86-unicode, amd64-unicode.

Сборка NSISBI выполнена 16.01.2017 на Windows 10 c использованием Visual Studio 2008 и Windows 7 SDK. По умолчанию компилятор создает 32-bit ANSI инсталляторы. Но вы можете настроить 32-bit Unicode или 64 bit Unicode. В последней версии я допустил ошибку и по умолчанию установил amd64-unicode, теперь исправил на x86-ansi. Также добавил файл clean.bat для очистки каталогов с компиляциями x86 и amd64.

IlyaNSK 01-02-2017 10:25 2707932

Уважаемые форумчане, помогите понять работу с dialog designer
создаю диалог, получаю файлы, инклюдю, помещаю ссылку
!insertmacro MUI_PAGE_INSTFILES
Page custom fnc_getIP_Show ;его нужно запускать после установки файлов
на форме одно тестовое поле $hCtl_getIP_TextBox1.
В какой момент оно получает значение? В какую часть (section) установщика помещать обработку этого значения?

-разобрался, поместил обработчик в функцию вызова диалога в конец после метода ::Show

однако, в поле $hCtl_getIP_TextBox1 вбил "ХХХХХХХХХХХ" а в переменной оказалось 1507670

хм.. что делать?

MKN 01-02-2017 12:22 2707972

Цитата:

Цитата IlyaNSK
что делать? »

Поставь задачу более внятно. (что и каким образом предполагается получить в итоге).

ps dialog designer - задумка хорошая, но практическая реализация бестолковая и незавершённая. После него скрипт приходится , как говориться, дорабатывать напильником, т.е. много чего править вручную. Быстрее сделать с нуля...

Flosik 07-02-2017 17:46 2709746

Здравствуйте.

Подскажите а с Windows 10 есть какой-то способ данный установщик подружить? Нигде не смог этой информации найди.
Проблема заключается в том, что при запуске установщика на Windows 10 его блокирует SmartScreen фильтр. Или же его надо как-то подписывать?

Kopejkin 07-02-2017 22:40 2709827

Цитата:

Цитата Flosik
...его блокирует SmartScreen »

Может вам сначала просто потренироваться пользоваться системой?
Там, в окошке, есть еще дополнительная кнопка...

Flosik 08-02-2017 12:25 2709929

Цитата:

Цитата Kopejkin
Может вам сначала просто потренироваться пользоваться системой?
Там, в окошке, есть еще дополнительная кнопка... »

Да что Вы говорите!? Целая кнопка!? Вот это да...
Я конечно Вас поздравляю с попыткой сумничать. Но нет, спасибо.

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

MKN 08-02-2017 15:23 2710014

Цитата:

Цитата Flosik
сделать установщик валидным для фильтра W8-W10 »

Паскудство со стороны SmartScreen затрагивает многие исполняемые файлы, а не только NSIS-exe. Пол интернета обсуждает эту проблему.
Насколько успешно решение, поищи сам. Навскидку:
http://forums.winamp.com/showthread.php?t=378452
http://stackoverflow.com/questions/1...ed-application
http://www.codeproject.com/Questions...luspreventplus

Kopejkin 08-02-2017 16:45 2710041

Цитата:

Цитата Flosik
Вопрос заключался не в том... »

А мне-то откуда было это знать? Поэтому и ответ был дан в соответствии с содержанием. Формулируйте вопросы яснее :wink:

dimusikus 15-02-2017 07:46 2711862

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

FileVersionInfo.i.res - иконки
FileVersionInfo.res - информация о версии

У меня вопрос по "!packhdr", у меня эта команда не работает если их стоят в коде две подряд:

Код:

!packhdr tmp.dat '"C:\Program Files (x86)\Resource Hacker\ResourceHacker.exe" -addoverwrite tmp.dat, tmp.dat, FileVersionInfo.i.res, icon,,'
!packhdr tmp.dat '"C:\Program Files (x86)\Resource Hacker\ResourceHacker.exe" -addoverwrite tmp.dat, tmp.dat, FileVersionInfo.res, versioninfo,,'

Результат: В выходной файл добавляется информация о версии но не добавляется иконка.

А если строки поменять местами:

Код:

!packhdr tmp.dat '"C:\Program Files (x86)\Resource Hacker\ResourceHacker.exe" -addoverwrite tmp.dat, tmp.dat, FileVersionInfo.res, versioninfo,,'
!packhdr tmp.dat '"C:\Program Files (x86)\Resource Hacker\ResourceHacker.exe" -addoverwrite tmp.dat, tmp.dat, FileVersionInfo.i.res, icon,,'

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

В чём засада?

Dodakaedr 15-02-2017 10:48 2711902

Почему данная команда не удаляет пустой ключ
Код:

${registry::DeleteKeyEmpty} "HKLM\SOFTWARE\Classes\.cr2" $r2
Скрытый текст

зато команда
Код:

DeleteRegKey /ifempty HKLM "SOFTWARE\Classes\.icl"
удаляет даже если в ключе есть параметры.

Smak0ff 14-03-2017 20:25 2719487

Доброго времени суток! Подскажите пожалуйста, какой плагин использовать или какое решение лучше применить для следующей задачи. Необходимо чтобы при запуске инсталлера проводились пинги определенных ip-адресов и проверялась доступность порта. И желательно чтобы всего этого безобразия с пингами и (телнетом?) пользователь не видел. Есть ли какие-то плагины, которые позволяют проверять доступность портов и проводить пинги, а затем выводить статистику отправленных пакетов? Пока решением частичным увиделся запуск батника через nsexec и дальнейший вывод содержимого файла на экран. Опять таки, если делать именно так, то можно ли каким-либо образом в nsis вывести содержимое полученного файла(а в идеале не полное, а, в случае с пингами, процент потерянных пакетов, то есть вывести только нужную часть содержимого текстового файла) на экран, чтобы пользователь мог передать увиденную информацию.
Заранее спасибо, и прошу прощения за, возможно, вопросы, которые здесь уже неоднократно обсуждались. Только начинаю осваивать NSIS и пока что не со всем функционалом разобрался.

MKN 15-03-2017 11:17 2719657

Smak0ff,
посмотри здесь :
http://forums.winamp.com/showthread.php?t=243813
http://nsis.sourceforge.net/Check_open_ports
а также по аналогии погугли (на английском)

Smak0ff 15-03-2017 16:03 2719710

Цитата:

Цитата MKN
Smak0ff,
посмотри здесь :
http://forums.winamp.com/showthread.php?t=243813
http://nsis.sourceforge.net/Check_open_ports
а также по аналогии погугли (на английском) »

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

ZaxBoys66 16-03-2017 16:28 2720028

Update ...
NSIS installer fabulous complex and it can be installed in two modes (standard and portable)...
Unfortunately NSIS does not support changing the language after .onInit of those we sought a way to implement this, but you may experience some programming errors.

Kopejkin 19-03-2017 18:38 2721050

Цитата:

Цитата ZaxBoys66
NSIS installer ... »

SkinBtn::Init - wtf?

ZaxBoys66 19-03-2017 20:22 2721094

@Kopejkin NSIS Installer Plugins or visit this forum: http://www.nsisfans.com/forum.php?mo...thread&tid=626

Kopejkin 19-03-2017 21:15 2721111

And could you immediately indicate which plug-ins are needed?
I had to add ToolTips and InetBgDL.

When installing the portable version, the last installer window was somehow empty.
There is no text on the button.

Screenshot

ZaxBoys66 20-03-2017 17:08 2721400

#Kopejkin >> Update templates now download again

Kopejkin 20-03-2017 21:55 2721492

Yes, now everything is fine.
Thank you.
Screenshot

ZaxBoys66 24-03-2017 21:02 2722713

NSIS uses plugin bass.dll to play radio stations

MaGoth 28-03-2017 17:21 2723800

Привет народ, :)
Может кто посоветует куда копать или как сделать так, чтобы при переходе на страницу с компонентами инсталла, автоматически проставлялась галка для опции языка в зависимости от регионального значения языка в ОС ?!
Надеюсь понятно пояснил..

MKN 29-03-2017 13:28 2724058

Цитата:

Цитата MaGoth
автоматически проставлялась галка для опции языка в зависимости от регионального значения языка в ОС ? »

Определяешь в Function .onInit установленный язык(ID или Culture Code). К примеру, так :
Код:

System::Call 'kernel32::GetSystemDefaultLangID() i .r0'
IntOp $0 $0 & 0xFFFF
IntFmt $0 "%04X" $0
MessageBox MB_OK "$0"  ;0419 для русского

И исходя из полученного, устанавливаешь или снимаешь галки (отметки) с нужных языковых чекбоксов...
http://msdn.microsoft.com/en-us/libr...(v=cs.20).aspx

MaGoth 29-03-2017 20:10 2724177

Народ еще вопрос(ы):
1. По плагину nsDialog, к нему толковое руководство есть кроме вики на сайте? А еще лучше примерчики с комментами каких нибудь инсталлеров?
2. Для окна выбора компонентов никто не соорудил плагина с комбинированием чек-боксов и радиобаттонов?!

Спасибо.. :)

Flix 29-03-2017 22:26 2724209

Цитата:

Цитата MaGoth
По плагину nsDialog, к нему толковое руководство есть кроме вики на сайте? »

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

MKN 30-03-2017 10:16 2724290

Цитата:

Цитата MaGoth
А еще лучше примерчики с комментами каких нибудь инсталлеров? »

Если проштудировать всю здешнюю тему(где много чего уже решено и разобрано), то вполне можно составить руководство с примерами и по nsDialog и др. :)
Лучше задавать конкретные вопросы с собственными вариантами решения (пусть и не верными...). Тогда есть шанс на результат. :)

Андрей1990 18-04-2017 15:13 2730367

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

MKN 18-04-2017 17:34 2730416

Цитата:

Цитата Андрей1990
чтобы программа после установки открывалась от имени администратора? »

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

С помощью ShellLink plug-in http://nsis.sourceforge.net/ShellLink_plug-in
С помощью громозды из кода : http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag
С помощью правки HEX в самом ярлыке, что реализовал K.A.V. в adminShortCut.nsh -
см. "Запуск от имени администратора" в свойствах ярлыка на 148 странице темы

ну и ессно админзапуск можно сделать с помощью сторонних утилит, которых море и которые к NSIS не имеют отношения...

Андрей1990 18-04-2017 18:36 2730429

Цитата:

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

С помощью ShellLink plug-in http://nsis.sourceforge.net/ShellLink_plug-in
С помощью громозды из кода : http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag
С помощью правки HEX в самом ярлыке, что реализовал K.A.V. в adminShortCut.nsh -
см. "Запуск от имени администратора" в свойствах ярлыка на 148 странице темы

ну и ессно админзапуск можно сделать с помощью сторонних утилит, которых море и которые к NSIS не имеют отношения...
Спасибо большое)

Андрей1990 18-04-2017 19:53 2730460

Задам еще пару вопросов)))
Как выставить свою иконку на приложение exe, которое устанавливаю?

Когда нажимаю "Uninstall", файлы и папка из меню пуск-программы не удаляется(

И последнее: когда выставляю свойства "от имени администратора" для ярлыков, как советовали выше(пример взял со стр. 183), ярлык из меню пуск-программы не работает.
Прилагаю свой код:
Скрытый текст


Name "SetupSpectran119"
OutFile "SetupSpectran119.exe"

InstallDir "$PROGRAMFILES\LOMO PHOTONICS\Spectran119"
InstallDirRegKey HKLM SOFTWARE\NSIS_LOMO_PHOTONICS\Spectran119 "Install_Dir"

Section "Spectran119 (required)"
SectionIn RO
SetOutPath $INSTDIR
File /r "C:\Users\Ф1\Desktop\Спектран\"
File "C:\Users\Ф1\Desktop\Спектран\spectran119.exe"
WriteRegStr HKLM SOFTWARE\NSIS_LOMO_PHOTONICS\spectran119 "Install_Dir" "$INSTDIR"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\spectran119" "DisplayName" " spectran119 (только удаление)"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\spectran119" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteUninstaller "uninstall.exe"
SectionEnd

Section "Start Menu Shortcuts"
CreateDirectory "$SMPROGRAMS\LOMO PHOTONICS\spectran119"
CreateShortCut "$SMPROGRAMS\LOMO PHOTONICS\spectran119\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
CreateShortCut "$SMPROGRAMS\LOMO PHOTONICS\spectran119\spectran119.lnk" "$INSTDIR\spectran119.exe" "" "$INSTDIR\spectran119.exe" 0
CreateShortCut "$DESKTOP\spectran119.lnk" "$INSTDIR\spectran119.exe" "" "$INSTDIR\spectran119.exe" 0
${aSC::SetON} "$DESKTOP\spectran119.lnk"
${aSC::SetON} "$SMPROGRAMS\LOMO PHOTONICS\spectran119\spectran119.lnk"
SectionEnd

UninstallText "Программа spectran119 будет удалена с вашего компьютера. Нажмите Uninstall, чтобы продолжить." "Удаляем программу из:"

Section "Uninstall"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\spectran119.exe"
DeleteRegKey HKLM SOFTWARE\NSIS_LOMO_PHOTONICS\spectran119
Delete $INSTDIR\makensisw.exe
Delete $INSTDIR\uninstall.exe
Delete "$SMPROGRAMS\LOMO PHOTONICS\spectran119\*.*"
RMDir "$SMPROGRAMS\LOMO PHOTONICS\spectran119" ; удалить каталог myprog из меню Программы
Delete "$DESKTOP\spectran119.lnk" ; удалить ярлык с рабочего стола
RMDir /r "$PROGRAMFILES\LOMO PHOTONICS\spectran119"
SectionEnd


Помогите новичку)))

MKN 19-04-2017 10:16 2730626

Андрей1990,
Твой вышеприведённый код указывает на отсутствие даже начальных знаний "матчасти" NSIS...
При таком раскладе сложно (и даже бесполезно) вести конструктивный диалог... Без обид.
Поэтому, для начала изучи по ссылкам из шапки :
Цитата:

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

Андрей1990 19-04-2017 12:09 2730658

Никаких обид)
Я действительно не знаю NSIS. Просто надо сделать установщик)))

Андрей1990 19-04-2017 12:49 2730664

И, кстати, "Справочник по NSIS" - пустой)))

Painkiller 19-04-2017 16:37 2730741

Андрей1990, разблокируйте

MaGoth 20-04-2017 03:53 2730848

Цитата:

Цитата Андрей1990
И, кстати, "Справочник по NSIS" - пустой))) »

В свойствах это файла жми ПКМ свойста, а далее, разблокировать напротив строки: "Файл получен из Инета, заблокирован" или как-то так, далее Применить и Ок. После этого все будет видно..

Rool6 23-04-2017 14:06 2731668

Друзья, подскажите.

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

Делаю:
SetOutPath "${instdir}${Main_Dir}\" ;путь куда будем копировать
File /r "$EXEDIR\eee*" ;копируем все файлы из папки EEE, которая лежит рядом с инсталятором (она физически есть на диске, и в ней есть файлы)

Пробовал File /r "$EXEDIR\eee\*" - ошибка так же

Но выдаёт ошибку мол фалы не в этой папке не найдены.

Пробовал добавлять "\nofatal"
File /nonfatal /r "$EXEDIR\exe\*" - компиляция проходит, но файлы не копируются при запуске инсталятора

Пробую через переменную:
!define exe_dir "$EXEDIR"

SetOutPath "${instdir}${Main_Dir}\" ;путь куда будем копировать
File /r "${exe_dir}\eee*" ;копируем все файлы из папки EEE, которая лежит рядом с инсталятором

Ошибка ровно та же.

Пробую вывести сообщением, какой же путь оно имеет ввиду.
MessageBox MB_OK|MB_ICONSTOP "${exe_dir}\eee"
и
MessageBox MB_OK|MB_ICONSTOP "$EXEDIR\eee"

Путь видит правильный в обоих вариантах...

Пробую вместо $EXEDIR указать сам путь
File /r "d:\путь\eee*"


Так всё копируется нормально

Подскажите, что я делаю не так?

MaGoth 07-05-2017 10:00 2734758

Цитата:

Цитата Rool6
Задача: скопировать файлы из папки, которая лежит рядом с инсталятором в произвольную. »

Попробуй так:
CopyFiles ".\Orig_Dir\*.*" "$INSTDIR\Main_Dir"

Где:
Orig_Dir — папка, которая лежит рядом с инсталлятором.
Main_Dir — папка, куда копируем файлы.

AlekseyPopovv 26-05-2017 16:41 2739872

Как поставить пароль на инсталлятор, что бы нельзя было открыть в 7zip?
Ну и естественно, что бы при запуске пароль не требовался.

Serg866 27-05-2017 12:44 2740059

Коллеги, не срабатывает автоматическое определение папки установки на 64-разрядных системах

Сам код такой функции такой:
Код:

Function .OnInit
${If} ${RunningX64}
SetRegView 64
ClearErrors
ReadRegStr "$INSTDIR" HKLM "Software\MyProgram" "Install Dir"
ClearErrors
SetRegView 32
${EndIf}
FunctionEnd

в скрипте также прописана подгрузка нужных nsh
Код:

!include "x64.nsh"
!include "FileFunc.nsh"

а также InstallDirRegKey
Код:

InstallDirRegKey HKLM "Software\MyProgram" "Install Dir"

Использую юникод НСИС 3.0.
На 32-разрядной системе папка определяется, т.е функция срабатывает.
А на Windows x64 пустое поле в окне выбора папки установки...
Компилятор ошибок не выдаёт.

Что не так делаю, ребят?

Flix 28-05-2017 00:00 2740175

Цитата:

Цитата Serg866
Что не так делаю, ребят? »

А вы уверены, что на 64-бит системах, в указанной ветке реестра, действительно существует такой ключ? Может он прописан в 32-бит разделе и его нужно искать там? Уберите условие и проверьте, какой путь в таком случае покажет установщик.

Serg866 28-05-2017 12:53 2740254

Спасибо. Действительно в 32-битном разделе ключ.
Код функции убрал, путь определился.

AlekseyPopovv 03-06-2017 12:17 2741814

Мне нужно найти файл "file.exe" на компе (он может быть в любом месте) и путь до него записать в переменную. Как это сделать?

icq99999999 15-07-2017 14:24 2751599

Подскажите, пожалуйста
Пытаюсь на Windows 7 импортировать данные реестра командой ExecWait '$SYSDIR\reg.exe import "$EXEDIR\Settings.reg"'
но reg файл не корректно импортируется (и дело явно не в reg файле)
Скрытый текст
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\DesktopBackground\Shell\Menu1]
"MUIVerb"="Программы"
"SubCommands"="notepad;calc"
"icon"="explorer.exe"
"Position"="bottom"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\notepad]
@="Блокнот"
"icon"="notepad.exe"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\notepad\com mand]
@="notepad.exe"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\calc]
@="Калькулятор"
"icon"="calc.exe"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\calc\comman d]
@="calc.exe"

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

Begin2Fly 15-07-2017 14:27 2751600

icq99999999, а если regedit.exe /s "$EXEDIR\Settings.reg"

icq99999999 15-07-2017 14:36 2751603

пробовал так: nsExec::Exec 'regedit.exe /s "$EXEDIR\Settings.reg"'
всю равно, хоть на рабочем столе и появляется меню но оно не открывается

Begin2Fly 15-07-2017 14:39 2751604

icq99999999, пробелы лишние в слове command.

icq99999999 15-07-2017 14:46 2751607

Begin2Fly, пробелы появились когда я копировал текс на сайт, а так в самом reg файле их нет
дело явно не в reg файле..

Begin2Fly 15-07-2017 16:41 2751621

icq99999999,
${DisableX64FSRedirection}
ExecWait '$WINDIR\regedit.exe /s "$EXEDIR\Settings.reg"'

icq99999999 15-07-2017 17:52 2751634

ну вот теперь всё работает. кстати как можно подняться на папку выше чем $EXEDIR ? и присвоить этот путь переменной

Begin2Fly 15-07-2017 18:18 2751643

Цитата:

Цитата icq99999999
кстати как можно подняться на папку выше чем $EXEDIR ? и присвоить этот путь переменной »

http://nsis.sourceforge.net/Get_parent_directory

DeDyJIR 01-08-2017 21:53 2755556

Разъясните. Перешел на 3.02 с 3.0, появилась небольшая проблема. Раньше после запуска инсталятора выводилось диалоговое окно выбора языка установки, сейчас его нет, но если установку производить на ОС с английским интерфейсом язык меняется и все отрабатывает согласно коду под англоязык. Это нововведения или необходимо доработать?

Теперь для появления диалогового окна необходимо дописывать следующее:
Код:

;--------------------------------
;Interface Settings

  !define MUI_ABORTWARNING

  ;Show all languages, despite user's codepage
  !define MUI_LANGDLL_ALLLANGUAGES


Serg866 13-08-2017 09:31 2758038

Привет
Вопрос по nsDialogs
Создаю страничку с чекбоксом, как добавить чекбокс разобрался, теперь нужно обеспечить взаимодействие с флажком. Например, хотелось бы, чтобы кнопка "Далее" становилась активна только когда пользователь поставит флажок в чекбоксе. Может есть примеры с такой функцией? Спасибо!

Flix 13-08-2017 10:45 2758045

Цитата:

Цитата Serg866
Например, хотелось бы, чтобы кнопка "Далее" становилась активна только когда пользователь поставит флажок в чекбоксе. Может есть примеры с такой функцией? »

Посмотрите в разделе NsDialogs FAQ на домашней страничке NSIS. В первом примере "How to Enable/Disable a control" (Как Включить/Отключить элемент управления) показан как раз ваш случай.

Serg866 13-08-2017 16:34 2758106

Там показана манипуляция с созданной кнопкой. А как сделать так же со стандартной кнопкой ("Далее")?

Flix 13-08-2017 18:52 2758121

Цитата:

Цитата Serg866
А как сделать так же со стандартной кнопкой ("Далее")? »

Вот так, например: :cool:
Скрытый текст
Код:

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"
 
Page Custom pre
Page license
Page instfiles

var dialog
var hwnd
 
Function pre
  nsDialogs::Create 1018
  Pop $dialog
  ${NSD_CreateCheckbox} 0 0 50% 6% "Enable button Next"
    Pop $hwnd
    ${NSD_OnClick} $hwnd EnDisableButton

  GetDlgItem $0 $HWNDPARENT 1 # get handle next/install button
  EnableWindow $0 0          # disable next/install button

  nsDialogs::Show
FunctionEnd

Function EnDisableButton
  Pop $hwnd
  GetDlgItem $1 $HWNDPARENT 1
  ${NSD_GetState} $hwnd $0
  ${If} $0 == 1
    EnableWindow $1 1
  ${Else}
    EnableWindow $1 0
  ${EndIf}
FunctionEnd

Section ""
SectionEnd


ZVSRus 27-10-2017 17:05 2773784

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

на 32 битной системе по пути App\papka32\proga.exe

на 64 битной системе по пути App\papka64\proga.exe

MKN 27-10-2017 18:42 2773808

ZVSRus,
Наверное, как в справке и в сотне примеров в теме :
Код:

!include "x64.nsh"
!include "LogicLib.nsh"

${If} ${RunningX64}
ExecWait "путь\App\papka64\proga.exe"
${Else}
ExecWait "путь\App\papka32\proga.exe"
${EndIf}


ZVSRus 27-10-2017 19:22 2773821

MKN,
Спасибо, я в данной теме пару дней.
И последний штрих, поможете прикрутить к данной функции ваш код (ненужное за комментировать)

Скрытый текст

Код:

Function Launch
SetOutPath "$EXEDIR\${APPDIR}"
${GetParameters} $0
ExecWait `"$EXEDIR\${APPDIR}\${APPEXE}"${APPSWITCH} $0`

!include "x64.nsh"
!include "LogicLib.nsh"

${If} ${RunningX64}
ExecWait "путь\App\papka64\proga.exe"
${Else}
ExecWait "путь\App\papka32\proga.exe"
${EndIf}

ReadEnvStr $0 USERNAME
WriteINIStr "$EXEDIR\Data\${APP}Portable.ini" "${APP}Portable" "UserName" "$0"
WriteINIStr "$EXEDIR\Data\${APP}Portable.ini" "${APP}Portable" "GoodExit" "true"
FunctionEnd


Salmo 15-11-2017 19:59 2777787

Подскажите, уважаемые, кто делал такую штуку или знает как сделать.... У меня в фоне работает консольная утилита. Иногда ее надо срочно закрыть. Нужна на экран плавающая кнопка стоп (цветная, с иконкой, 20х20 мм), нажав на которую можно закрыть (убить) процесс. Запускает консольную утилиту ЕХЕ_шник на NSIS (процесс без окна) и ждет ее завершения. Кнопку можно запаковать в отдельный ЕХЕ файл. Я очень давно собирал инсталляторы и навык потерял.... :sorry:

Iska 15-11-2017 20:27 2777790

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

MKN 21-11-2017 11:47 2779189

Цитата:

Цитата Salmo
Нужна на экран плавающая кнопка стоп »

Как вариант, (комплект - код с примером и нужными плагинами) - см. прикреплённый файл
На примере убиения процесса виндового калькулятора (используется плагин nsProcess).
(Кнопка с фейсом поверх окон, можно перетаскивать, с маленькой кнопочкой для закрытия, с иконкой на кнопке 32x32)
Ессно размеры и пр косметику можно изменять по вкусу...


ZVSRus 21-11-2017 20:20 2779301

Всем доброго времени суток!
Подскажите какая константа соответствует дате и времени суток?
Если точнее, как прописать в ini файл дату и время компиляции?

MKN 22-11-2017 11:05 2779400

Цитата:

Цитата ZVSRus
как прописать в ini файл дату и время компиляции? »

Как вариант-пример записи в уже имеющийся файл myinifile.ini :
(если файла нет - ессно сначала создать)
Код:

!define /date MyTIMESTAMP "%Y-%m-%d-%H-%M-%S"
OutFile "Test-${MyTIMESTAMP}.exe"
       
;http://nsis.sourceforge.net/mediawiki/index.php?title=Reference/WriteINIStr
Section
WriteINIStr $EXEDIR\myinifile.ini section1 myinifile ${MyTIMESTAMP}
WriteINIStr $EXEDIR\myinifile.ini section1 myinifileelse "ещё запись в section1"
WriteINIStr $EXEDIR\myinifile.ini section2 nsis ${MyTIMESTAMP}
SectionEnd


gamma 04-12-2017 17:50 2782289

Добрый вечер!

Подскажите в чем проблема?

Код:


Name "test"
OutFile "Test.exe"
RequestExecutionLevel user
InstallDir "$APPDATA\1"

Icon "icon.ico"

SilentInstall silent

Section
SetOutPath $INSTDIR

File "test.txt"

Exec '"$INSTDIR\test.txt"'

SectionEnd

Компиляция проходит успешно.Файлы распакуются в директорию appdata, нужно открыть файл txt. Ничего не выходит. Пробовал через "FileOpen" Такая же фигня.

MKN 05-12-2017 11:34 2782436

gamma,
Используй ExecShell
Например :
ExecShell "" "$EXEDIR\test.txt"

Alex S 04-01-2018 01:47 2788824

Мужики, помогите разобраться... Второй день вожусь. Сделал две кастомные странички, на первой есть чекбокс выбора создания ярлыка в меню Пуск, на второй кнопка выбора папки в меню Пуск. Не могу заставить вторую страницу считывать состояние отметки чекбокса и в зависимости от отметки активировать/деактивировать кнопку...
Код
!define PRODUCT_NAME "MyProg"
!define PRODUCT_VERSION "1.0"

SetCompressor lzma
!include "MUI2.nsh"
!include "nsDialogs.nsh"

Var CustPage1
Var DirRequest_Txt
Var DirRequest_Btn

var CustPage2
Var Check
var CheckBox1

!insertmacro MUI_PAGE_WELCOME
Page custom fnCustPage1
Page custom fnCustPage2

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

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

;======================-Первая страница-=========================;
Function fnCustPage1
nsDialogs::Create 1018
Pop $CustPage1
!insertmacro MUI_HEADER_TEXT "..." "..."
${NSD_CreateCheckBox} 10u 90u 100u 12u "Ярлык в меню «Пуск»"
Pop $CheckBox1
${NSD_SetState} $CheckBox1 1
;${NSD_OnClick} $CheckBox1 fnCheckBox ; Такой вариант не работает
nsDialogs::Show
FunctionEnd
;======================-Вторая страница-=========================;
Function fnCustPage2
nsDialogs::Create 1018
Pop $CustPage2
!insertmacro MUI_HEADER_TEXT "..." "..."

${NSD_CreateText} 10.09u 86.38u 224.53u 13.31u "C:\ProgramData\Microsoft\Windows\Start Menu\Programs"
Pop $DirRequest_Txt

${NSD_CreateButton} 240.94u 86.38u 50.49u 13.31u "Обзор..."
Pop $DirRequest_Btn
${NSD_OnClick} $DirRequest_Btn fnc_DirRequest_Click
;Call fnCheckBox ; Такой вариант тоже не работает
nsDialogs::Show
FunctionEnd
;===========================================================;
Function fnCheckBox
Pop $CheckBox1
${NSD_GetState} $CheckBox1 $Check
${If} $Check = 1
EnableWindow $DirRequest_Txt 0
EnableWindow $DirRequest_Btn 0
${ElseIf} $Check = 0
EnableWindow $DirRequest_Txt 1
EnableWindow $DirRequest_Btn 1
${EndIf}
FunctionEnd
;===========================================================;
Function fnc_DirRequest_Click
Pop $R0
${If} $R0 == $DirRequest_Btn
${NSD_GetText} $DirRequest_Txt $R0
nsDialogs::SelectFolderDialog /NOUNLOAD "" "$R0"
Pop $R0
${If} "$R0" != "error"
${NSD_SetText} $DirRequest_Txt "$R0"
${EndIf}
${EndIf}
FunctionEnd
;===========================================================;
Section "" SEC01
SectionEnd

MKN 04-01-2018 12:38 2788859

Alex S,
Навскидку, можно как то так (если я правильно понял суть...), но без активации/деактивации кнопки :

код

!define PRODUCT_NAME "MyProg"
!define PRODUCT_VERSION "1.0"

;SetCompressor lzma
!include "MUI2.nsh"
!include "nsDialogs.nsh"

Var CustPage1
Var DirRequest_Txt
Var DirRequest_Btn

var CustPage2
var CheckBox1

!insertmacro MUI_PAGE_WELCOME
Page custom fnCustPage1
Page custom fnCustPage2

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

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

;======================-Первая страница-=========================;
Function fnCustPage1
nsDialogs::Create 1018
Pop $CustPage1
!insertmacro MUI_HEADER_TEXT "..." "..."
${NSD_CreateCheckBox} 10u 90u 100u 12u "Ярлык в меню «Пуск»"
Pop $CheckBox1
${NSD_SetState} $CheckBox1 1
${NSD_OnClick} $CheckBox1 fnCheckBox
nsDialogs::Show
FunctionEnd

Function fnCheckBox
;Pop $CheckBox1
${NSD_GetState} $CheckBox1 $9
FunctionEnd

;======================-Вторая страница-=========================;
Function fnCustPage2
${If} $9 == "0"
nsDialogs::Create 1018
Pop $CustPage2
MessageBox MB_OK "выбираем путь для ярлыка"
!insertmacro MUI_HEADER_TEXT "..." "..."

${NSD_CreateText} 10.09u 86.38u 224.53u 13.31u "C:\ProgramData\Microsoft\Windows\Start Menu\Programs"
Pop $DirRequest_Txt

${NSD_CreateButton} 240.94u 86.38u 50.49u 13.31u "Обзор..."
Pop $DirRequest_Btn
${NSD_OnClick} $DirRequest_Btn fnc_DirRequest_Click
nsDialogs::Show
${Else}
MessageBox MB_OK "код для ярлыка в меню «Пуск»"
${EndIf}
FunctionEnd
;===========================================================;
Function fnc_DirRequest_Click
Pop $R0
${If} $R0 == $DirRequest_Btn
${NSD_GetText} $DirRequest_Txt $R0
nsDialogs::SelectFolderDialog /NOUNLOAD "" "$R0"
Pop $R0
${If} "$R0" != "error"
${NSD_SetText} $DirRequest_Txt "$R0"
${EndIf}
${EndIf}
FunctionEnd
;===========================================================;
Section "" SEC01
SectionEnd

Flix 04-01-2018 13:31 2788865

Alex S,
Вот вам еще один пример. :)
сценарий
Код:

!define PRODUCT_NAME "MyProg"
!define PRODUCT_VERSION "1.0"

SetCompressor lzma
!include "MUI2.nsh"
!include "nsDialogs.nsh"

Var CustPage1
Var DirRequest_Txt
Var DirRequest_Btn
Var DirApp

Var CustPage2
Var Check
var CheckBox1

!insertmacro MUI_PAGE_WELCOME
Page custom fnCustPage1 fnCheckBox
Page custom fnCustPage2 DirRequest

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

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

;======================-Первая страница-=========================;
Function fnCustPage1
  nsDialogs::Create 1018
  Pop $CustPage1
  ${If} $CustPage1 == error
    Abort
  ${EndIf}

  !insertmacro MUI_HEADER_TEXT "..." "..."
  ${NSD_CreateCheckBox} 10.09u 86.38u 100u 12u "Ярлык в меню «Пуск»"
  Pop $CheckBox1
  ${NSD_Check} $CheckBox1
 
  ${If} $Check == ${BST_UNCHECKED}
    ${NSD_UnCheck} $CheckBox1
  ${EndIf}
 
  nsDialogs::Show
FunctionEnd

;======================-Вторая страница-=========================;
Function fnCustPage2
  nsDialogs::Create 1018
  Pop $CustPage2
  ${If} $CustPage2 == error
    Abort
  ${EndIf}

  !insertmacro MUI_HEADER_TEXT "..." "..."
 
  ${NSD_CreateText} 10.09u 86.38u 224.53u 13.31u $SMPROGRAMS
  Pop $DirRequest_Txt
 
  ${NSD_CreateButton} 240.94u 86.38u 50.49u 13.31u "Обзор..."
  Pop $DirRequest_Btn
  ${NSD_OnClick} $DirRequest_Btn fnc_DirRequest_Click
 
  ${If} $Check == ${BST_UNCHECKED}
    EnableWindow $DirRequest_Txt 0
    EnableWindow $DirRequest_Btn 0
  ${EndIf}
 
  nsDialogs::Show
FunctionEnd

;===========================================================;
Function fnCheckBox
  ${NSD_GetState} $CheckBox1 $Check
FunctionEnd

;===========================================================;
Function fnc_DirRequest_Click
  ${NSD_GetText} $DirRequest_Txt $DirApp
  nsDialogs::SelectFolderDialog "Выберите папку или создайте новую:" $DirApp
  Pop $DirApp
  ${If} $DirApp != error
    ${NSD_SetText} $DirRequest_Txt $DirApp
  ${EndIf}
FunctionEnd

;===========================================================;
Function DirRequest
  ${NSD_GetText} $DirRequest_Txt $DirApp
FunctionEnd

;===========================================================;
Section "" SEC01
SectionEnd


RedCatX 04-01-2018 15:13 2788876

Всем привет! Помогите, пожалуйста мне с такой проблемой: есть установщик состоящий из двух страниц - MUI_PAGE_WELCOME и MUI_PAGE_INSTFILES, и нужно чтобы этот установщик, при запуске с определённым ключом, сразу же показывал страницу MUI_PAGE_INSTFILES, начинал установку, и закрывался после завершения. То есть как бы Silent-режим, не требующий никаких действий от пользователя, но с отображением прогресса. Заранее спасибо!

Flix 04-01-2018 17:22 2788904

RedCatX, вот простейший пример:
сценарий
Код:

;--------------------------------
  !include "MUI2.nsh"
  !include "FileFunc.nsh"
;--------------------------------

  Name "Modern UI Test"
  OutFile "SkipWelcome.exe"
  InstallDir "$LOCALAPPDATA\Modern UI Test"
  RequestExecutionLevel user

;--------------------------------
;Interface Settings

  !define MUI_ABORTWARNING

;--------------------------------
;Pages

  !define MUI_PAGE_CUSTOMFUNCTION_PRE ReadOption
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW OnOffPageShow
  !insertmacro MUI_PAGE_WELCOME

  !insertmacro MUI_PAGE_INSTFILES

;--------------------------------
;Languages

  !insertmacro MUI_LANGUAGE "Russian"

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

Section "Test"

SectionEnd

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

Function ReadOption
  StrCpy $R2 0
  ${GetParameters} $R0
  ${GetOptions} $R0 "/skippage" $R1
  ${Unless} ${Errors}
    StrCpy $R2 1
  ${EndUnless}
FunctionEnd

Function OnOffPageShow
  ${If} $R2 == 1
    Abort
  ${EndIf}
FunctionEnd


Если запустить файл SkipWelcome.exe без параметров, то будет показана страничка приветствия.
Если запустить его с ключем "/skippage" (SkipWelcome.exe /skippage), то будет показана только страничка установки.

Условие "... и закрывался после завершения" реализуйте самостоятельно. :)

Alex S 04-01-2018 20:40 2788950

Вложений: 1
Спасибо большое, помогло... Есть еще один вопрос, ответ на который давненько ищу. Как можно изменить вид дерева папок, отображаемого в окне выбора каталога. Имею ввиду ограничить это дерево видом только папки Программы и её подпапок в меню Пуск, а не деревом всего диска C:\. То есть папку(ярлык) можно выбрать или создать в Программы в меню Пуск. Для ясности вопроса прилагаю скрин желаемого вида.

Flix 05-01-2018 01:42 2789016

Цитата:

Цитата Alex S
Как можно изменить вид дерева папок, отображаемого в окне выбора каталога. »

Можно сделать и так. Для этого нужно использовать вызов диалога выбора папок с желаемыми параметрами, которые определяются структурой BROWSEINFO. С помощью флагов (ulFlags) вы можете установить желаемый вид окошка, а при помощи параметра pidlRoot задать корневой каталог, выше которого невозможно будет перейти. Пример вызова диалога выбора папки с пользовательскими настройками приведен в статье "Browse for Folder" на NSIS Wiki. Вам его необходимо только адаптировать под собственные условия.

Сценарий, который приведен под заголовком "Code", можно поместить в заголовочный файл (*.nsh) и подключить к файлу проекта (!include). А в самом файле проекта вместо инструкции nsDialogs::SelectFolderDialog использовать вызов функции Call BrowseForFolder.

Alex S 10-01-2018 20:12 2790381

Что-то не выходит... Сколько не пытался реализовать прочитанное тут в скрипте отсюда (по совету Flix), результат нулевой. Товарищи, помогите кто знает, как решить задачу получения нужного вида...

MKN 12-01-2018 12:34 2790780

Цитата:

Цитата Alex S
результат нулевой »

Уж очень замороченная та кодо-портянка из Wiki... (может когда нибудь соответствующий плагин появится...)

Проще для конкретного выбора при обзоре, использовать системные папки (у каждой папки, своя константа)...
(здесь некоторые константы : http://www.pinvoke.net/default.aspx/Enums.CSIDL )

Пример с константой CSIDL_PROGRAM_FILES 0x26 :

Код:

!include "nsDialogs.nsh"
!include "LogicLib.nsh"

OutFile "test_SHGetSpecialFolderLocation.exe"

Section
System::Call 'SHELL32::SHGetSpecialFolderLocation(i0,i0x26,*i.r2)i.r0'
System::Call '*(i$hwndparent,i$2,i,t "Мой текст",i0x241,kr3,i0,i0)i.r1'
System::Call 'SHELL32::SHBrowseForFolder(ir1)i.r0'
System::Call 'OLE32::CoTaskMemFree(ir2)'
System::Free $1
${If} $0 <> 0
    System::Call 'SHELL32::SHGetPathFromIDList(i$0,t "" R9)'
    MessageBox mb_ok SHBrowseForFolder=$R9
${EndIf}
System::Call 'OLE32::CoTaskMemFree(ir0)'
SectionEnd


skinny21 28-01-2018 12:05 2794182

Подскажите как сделать так чтобы работало открытие файла, путём перетаскивания файла на лаунчер. В этой портативки работает https://www.upload.ee/files/7940760/...table.exe.html

ZVSRus 28-01-2018 20:52 2794253

Цитата:

Цитата skinny21
Подскажите как сделать так чтобы работало открытие файла, путём перетаскивания файла на лаунчер.

Что имеется ввиду под перетаскиванием файла?

skinny21 28-01-2018 21:04 2794259

Цитата:

Цитата ZVSRus
Что имеется ввиду под перетаскиванием файла? »

drag-n-drop, в извращённом скрипте от Appz и в PAF это работает. Нужно вписать в нормальный скрипт, без всяких костылей в виде Launcher.nsh. Перетаскивание именно на сам лаунчер, а не в окно программы.

ZVSRus 28-01-2018 21:34 2794263

skinny21
Цитата:

в извращённом скрипте от Appz и в PAF это работает
Почему в извращённом, скрипты NSIS заточенные под портативку и те или иные действия прописанные в лаунчере.

Цитата:

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

skinny21 28-01-2018 21:43 2794264

Цитата:

Цитата ZVSRus
Не совсем понятная формулировка, что перетащить »

В данном случае, берётся образ и закидывается на сам лаунчер UltraISOPortable.exe

ZVSRus 28-01-2018 22:02 2794267

Цитата:

Цитата skinny21
В данном случае, берётся образ и закидывается на сам лаунчер UltraISOPortable.exe

Снова не понятно, что за образ, и как это закидывается на сам лаунчер.
Может вам нужен лаунчер к портативке собранной в один файл в турбо или тинапе или к портативке от автора программы?

skinny21 28-01-2018 22:13 2794268

Цитата:

Цитата ZVSRus
что за образ »

Образ Христа Спасителя :)

Flix 29-01-2018 02:17 2794292

Цитата:

Цитата skinny21
Подскажите как сделать так чтобы работало открытие файла, путём перетаскивания файла на лаунчер. »

При работе функции Drag-N-Drop средствами виндовс исполняемому файлу в качестве аргумента командной строки передается полный путь к перетаскиваемому файлу. Таким образом, средствами NSIS вам необходимо получить полный путь к перетаскиваемому файлу и передать его файлу программы в качестве аргумента. Параметры командной строки определяются путем чтения значения из переменной $CMDLINE. Есть уже готовая функция, которая выполняет эту операцию: Get command line parameters

Вам останется только прикрутить её к вашему сценарию.

Вот простейший пример её использовании (на базе UltraISOPortable по вашей ссылке)
Скрытый текст
Код:

Name "UltraISOPortable"
OutFile "UltraISOPortableTest.exe"
InstallDir $EXEDIR\Temp
RequestExecutionLevel user
SilentInstall silent

Page instfiles

Section ""

  SetOutPath $EXEDIR\App\UltraISO

  StrCmp $CMDLINE "" 0 param
    StrCpy $0 ""
    Goto runexe

  param:
    Call GetParameters
    Pop $0

  runexe:
    Exec '"$EXEDIR\App\UltraISO\UltraISO.exe" $0'

SectionEnd

Function GetParameters
 
  Push $R0
  Push $R1
  Push $R2
  Push $R3
 
  StrCpy $R2 1
  StrLen $R3 $CMDLINE
 
  StrCpy $R0 $CMDLINE $R2
  StrCmp $R0 '"' 0 +3
    StrCpy $R1 '"'
    Goto loop
  StrCpy $R1 " "
 
  loop:
    IntOp $R2 $R2 + 1
    StrCpy $R0 $CMDLINE 1 $R2
    StrCmp $R0 $R1 get
    StrCmp $R2 $R3 get
    Goto loop
 
  get:
    IntOp $R2 $R2 + 1
    StrCpy $R0 $CMDLINE 1 $R2
    StrCmp $R0 " " get
    StrCpy $R0 $CMDLINE "" $R2
 
  Pop $R3
  Pop $R2
  Pop $R1
  Exch $R0
 
FunctionEnd


Что делает этот лаунчер? При запуске проверяет наличие аргументов командной строки (в данном случае путь к файлу образа). Если они есть, что считывает их в переменную $0 и передает её в команду запуска программы. Если их нет, то переменной $0 присваивается пустое значение и запуск программы выполняется без параметров.

Чтобы проверить его работу, поместите файл лаунчера UltraISOPortableTest.exe рядом (в одной папке) с оригинальным файлом загрузчика UltraISOPortable.exe. Затем можно просто запустить его или перетянуть на него файл образа.

Все.

skinny21 29-01-2018 09:43 2794307

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

Alex S 29-01-2018 15:07 2794380

Мужики, добрый день. Помогите с кодом. Возникла проблема при создании информационной страницы. Идея такова: в зависимости от выбранного языка на странице (в Control EDIT) должен показаться текст из текстового файла соответствующего языка. То есть если выбран русский язык инсталлятора, то текст отображается из файла info_ru.txt, если английский язык, то текст отображается из файла info_en.txt. Возник ряд проблем, при чтении из текстового файла (FileOpen-FileRead) текст отображается с крякозябликами и считывается только первая строка.
Что есть сейчас
!define PRODUCT_NAME "MyProg"

Var InfoPage
Var InfoBeforePage_Control_EDIT

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

Page custom InfoBeforePage
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"


Name "${PRODUCT_NAME}"
OutFile "InfoBeforePage.exe"

Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
InitPluginsDir
;${If} ${LANG_RUSSIAN}
File "/oname=$PLUGINSDIR\info.txt" "info_ru.txt"
; ${Else}
; File "/oname=$PLUGINSDIR\info.txt" "info_en.txt"
;${EndIf}
FileOpen $4 "$PLUGINSDIR\info.txt" r
FileRead $4 $1 ; Read a line
FileClose $4
FunctionEnd

Function InfoBeforePage
nsDialogs::Create 1018
Pop $InfoPage
${If} $InfoPage == error
Abort
${EndIf}
!insertmacro MUI_HEADER_TEXT "Dialog title..." "Dialog subtitle..."
!define MYMULTILINEEDIT_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_MULTILINE}|${ES_READONLY}
nsDialogs::CreateControl EDIT ${MYMULTILINEEDIT_STYLE} ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} 0u 0u 300u 140u "$1"
Pop $InfoBeforePage_Control_EDIT
nsDialogs::Show
FunctionEnd

Section "MainSection" SEC01
SectionEnd

Flix 29-01-2018 18:06 2794423

Цитата:

Цитата Alex S
Возник ряд проблем, при чтении из текстового файла (FileOpen-FileRead) текст отображается с крякозябликами и считывается только первая строка. »

Почитайте в справке информацию по команде FileRead, а также ограничения её использования. Кратко укажу основные моменты, которые важно знать. Первое, текст должен быть в кодировке ANSI. Второе, длина строки не должна превышать 1024 символов. Третье, команда считывает только строку, а не весь документ.

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

Вариант решения

Код:

!define PRODUCT_NAME "MyProg"

Var InfoPage
Var InfoBeforePage_Control_EDIT

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

;--------------------------------
;General

  Name "${PRODUCT_NAME}"
  OutFile "InfoBeforePage.exe"

;--------------------------------
;Interface Settings

  !define MUI_ABORTWARNING

  ;Show all languages, despite user's codepage
  !define MUI_LANGDLL_ALLLANGUAGES

;--------------------------------
;Pages
  Page custom InfoBeforePage
  !insertmacro MUI_PAGE_INSTFILES

;--------------------------------
;Languages
  !insertmacro MUI_LANGUAGE "English"
  !insertmacro MUI_LANGUAGE "Russian"

;--------------------------------
;Installer Sections
Section "MainSection" SEC01
SectionEnd

;--------------------------------
;Installer Functions
Function .onInit

  !insertmacro MUI_LANGDLL_DISPLAY
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  ${If} $LANGUAGE = ${LANG_RUSSIAN}
    ; Документ должен быть в кодировке  ANSI !!!
    File /oname=$PLUGINSDIR\info.txt info_ru.txt
  ${Else}
    ; Документ должен быть в кодировке  ANSI !!!
    File /oname=$PLUGINSDIR\info.txt" info_en.txt
  ${EndIf}

FunctionEnd

Function InfoBeforePage

  nsDialogs::Create 1018
  Pop $InfoPage
  ${If} $InfoPage == error
    Abort
  ${EndIf}
  !insertmacro MUI_HEADER_TEXT "Dialog title..." "Dialog subtitle..."

  ; === RichText1 (type: RichText) ===
  !define MYMULTILINEEDIT_STYLE ${WS_VISIBLE}|${WS_CHILD}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}
  nsDialogs::CreateControl "RichEdit20A" ${MYMULTILINEEDIT_STYLE} ${WS_EX_STATICEDGE} 0u 0u 300u 140u ""
  Pop $InfoBeforePage_Control_EDIT

  ; === Чтение файла ===
  Call ReadTxtFile

  nsDialogs::Show

FunctionEnd

; Функция чтения и вывода содержимого файла в элемент "RichEdit20A"
Function ReadTxtFile

  ; Открываем файл для чтения
  FileOpen $4 "$PLUGINSDIR\info.txt" r
  loop:
    ; Считываем строку в переменную $1
    FileRead $4 $1
    ; Передаем строку в элемент "RichEdit20A"
    ; Флаг ${EM_REPLACESEL} указывает на вставку текста с новой строки
    SendMessage $InfoBeforePage_Control_EDIT ${EM_REPLACESEL} 0 "STR:$1"
    ; Если нет ошибок, переходим к следующей строке
    IfErrors +1 loop
    ; Если ошибка или конец файла, закрываем файл.
  FileClose $4

FunctionEnd


Если необходимо чтение документов в кодировке Unicode, то посмотрите в сторону команды FileReadUTF16LE.

Alex S 29-01-2018 18:38 2794427

Flix, респект тебе и уважуха. Выручил...

MKN 30-01-2018 11:43 2794524

Цитата:

Цитата Alex S
должен показаться текст из текстового файла »

Можно упростить код, если использовать не текстовый, а HTML файл (причём любой кодировки и можно с картинками).
Для этого есть несколько плагинов, к примеру, самый известный - WebCtrl.

Комплект примера во вложении.

Выглядеть будет так :


окно для просмотра можно делать ессно любым способом (наверное лучше через nsDialogs::CreateControl)...

Alex S 30-01-2018 11:51 2794527

MKN , спасибо! Действительно кода в половину меньше...

MKN 30-01-2018 13:01 2794549

К слову, об ограничении FileRead на 1024 символа...
Для ANSI это ограничение можно снять с помощью сообщения EM_LIMITTEXT

К примеру, для вот этого текста ( https://yadi.sk/d/1cLhpTrv3Rukjv )
без EM_LIMITTEXT отображаются только 512 строк, а с EM_LIMITTEXT - все 13229 строк. Еснно такой большой объём долго обрабатывается...

Пример :

Код:

OutFile EM_LIMITTEXT-test.exe
!include MUI2.nsh

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

Function MyPage
nsDialogs::Create 1044
Pop $0
nsDialogs::CreateControl ${__NSD_Text_CLASS} ${__NSD_Text_STYLE}|${ES_MULTILINE}|${WS_VSCROLL}|${ES_READONLY} ${__NSD_Text_EXSTYLE} 10u 10u 310u 170u ""
Pop $0
FileOpen $4 "$EXEDIR\test.txt" r 
loop:
    FileRead $4 $1
    SendMessage $0 ${EM_REPLACESEL} 0 "STR:$1"
        SendMessage $0 ${EM_LIMITTEXT} 0 "STR:$1"
    IfErrors +1 loop
FileClose $4
nsDialogs::Show
FunctionEnd

Section
SectionEnd


Alex S 30-01-2018 13:10 2794552

MKN, спасибо! Забираю в копилку, пригодится и не раз...

Flix 30-01-2018 16:00 2794586

Встречайте NSIS v3.03 (релиз от 29 января 2018): страница загрузки

Что нового...
F.1.1 Release Notes

Building NSIS with Python 2.6 or older is no longer supported

F.1.2 Changelog
F.1.2.1 Major Changes

Added more NSD controls and macros (RFE #543)
Added !gettlbversion
Library TLB and VxD version support on POSIX (patch #284)

F.1.2.2 Minor Changes

Added System plug-in v2 syntax option
Added System plug-in B and H types
Added IntPtrCmp, IntPtrCmpU, and IntPtrOp
Added Int64Cmp, Int64CmpU and Int64Fmt (64-bit only)
Added IntOp and System::Int64Op >>> operator
Added more !define /math operators
Added WinVer.nsh IsDomainController (patch #286)
Plug-ins now set the ASLR, DEP, LAA, NOSEH and TS PE flags (bug #1188)
MakeNSIS exits with code 0 for various information commands (bug #1193)
Removed unused NSD_LB_Clear macro parameter

F.1.2.3 Translations

Added Tatar (patch #281)
Fixed and updated Scottish Gaelic (patch #285, bug #1197)
Updated Italian (bug #1194)

F.1.2.4 Build System

Added support for Python 3
Dropped support for Python 2.6 and older

Alex S 31-01-2018 20:33 2794873

Добрый вечер всем. Есть вопрос по поводу переноса строки в Control_EDIT. Возникла идея создать страницу готовности к установке по аналогу inno (PreparingPage). За основу взял вариант который решался(и решился(спасибо Flix и MKN)) на этой страничке форума. Суть затеи такова: на сновании выбранных задач инсталляции должен выводиться список, в котором подробно указаны выбранные задачи(язык, ярлыки, путь установки...). Хм... Думал делов-то, при наличии уже имеющихся знаний и тем более готовых решений. Но не тут то было... Пробовал и так $\n и так \n и loop-ил сверху вниз и не вышло.
Что есть...
!define PRODUCT_NAME "My Program"
!define PRODUCT_VERSION "1.0"

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

Page custom PageInit1 PageDestroy1
!insertmacro MUI_PAGE_DIRECTORY
Page custom PreparingPage

;Languages
!define MUI_LANGDLL_ALLLANGUAGES
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_RESERVEFILE_LANGDLL
Function .OnInit
!insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd

LangString PRPAGE_TEXT ${LANG_RUSSIAN} "Всё готово к установке"
LangString PRPAGE_TEXT ${LANG_ENGLISH} "Ready to Install"
LangString PRPAGE_SUBTEXT ${LANG_RUSSIAN} "Программа установки готова начать установку ${PRODUCT_NAME} на ваш компьютер."
LangString PRPAGE_SUBTEXT ${LANG_ENGLISH} "Setup is now ready to begin installing ${PRODUCT_NAME} on your computer."
LangString CUSTPAGE_1_TITLE ${LANG_RUSSIAN} "Выбор языка интерфейса и дополнительных задач"
LangString CUSTPAGE_1_TITLE ${LANG_ENGLISH} "Selecting language and additional tasks"
LangString CUSTPAGE_1_SUBTITLE ${LANG_RUSSIAN} "Выберите язык интерфейса и дополнительные задачи установки."
LangString CUSTPAGE_1_SUBTITLE ${LANG_ENGLISH} "Select the interface language and additional installation tasks."
LangString CUSTPAGE_1GRBOX1_CAPT ${LANG_RUSSIAN} "Язык интерфейса:"
LangString CUSTPAGE_1GRBOX1_CAPT ${LANG_ENGLISH} "Interface language:"
LangString CUSTPAGE_1RADBUT1_CAPT ${LANG_RUSSIAN} "Русский язык"
LangString CUSTPAGE_1RADBUT1_CAPT ${LANG_ENGLISH} "Russian language"
LangString CUSTPAGE_1RADBUT2_CAPT ${LANG_RUSSIAN} "Английский язык"
LangString CUSTPAGE_1RADBUT2_CAPT ${LANG_ENGLISH} "English language"
LangString CUSTPAGE_1GRBOX2_CAPT ${LANG_RUSSIAN} "Дополнительные задачи:"
LangString CUSTPAGE_1GRBOX2_CAPT ${LANG_ENGLISH} "Additional tasks:"
LangString CUSTPAGE_1CHBOX1_CAPT ${LANG_RUSSIAN} "Ярлык на Рабочем столе"
LangString CUSTPAGE_1CHBOX1_CAPT ${LANG_ENGLISH} "Desktop Shortcut"
LangString CUSTPAGE_1CHBOX2_CAPT ${LANG_RUSSIAN} "Ярлык(и) в меню Пуск"
LangString CUSTPAGE_1CHBOX2_CAPT ${LANG_ENGLISH} "Shortcut(s) in the Start menu"
LangString VIBRANO ${LANG_RUSSIAN} "Выбрано:"
LangString VIBRANO ${LANG_ENGLISH} "Selected:"

# Variables
var CustPage1
Var GroupBox1
var Check1
var Check2
Var CheckBox1
Var CheckBox2

Var GroupBox2
var Radio1
var Radio2
Var RadioButton1
Var RadioButton2

var Preparing
Var Preparing_Control_EDIT

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Main_setup.exe"
InstallDir "$PROGRAMFILES\My Program"

Function PageInit1
nsDialogs::Create 1018
Pop $CustPage1
${If} $CustPage1 == error
Abort
${EndIf}
${If} $LANGUAGE = ${LANG_RUSSIAN}
!insertmacro MUI_HEADER_TEXT $(CUSTPAGE_1_TITLE) $(CUSTPAGE_1_SUBTITLE)
${Else}
!insertmacro MUI_HEADER_TEXT $(CUSTPAGE_1_TITLE) $(CUSTPAGE_1_SUBTITLE)
${EndIf}
; === GroupBox1 (type: GroupBox) ===
${NSD_CreateGroupBox} 1.9u 2.38u 131.65u 43u "$(CUSTPAGE_1GRBOX1_CAPT)"
Pop $GroupBox1
; === RadioButton1 (type: RadioButton) ===
${NSD_CreateRadioButton} 7.9u 13.54u 121.11u 12.31u "$(CUSTPAGE_1RADBUT1_CAPT)"
Pop $RadioButton1
${NSD_SetState} $RadioButton1 1
; === RadioButton2 (type: RadioButton) ===
${NSD_CreateRadioButton} 7.9u 27.54u 121.11u 12.31u "$(CUSTPAGE_1RADBUT2_CAPT)"
Pop $RadioButton2
; === GroupBox2 (type: GroupBox) ===
${NSD_CreateGroupBox} 1.32u 53.38u 131.65u 80.54u "$(CUSTPAGE_1GRBOX2_CAPT)"
Pop $GroupBox2
; === CheckBox1 (type: Checkbox) ===
${NSD_CreateCheckbox} 7.9u 66.08u 121.11u 12.31u "$(CUSTPAGE_1CHBOX1_CAPT)"
Pop $CheckBox1
${NSD_SetState} $CheckBox1 1
; === CheckBox2 (type: Checkbox) ===
${NSD_CreateCheckbox} 7.9u 82.46u 121.11u 12.31u "$(CUSTPAGE_1CHBOX2_CAPT)"
Pop $CheckBox2
${NSD_SetState} $CheckBox2 1
nsDialogs::Show
FunctionEnd

Function PageDestroy1
${NSD_GetState} $RadioButton1 $Radio1
${NSD_GetState} $RadioButton2 $Radio2
${NSD_GetState} $CheckBox1 $Check1
${NSD_GetState} $CheckBox2 $Check2
FunctionEnd



Function PreparingPage
nsDialogs::Create 1018
Pop $Preparing
${If} $Preparing == error
Abort
${EndIf}
; !insertmacro MUI_HEADER_TEXT "" ""
${If} $LANGUAGE = ${LANG_RUSSIAN}
!insertmacro MUI_HEADER_TEXT $(PRPAGE_TEXT) $(PRPAGE_SUBTEXT)
${Else}
!insertmacro MUI_HEADER_TEXT $(PRPAGE_TEXT) $(PRPAGE_SUBTEXT)
${EndIf}
!define MYMULTILINEEDIT_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_MULTILINE}|${ES_READONLY}
nsDialogs::CreateControl EDIT ${MYMULTILINEEDIT_STYLE} ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} 0u 0u 300u 140u ""
Pop $Preparing_Control_EDIT
Call ShowSelectedItems
nsDialogs::Show
FunctionEnd

Function ShowSelectedItems
SendMessage $Preparing_Control_EDIT ${EM_REPLACESEL} 0 "STR:$(VIBRANO)" ;"STR:$(VIBRANO)$\n" - такой вариант не работает
${If} $Radio1 == 1
; loop:
SendMessage $Preparing_Control_EDIT ${EM_REPLACESEL} 0 "STR:$(CUSTPAGE_1RADBUT1_CAPT)"
;IfErrors +1 loop
${If} $CheckBox1 == 1
SendMessage $Preparing_Control_EDIT ${EM_REPLACESEL} 0 "STR:$(CUSTPAGE_1CHBOX1_CAPT)"
${EndIf}
${EndIf}
FunctionEnd


Section ""
SectionEnd


Что примерно хотел сделать

Flix 01-02-2018 00:56 2794934

Alex S, предлагаю вам такой вариант решения. В вашем примере сценария замените функцию "ShowSelectedItems" следующим кодом:

Новая функция ShowSelectedItems
Код:

Function ShowSelectedItems

  StrCpy $7 $(VIBRANO)

  ${If} $Radio1 == ${BST_CHECKED}
    StrCpy $7 '$7$\r$\n$\r$\n$\t$(CUSTPAGE_1GRBOX1_CAPT) $(CUSTPAGE_1RADBUT1_CAPT)'
  ${EndIf}

  ${If} $Radio2 == ${BST_CHECKED}
    StrCpy $7 '$7$\r$\n$\r$\n$\t$(CUSTPAGE_1GRBOX1_CAPT) $(CUSTPAGE_1RADBUT2_CAPT)'
  ${EndIf}

  ${If} $Check1 == ${BST_CHECKED}
  ${OrIf} $Check2 == ${BST_CHECKED}
    StrCpy $7 '$7$\r$\n$\r$\n$\t$(CUSTPAGE_1GRBOX2_CAPT)'
  ${EndIf}

  ${If} $Check1 == ${BST_CHECKED}
    StrCpy $7 '$7$\r$\n$\r$\n$\t$\t$(CUSTPAGE_1CHBOX1_CAPT)'
  ${EndIf}

  ${If} $Check2 == ${BST_CHECKED}
    StrCpy $7 '$7$\r$\n$\r$\n$\t$\t$(CUSTPAGE_1CHBOX2_CAPT)'
  ${EndIf}

  StrCpy $7 '$7$\r$\n$\r$\n$\r$\n$\t$(^DirSubText) "$(^NameDA)":'
  StrCpy $7 '$7$\r$\n$\r$\n$\t$INSTDIR'
  SendMessage $Preparing_Control_EDIT ${WM_SETTEXT} 0 "STR:$7"

FunctionEnd


Смысл вот в чем. Под текст, который необходимо вывести на странице, мы выделяем переменную (в примере $7). В ней мы формируем массив строк, в зависимости от выбранных пользователем параметров установки. После чего, последней командой, мы передаем эту строку необходимому элементу управления. Переносы и отступы формируются предусмотренными в NSIS константами: перевод строки — $\r$\n; табуляция — $\t. Под строку желательно выделить отдельную переменную, а не предустановленную.

Результат

Alex S 01-02-2018 02:36 2794941

Flix, спасибо большое за помощь. Очень интересный вариант... Я если честно мыслил в другую сторону. Сел, почитал справочку NSIS и осенило... Начал пробовать вариант с созданием временного файла, в который по ходу записываются данные настроек установки и в последний момент с него производится считывание и вывод информации... Собственно, как вариант, идея сработала. Твой вариант интереснее, я че-то немного недопетрил идти в этом направлении. Ещё раз спасибо за помощь.

Вот что вышло у меня...
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
Var /Global PrepFile
;FileOpen $PrepFile "$PLUGINSDIR\MyPreparingFile.txt" w
;FileClose $PrepFile # Закрываем файл
FunctionEnd

Function ShowSelectedItems
FileOpen $PrepFile "$PLUGINSDIR\MyPreparingFile.txt" w ;
SendMessage $Preparing_Control_EDIT ${EM_REPLACESEL} 0 "STR:$(VIBRANO)"
${If} $Radio1 == 1
FileWrite $PrepFile "$\r$\n$\r$\n $(CUSTPAGE_1RADBUT1_CAPT)$\r$\n" # Записываем нужную информацию
${Else}
FileWrite $PrepFile "$\r$\n$\r$\n $(CUSTPAGE_1RADBUT2_CAPT)$\r$\n" # Записываем нужную информацию
${EndIf}
${If} $Check1 == 1
FileWrite $PrepFile "$(CUSTPAGE_1CHBOX1_CAPT)$\r$\n"
${EndIf}
${If} $Check2 == 1
FileWrite $PrepFile "$(CUSTPAGE_1CHBOX2_CAPT)$\r$\n"
${EndIf}
FileClose $PrepFile # Закрываем файл

FileOpen $PrepFile "$PLUGINSDIR\MyPreparingFile.txt" r
loop:
FileRead $PrepFile $2
SendMessage $Preparing_Control_EDIT ${EM_REPLACESEL} 0 "STR:$2"
IfErrors +1 loop
FileClose $PrepFile # Закрываем файл
FunctionEnd

AlekseyPopovv 04-02-2018 11:13 2795676

Как проверить контрольную сумму "CRC" файла? Если не совпадает, то сообщение "куку" и выход, если совпадает, то идём дальше...

Flix 04-02-2018 11:57 2795701

Цитата:

Цитата AlekseyPopovv
Как проверить контрольную сумму "CRC" файла? »

Воспользуйтесь плагином CRCCheck.
Пример
Код:


Function CheckCRC
  # Проверяем наличие требуемого файла
  IfFileExists $INSTDIR\file.exe 0 noFile
    # Если файл существует, то проверяем его CRC
    # Для проверки используется плагин CRCCheck (http://nsis.sourceforge.net/CRCCheck_plug-in)
    CRCCheck::GenCRC $INSTDIR\file.exe
    # Записываем значение CRC-файла из стека в переменную $1
    Pop $1
    # Выводим сообщение в отчете установки со значением CRC-файла
    DetailPrint "~ Файл file.exe CRC = $1"
    # Необходимая контрольная сумма файла (НЕХ) CRC = 6528E1D3
    # Сравниваем значения полученной CRC с заданным (в десятичном формате)
    ${IfNot} $1 == 1697178067
    # Если значения не совпадают...
   
    # Метка перехода в случае отсутствия указанного файла
    noFile:
      # Выводим сообщение в отчете установки о неверном значении CRC
      DetailPrint "~ Файл file.exe не найден или его CRC отличается от исходной"
      # Показываем пользователю диалог с сообщением
      MessageBox MB_ICONINFORMATION|MB_OK "Продолжить работу инсталлятора невозможно.$\r$\n\
                                          Файл file.exe не существует или его CRC не$\r$\n\
                                          не совпадает с оригинальным значением."
      # Завершаем работу программы установки
      Quit
    ${EndIf}
  # Выводим сообщение в отчете установки об успешном выполнении операции
  DetailPrint "~ CRC файла file.exe - OK"
FunctionEnd


AlekseyPopovv 04-02-2018 13:07 2795716

Flix, разобрался.

Alex S 05-02-2018 16:41 2795969

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

Скрин для ясности вопроса
Если можно, на базе этого скрипта...

!define PRODUCT_NAME "MyProg"
!define PRODUCT_VERSION "1.0"

!include "MUI2.nsh"
!include "nsDialogs.nsh"

Var BrowsePage
Var BrowsePage_DirRequest1_Txt
Var BrowsePage_DirRequest1_Btn
Var BrowsePage_DirRequest2_Txt
Var BrowsePage_DirRequest2_Btn

Page custom BrowsePage1

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "English"

LangString BrowseButtonCaption ${LANG_RUSSIAN} "Обзор..."
LangString BrowseButtonCaption ${LANG_ENGLISH} "Browse..."
LangString CUSTPAGE_TITLE ${LANG_RUSSIAN} "Текст на русском"
LangString CUSTPAGE_TITLE ${LANG_ENGLISH} "Tekst na angliyskom"
LangString CUSTPAGE_SUBTITLE ${LANG_RUSSIAN} "СубТекст на русском"
LangString CUSTPAGE_SUBTITLE ${LANG_ENGLISH} "SubTekst na angliyskom"
LangString BrowseDialogLabel ${LANG_RUSSIAN} "Текст на русском"
LangString BrowseDialogLabel ${LANG_ENGLISH} "Tekst na angliyskom"

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup.exe"

Function .OnInit
!insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd

Function BrowsePage1
nsDialogs::Create 1018
Pop $BrowsePage
${If} $BrowsePage == error
Abort
${EndIf}
${If} $LANGUAGE = ${LANG_RUSSIAN}
!insertmacro MUI_HEADER_TEXT $(CUSTPAGE_TITLE) $(CUSTPAGE_SUBTITLE)
${Else}
!insertmacro MUI_HEADER_TEXT $(CUSTPAGE_TITLE) $(CUSTPAGE_SUBTITLE)
${EndIf}
; === DirRequest1_Txt (type: Text) ===
${NSD_CreateText} 7.9u 17.23u 226.43u 12.31u "$SMPROGRAMS\${PRODUCT_NAME}"
Pop $BrowsePage_DirRequest1_Txt

; === DirRequest1_Btn (type: Button) ===
${NSD_CreateButton} 235.65u 17.23u 52.66u 12.31u "$(BrowseButtonCaption)"
Pop $BrowsePage_DirRequest1_Btn
${NSD_OnClick} $BrowsePage_DirRequest1_Btn BrowsePage_DirRequest1_Click

; === DirRequest2_Txt (type: Text) ===
${NSD_CreateText} 7.9u 46.77u 226.43u 12.31u "$SMPROGRAMS\${PRODUCT_NAME}"
Pop $BrowsePage_DirRequest2_Txt

; === DirRequest2_Btn (type: Button) ===
${NSD_CreateButton} 235.65u 46.77u 52.66u 12.31u "$(BrowseButtonCaption)"
Pop $BrowsePage_DirRequest2_Btn
${NSD_OnClick} $BrowsePage_DirRequest2_Btn BrowsePage_DirRequest2_Click

nsDialogs::Show
FunctionEnd


Function BrowsePage_DirRequest1_Click
Pop $R0
${If} $R0 == $BrowsePage_DirRequest1_Btn
${NSD_GetText} $BrowsePage_DirRequest1_Txt $R0
nsDialogs::SelectFolderDialog /NOUNLOAD "" "$R0"
Pop $R0
${If} "$R0" != "error"
${NSD_SetText} $BrowsePage_DirRequest1_Txt "$R0"
${EndIf}
${EndIf}
FunctionEnd

Function BrowsePage_DirRequest2_Click
System::Call 'SHELL32::SHGetSpecialFolderLocation(i0,i0x2,*i.r2)i.r0'
System::Call '*(i$hwndparent,i$2,i,t "$(BrowseDialogLabel)",i0x470,kr3,i0,i0)i.r1'
System::Call 'SHELL32::SHBrowseForFolder(ir1)i.r0'
System::Call 'OLE32::CoTaskMemFree(ir2)'
System::Free $1
${If} $0 <> 0
System::Call 'SHELL32::SHGetPathFromIDList(i$0,t "" R9)'
${NSD_SetText} $BrowsePage_DirRequest2_Txt= $R9
${EndIf}
System::Call 'OLE32::CoTaskMemFree(ir0)'
FunctionEnd

Section ""
SectionEnd

Flix 05-02-2018 23:11 2796082

Цитата:

Цитата Alex S
Возможно ли в зависимости от языка инсталлятора(русский-английский) сменить текст кнопок "отмена" и "создать папку" на текст соответствующего языка? »

Это диалоговое окно и в первом и втором случае вызывается из системной библиотеки, язык которой зависит от языка установленной ОС. То есть, независимо от выбранного языка установки, на русской системе это диалоговое окно будет на русском. Соответственно на английской системе этот диалог будет на английском и т.д. Единственное что можно задать, так это надпись в шапке диалога (на вашем скрине показано стрелкой). :)

Alex S 05-02-2018 23:31 2796092

Понял. Спасибо за ответ.

AlekseyPopovv 07-02-2018 13:52 2796484

Вложений: 2
Как защитить инсталлятор от вскрытия? Можно подробнее...
Что было так...

MaGoth 28-03-2018 22:21 2806045

Привет народ,
мои очередные вопросы:
1. как сейчас обстоят дела с определением винды 10й ? Ранее было членово с этим..

2. как заблочить кнопу далее в окне компонентов если ни один из них еще не выбран ?
есть несколько вариантов:
а) галочка на одном из чекбоксов автоматически установлена в зависимости от выбранного языка инсталлятора и/или ОС;
б) если ни один чекбок не выбран то при нажатии "Далее" выводится сообщение "бла-бла-бла" и установка далее невозможна пока не будет отмечен один из чек боксов;
в) заблокировать кнопку "Далее" пока не будет отмечен один из чекбоксов.
проблема в том что чек-боксы у меня исключающие друг-друга, + работаю в старом Нсис под Юни 2.46.5..

У кого нить есть идеи как сие получше реализовать ?! если можно с примерами.. :)

MKN 29-03-2018 11:47 2806103

Цитата:

Цитата MaGoth
как заблочить кнопу далее в окне компонентов если ни один из них еще не выбран ? »

Уже было реализовано kotkovets (для стандартых страниц) :
Код:

OutFile "NoActivButtonInst.exe"

var hInst

!include "MUI2.nsh"

!insertmacro MUI_PAGE_WELCOME
  ;функция во время открытия странички компонентов
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_SHOW
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

;макрос проверки секций, если одна из секций отмечена возврат - 1, иначе - 0;
;в intsec - указываем количество секций в скрипте
!macro CheckSection intsec ret
  Push ${intsec}
  System::Store SR2
  ${For} $R0 1 $R2
      SectionGetFlags $R0 $R1
      ${IfThen} $R1 == 1 ${|}${Break}${|}
  ${Next}
  Push $R1
  System::Store L
  Pop ${ret}
!macroend

SubSection /e test IDS_1
Section  /o "Компонент №1" ID_1
SectionEnd
Section /o "Компонент №2" ID_2
SectionEnd
Section /o "Компонент №3" ID_3
SectionEnd
Section /o "Компонент №4" ID_4
SectionEnd
Section /o "Компонент №5" ID_5
SectionEnd
Section /o "Компонент №6" ID_6
SectionEnd
SubSectionEnd

Function .onSelChange
!insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${ID_1}
    !insertmacro RadioButton ${ID_2}
    !insertmacro RadioButton ${ID_3}
    !insertmacro RadioButton ${ID_4}
    !insertmacro RadioButton ${ID_5}
    !insertmacro RadioButton ${ID_6}
!insertmacro EndRadioButtons
!insertmacro CheckSection 6 $R0
  StrCmp $R0 0 0 +2
  EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
  StrCmp $R0 1 0 +2
  EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd

Function .OnInit
  StrCpy $1 ${ID_1}
  ;SectionSetFlags ${IDS_1} ${SECTION_OFF} ;фиктивно отключаем группу
  ;чтоб компоненты в группе по умолчанию были свёрнуты
  ;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

Ессно код можно корректировать для своих задач.

Цитата:

Цитата MaGoth
как сейчас обстоят дела с определением винды 10й ? »

Как и ранее - без проблем. Вариантов море. К примеру, железно работает детект. W10, с помощью StdUtils.

MaGoth 29-03-2018 12:56 2806111

Цитата:

Цитата MKN
Уже было реализовано kotkovets (для стандартых страниц) : »

Спасибо, буду посмотреть если для меня сгодиться.. :)

Цитата:

Цитата MKN
Как и ранее - без проблем. Вариантов море. К примеру, железно работает детект. W10, с помощью StdUtils. »

Не все так просто, и проблемы были с определением номера версии ОС..
StdUtils - это что и где можно глянуть ?!

Зы, напоминаю, у мня старая ОС, старый софт, и Нсиська на юникодах.. :yes:

MKN 29-03-2018 15:51 2806127

Цитата:

Цитата MaGoth
StdUtils - это что и где можно глянуть ?! »

NSIS Plugin
https://github.com/lordmulder/stdutils/releases
Код:

!include "StdUtils.nsh"

${StdUtils.GetRealOSVersion} $1 $2 $3
DetailPrint "Real Windows NT Version: $1,$2 (Service Pack: $3)"

${StdUtils.GetRealOSBuildNo} $1
DetailPrint "Real Windows NT BuildNo: $1"

${StdUtils.GetRealOSName} $1
DetailPrint "RealOSName: $1"
       
${StdUtils.VerifyOSVersion} $1 6 1 0  ; 10 0 0
DetailPrint "Check for Windows 10: $1"


MaGoth 29-03-2018 18:55 2806155

MKN,
Еще вопрос есть, по части языков..
При запуске инсталлера (если мультиланг) выводится окно с выбором языка.. Вопрос, как сохранить отмеченный выбор языка в переменную и/или как вариант определить язык ОС по умолчанию, с занесением его в аналогичную переменную?
В справке рылся но что-то не нашел где и откуда копать.. :unsure:


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

cross82 05-05-2018 00:25 2812170

не могу найти nsisUnrar плагин от Bioware, надо встроить в инсталятор распаковщик winrar-архивов, желательно rar5-архивов, есть пример как это можно сделать?

MaGoth 16-05-2018 19:56 2814059

Привет народ,

Очередной вопрос насущный, можно ли на Нсиське сделать подобное::
- инсталлер должен позволять устанавливать софт в разные места на ПК и на разные версии игры, а не так что установил одну копию и дальше только удалять ?!

Спасибо.. :)

Flix 18-05-2018 00:46 2814259

Цитата:

Цитата MaGoth
инсталлер должен позволять устанавливать софт в разные места на ПК»

Смотрите команду SetOutPath.
Цитата:

Цитата MaGoth
и на разные версии игры »

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

Прочитайте "Справочник по NSIS", там есть примеры.

MaGoth 18-05-2018 06:19 2814266

Цитата:

Цитата Flix
Смотрите команду SetOutPath. »

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

MKN 18-05-2018 10:24 2814297

Цитата:

Цитата MaGoth
Есть, например, 4 каталога с установленными играми одной серии, на разных дисках в разных каталогах, и вот на них всех должно быть установлен соответствующий софт из одного инсталлера. »

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

Извлекаешь эти данные и делаешь логические выводы, а затем действия...

К примеру :

Код:

ReadRegStr $InstPatshGame HKLM "SOFTWARE\GameDeveloper\MyGame\AppsPatch" "GameName"
;MessageBox MB_OK "$InstPatshGame"
${If} ${Errors}
${OrIf} $InstPatshGame == ""
MessageBox MB_OK "Registry Errors. Do not find the Path to the GameName !"IDOK
Quit
${EndIf}

Аналогично смотришь версии, если надо сравниваешь с устанавливаемой...

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

Код:

${If} ${FileExists} "$InstPatshGame1\GameName1\GameName1Files.exe"
какое то действие
${Else}
MessageBox MB_OK "GameName1Files.exe file not found !"
${EndIf}

${If} ${FileExists} "$InstPatshGame2, 3, 4 и т.д.

Если местонахождение не известно, то циклом на всех дисках...

(Как это "технически" реализовать в скрипте, значения не имеет...)

MaGoth 20-05-2018 12:10 2814563

Цитата:

Цитата MKN
Нормальная программа(игра в том числе) как правило, при установке прописывает некоторые данные о себе в реестр (путь установки, версию и т.д.)
Извлекаешь эти данные и делаешь логические выводы, а затем действия... »

Что-то сложна.. Ибо не догоняю пока как можно установить игру одновременно в 4 разных каталога, а потом и удалять корректно из них при деинсталле. Будем разбираться..

Flix 20-05-2018 18:55 2814602

Цитата:

Цитата MaGoth
как можно установить игру одновременно в 4 разных каталога »

Берем документ "Справочник по NSIS", раздел "Статьи от hb860", глава "Первые шаги" и читаем: "Команда SetOutPath указывает компилятору, куда производить распаковку файлов".

Исходя из постановки задачи, выходит следующая схема:

Код:

SetOutPath <каталог 1, версия 1>

File <файл игры 1>
File <файл игры 2>
...
File <файл игры n>

SetOutPath <каталог 2, версия 2>

File <файл игры 1>
File <файл игры 2>
...
File <файл игры n>

SetOutPath <каталог 3, версия 3>

File <файл игры 1>
File <файл игры 2>
...
File <файл игры n>

SetOutPath <каталог 4, версия 4>

File <файл игры 1>
File <файл игры 2>
...
File <файл игры n>

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

Цитата:

Цитата MaGoth
удалять корректно из них при деинсталле »

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

skinny21 02-07-2018 13:41 2820287

Не получается запустить драйвер SbieDrv.sys через http://nsis.sourceforge.net/NsSCM_plug-in
Данные реестра
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SbieDrv]
"Type"=dword:00000001
"Start"=dword:00000003
"ErrorControl"=dword:00000001
"ImagePath"=hex(2):5c,00,3f,00,3f,00,5c,00,43,00,3a,00,5c,00,50,00,72,00,6f,00,\
67,00,72,00,61,00,6d,00,20,00,46,00,69,00,6c,00,65,00,73,00,5c,00,53,00,61,\
00,6e,00,64,00,62,00,6f,00,78,00,69,00,65,00,5c,00,53,00,62,00,69,00,65,00,\
44,00,72,00,76,00,2e,00,73,00,79,00,73,00,00,00
"DisplayName"="SbieDrv"
"DependsOnService"=hex(7):46,00,6c,00,74,00,4d,00,67,00,72,00,00,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SbieDrv\Instances]
"DefaultInstance"="SbieDrv Instance"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SbieDrv\Instances\SbieDrv Instance]
"Altitude"="86900"
"Flags"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SbieDrv\Enum]
"0"="Root\\LEGACY_SBIEDRV\\0000"
"Count"=dword:00000001
"NextInstance"=dword:00000001

MKN 03-07-2018 12:48 2820411

Цитата:

Цитата skinny21
Не получается запустить драйвер SbieDrv.sys »

Это Sandboxie driver ? Если да, то он устанавливается с помощью собственной утилиты KmdUtil.exe.
Что то вроде : KmdUtil.exe install SbieDrv "Patch\SbieDrv.sys"
Также с помощью этой утилиты можно установить службу-сервис SbieSvc.exe
Утилиту можно "вытащить" из SandboxieInstall (там же кстати будет и NSIS скрипт)...
А NsSCM_plug-in древний и бестолковый... Годится для отдельных частных случаев...

skinny21 03-07-2018 22:55 2820508

MKN
Драйвер установился, но все равно не работает
Exec '"$EXEDIR\App\Sandboxie\KmdUtil.exe" install SbieDrv "$EXEDIR\App\Sandboxie/SbieDrv.sys"'

Flix 04-07-2018 00:21 2820518

skinny21, в оригинальном инсталляторе команда установки драйвера выглядит так:
Код:

ExecWait "'$PLUGINSDIR\KmdUtil.exe' /lang=$LANGUAGE install SbieDrv '$INSTDIR\SbieDrv.sys' type=kernel start=demand 'msgfile=$INSTDIR\SbieMsg.dll' altitude=86900"

А установка службы вот так:
Код:

ExecWait "'$PLUGINSDIR\KmdUtil.exe' /lang=$LANGUAGE install SbieSvc $\"\$\"$INSTDIR\SbieSvc.exe$\"\$\" type=own start=auto 'display=Sandboxie Service' group=UIGroup 'msgfile=$INSTDIR\SbieMsg.dll'"
Допустим, язык можно исключить (параметры /lang и msgfile), но остаются еще другие параметры, которые у вас не указаны. Я не знаю степень их важности, но вы явно что-то упустили из виду.

MKN 04-07-2018 10:10 2820536

skinny21,
С слэшем я ошибся - надо Patch\SbieDrv.sys

skinny21 04-07-2018 13:50 2820566

MKN, Исправил, но ошибка та же, драйвер установлен, но не запущен, SbieSvc запустил при помощи SimpleSC
Flix, сделал так как научили, ничего не вышло

Serg866 28-07-2018 14:30 2823797

Заметил такую странность (точнее, заметили пользователи моей программы) - некоторые функции готового инсталлятора не выполняются, если его заархивировать в WinRar и запустить инсталлятор из архива. В частности через код Function .OnInit может не отработать команда ${If} ${FileExists}. На XP у себя такой проблемы не наблюдаю, а вот на более старших системах баг проявляется, но не всегда. Может кто знает из-за чего такое в принципе может происходить.

Почему спрашиваю: через ${If} ${FileExists} у меня встроена проверка оригинальности файлов при запуске инсталлятора. И эта проверка легко обходится простым архивированием инсталлятора.

Begin2Fly 28-07-2018 20:39 2823826

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

Serg866 29-07-2018 11:38 2823869

Условный код функции
Код:

Function .OnInit
MessageBox MB_OK|MB_ICONINFORMATION "Здесь предупреждающий текст" IDOK
Dialer::GetConnectedState
Pop $2
StrCmp $2 "offline" +2
ExecShell "open" "http://forum.oszone.net"
sleep 100
${If} ${FileExists} "$APPDATA\proverka.txt"
${OrIf} ${FileExists} "$EXEDIR\proverka2.txt"
${OrIf} ${FileExists} "$DOCUMENTS\proverka3.txt"
Quit
${EndIf}
FunctionEnd

При запуске инсталлятора из архива, команда ${If} ${FileExists} не выполняет свою задачу, то есть проверка файла не происходит. На XP всё работает нормально.
Замечен баг только на старших системах (Windows 7, 8, 10), но закономерность не обнаружена - на каких-то сборках работает, на каких-то нет.

Использую NSIS 3 (Юникод).

MaGoth 29-07-2018 12:50 2823876

Привет народ.. :)

Заметил очередную странность в работе программы, суть ее вот в чем::
написал инсталлер с установкой проги на 8 языках в зависимости от выбора чекбоксов..
далее, прикрутил автоопределение языка и в зависимости от языка ОС автоматически проставляется галочка на установку аналогичного языка. При инсталляции все работает вроде исправно, но если запускать деинсталл, то чек бокс проставляется на одну строку в низ, а не туда куда нужно..

Пример кода для инсталла и деинсталла для выбора языка установки в чек-боксах::

Код:

Function .onInit
  Push $R0
  SetCurInstType 0
  !insertmacro MUI_LANGDLL_DISPLAY
  !insertmacro MUI_INSTALLOPTIONS_EXTRACT "setup.ini"
  StrCpy $1 ${SecMod}
  SetSilent normal

;--------------------------------
# При запуске инсталлятора назначаем секции статус "Отмечена"
  ${If} $LANGUAGE == ${LANG_ENGLISH}
        ;IntOp $0        ${SF_SELECTED} // $0
        SectionSetFlags ${SecModFiles1} 1
  ${ElseIf} $LANGUAGE == ${LANG_ROMANIAN}
        SectionSetFlags ${SecModFiles2} 1
  ${ElseIf} $LANGUAGE == ${LANG_GERMAN}
        SectionSetFlags ${SecModFiles3} 1
  ${ElseIf} $LANGUAGE == ${LANG_RUSSIAN}
        SectionSetFlags ${SecModFiles4} 1
  ${ElseIf} $LANGUAGE == ${LANG_ITALIAN}
        SectionSetFlags ${SecModFiles5} 1
  ${ElseIf} $LANGUAGE == ${LANG_CZECH}
    SectionSetFlags ${SecModFiles6} 1
  ${ElseIf} $LANGUAGE == ${LANG_POLISH}
        SectionSetFlags ${SecModFiles7} 1
  ${ElseIf} $LANGUAGE == ${LANG_SPANISH}
        SectionSetFlags ${SecModFiles8} 1
  ${EndIf}


....
Function un.onInit
  !insertmacro MUI_UNGETLANGUAGE
  Push $R0
    StrCpy $1 ${unSecMod}

;--------------------------------
  ${If} $LANGUAGE == ${LANG_ENGLISH}
        ;IntOp $0        ${SF_SELECTED} // $0
        SectionSetFlags ${SecModFiles1} 1
  ${ElseIf} $LANGUAGE == ${LANG_ROMANIAN}
        SectionSetFlags ${SecModFiles2} 1
  ${ElseIf} $LANGUAGE == ${LANG_GERMAN}
        SectionSetFlags ${SecModFiles3} 1
  ${ElseIf} $LANGUAGE == ${LANG_RUSSIAN}
        SectionSetFlags ${SecModFiles4} 1
  ${ElseIf} $LANGUAGE == ${LANG_ITALIAN}
        SectionSetFlags ${SecModFiles5} 1
  ${ElseIf} $LANGUAGE == ${LANG_CZECH}
    SectionSetFlags ${SecModFiles6} 1
  ${ElseIf} $LANGUAGE == ${LANG_POLISH}
        SectionSetFlags ${SecModFiles7} 1
  ${ElseIf} $LANGUAGE == ${LANG_SPANISH}
        SectionSetFlags ${SecModFiles8} 1
  ${EndIf}

Как с этим бороться хз, может есть у кого какие мысли ?! :clever-ma
Использую нсис-юникод 2.46.5

Serg866 04-08-2018 17:55 2824895

Задумал проверять разрешение экрана пользователя.

Пример из справки "Определяем и меняем разрешение экрана" не заработал на NSIS3 (Unicode).
Компилируется без ошибок, но при запуске ничего не происходит.

Используется какой-то древний плагин ChangeRes 2003 года.

Есть ли рабочие примеры проверки разрешения дисплея для NSIS 3 под юникод?

Flix 05-08-2018 02:50 2824951

Цитата:

Цитата Serg866
Задумал проверять разрешение экрана пользователя. »

Serg866, очень хорошо подумайте, прежде чем использовать подобный функционал. Ваши пользователи не будут в восторге, когда ваша программа установки сбросит параметры экрана. Функционал в плагине сделан без проверок: количество подключенных устройств, их текущие параметры, сохранение и восстановление этих параметров, поддерживаемые значения режимов, анализ возможных ошибок. По нормальному это нужно все делать, а здесь просто изменяется разрешение экрана и все. И да, сам плагин сделан тогда, когда версии Unicode и в помине не было. Как вариант, используйте сборку ANSI инсталлятора (с директивой Unicode false). Если по каким-то причинам такой вариант неприемлем, то используйте плагин CallAnsiPlugin, который позволяет использовать вызов функций ANSI плагинов в инсталляторах Unicode (с директивой Unicode true).
Цитата:

Есть ли рабочие примеры проверки разрешения дисплея для NSIS 3 под юникод?
Пример
Код:

Unicode true
Name "Get User Screen Resolution"
Caption "Get User Screen Resolution"
XPStyle "on"

Function .onInit
  ; Выполняем инициализацию папки для распаковки плагинов
  InitPluginsDir
  ; Устанавливаем каталог распаковки файлов
  SetOutPath $PLUGINSDIR
  ; Записываем файлы плагинов
  File "${NSISDIR}\Plugins\x86-unicode\CallAnsiPlugin.dll"
  File "${NSISDIR}\Plugins\x86-ansi\ChangeRes.dll"
  ; Получаем текущие размеры экрана
  System::Call 'user32::GetSystemMetrics(i 0) i .r0' ; Ширина в пикселях
  System::Call 'user32::GetSystemMetrics(i 1) i .r1' ; Высота в пикселях
  ; Выводим сообщение с текущим разрешением экрана
  MessageBox MB_OK|MB_ICONINFORMATION "Screen Resolution: $\r$\n$0 X $1"
  ; Изменяем разрешение экрана на 1024х768 пикселей, глубиной цвета 32-бит и частотой обновления 60 Гц
  CallAnsiPlugin::Call "$PLUGINSDIR\ChangeRes.dll" ChangeResolution 4 1024 768 32 60
  ; Получаем новые размеры экрана
  System::Call 'user32::GetSystemMetrics(i 0) i .r2' ; Ширина в пикселях
  System::Call 'user32::GetSystemMetrics(i 1) i .r3' ; Высота в пикселях
  ; Выводим сообщение с новым разрешением экрана
  MessageBox MB_OK|MB_ICONINFORMATION "New Screen Resolution: $\r$\n$2 X $3"
  ; Восстанавливаем передыдущее разрешение экрана (условно считаем, что у
  ; пользователя были установлены глубина цвета 32-бит и частота 60 Гц)
  CallAnsiPlugin::Call "$PLUGINSDIR\ChangeRes.dll" ChangeResolution 4 $0 $1 32 60
  ; Выход
  Quit
FunctionEnd

Section "-null"
SectionEnd


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

Serg866 05-08-2018 15:45 2824987

Flix, спасибо за подробный разбор!

Я не планировал смену разрешения у пользователей.

Нужно только определять текущее разрешение экрана с целью узнать поддерживает ли монитор Full HD.
Таким образом, если разрешение равно 1920х1080, то один код в инсталляторе. Если нет, то код другой.

Понимаю теперь, что это делается без сторонних плагинов.

Основываясь на Справочнике и Вашем примере, получился такой код функции.
Будет ли сиё работать со всеми Windows от XP до 10? Или что-то нужно добавить?

Код:

Function .onInit
; Получаем текущие размеры экрана
  System::Call 'user32::GetSystemMetrics(i 0) i .r0' ; Ширина в пикселях
  System::Call 'user32::GetSystemMetrics(i 1) i .r1' ; Высота в пикселях
${If} $0 == 1920
${AndIf} $1 == 1080
MessageBox MB_OK "Установлено разрешение 1920x1080"
${Else}
  MessageBox MB_OK "Установлено любое другое разрешение"
${EndIf}
FunctionEnd

---------------------------

Цитата:

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

Вы о том, чтобы заменить переменные $0 и $1 на созданные? В Справочнике про это написано, но я не разобрался как созданные переменные правильно внедрять в логические конструкции.

Flix 07-08-2018 15:26 2825287

Цитата:

Цитата Serg866
Я не планировал смену разрешения у пользователей... Будет ли сиё работать со всеми Windows от XP до 10? Или что-то нужно добавить?»

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

Цитата:

Цитата Serg866
Вы о том, чтобы заменить переменные $0 и $1 на созданные? »

Конечно. Просто объявите собственные переменные и сразу после использования $0 и $1 копируйте их содержимое в ваши переменные. Но если ваш код останется таким же, как показано в вашем примере, то этого делать не обязательно.

agrei678 16-08-2018 20:16 2826898

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

Begin2Fly 16-08-2018 20:28 2826900

Цитата:

Цитата agrei678
подскажите , и по возможности кто знает подправьте пожалуйста ,почему скрипт не компилируется? ) »

Потому что это криво распакованная сборка PowerISO (при чём моя), и ничего даже близко похожего к рабочему скрипту здесь нет.

agrei678 17-08-2018 17:28 2827140

Begin2Fly, Это вы знаменитый KpoJIuK, а не могли бы вы выставить скрипт, а-то в nsis ни когда не делал

Insofts 07-10-2018 18:23 2834876

Nsis Script Creator Это простой текстовый редактор, с функцией быстрой разработки простых NSIS скриптов.

Ссылка на страницу программы: http://www.insofts.ru/Nsis_Script_Creator.html






Salmo 11-11-2018 00:49 2840241

Добрый день. Можно ли в NSIS определить выделенный файл (в фокусе), чтобы продолжить работать, именно, с ним?

MKN 13-11-2018 13:45 2840509

Цитата:

Цитата Salmo
определить выделенный файл (в фокусе) »

Что под этим подразумевается ? (подробнее, последовательность действий и задача)

Salmo 13-11-2018 14:47 2840524

Цитата:

Цитата MKN
Что под этим подразумевается ? »

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

MKN 13-11-2018 15:53 2840533

Salmo,
Самое простое, кликнуть правой кнопкой мыши по любому файлу и в появившемся контекстном меню кликнуть по нужному пункту, который сам и создашь.
код , как создать такой пункт :
Код:

OutFile "FilePatchMyFunction.exe"
RequestExecutionLevel admin

Section
SetShellVarContext all
WriteRegStr HKEY_CLASSES_ROOT "*\Shell\FilePatchMyFunction" "" ""
WriteRegStr HKEY_CLASSES_ROOT "*\Shell\FilePatchMyFunction\command" "" "$TEMP\MyFunction.exe /A $\"%1$\""
;WriteRegStr HKCR "*\Shell\FilePatchMyFunction" "icon" "$icoPatch\my.ico"
SectionEnd

В этом примере пункт назван "FilePatchMyFunction"

Обрабатывается клик командой "$TEMP\MyFunction.exe /A $\"%1$\"

MyFunction.exe(помещаемую, как пример, в $TEMP), где определяется путь из переменной, получаем так :

Код:

outfile "MyFunction.exe"
!include "FileFunc.nsh"
RequestExecutionLevel admin

Function .onInit
${GetParameters} $R0
ClearErrors
${GetOptions} $R0 "/A" $0
MessageBox MB_OK "$0"
FunctionEnd

Section
SetAutoClose true
SectionEnd

(этот код можешь добавить в код своей функции или как угодно...)

Наверняка можно "ловить" клик по файлу и иначе, но это уже программирование иного уровня...

Salmo 13-11-2018 18:43 2840556

MKN, спасибо! Буду думать над вариантом с контекстным меню, если "левый" клик отловить не так просто.

Flix 18-11-2018 12:18 2841303

Salmo, MKN, в проводнике Windows есть стандартная функция "Копировать как путь". Нужно зажать клавишу SHIFT и щелкнуть по файлу правой кнопкой мыши. В контекстном меню будет доступна команда "Копировать как путь".

MKN 20-11-2018 09:58 2841651

Цитата:

Цитата Flix
в проводнике Windows есть стандартная функция "Копировать как путь" »

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

Salmo 23-11-2018 16:28 2842285

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

      !include "FileFunc.nsh" 
 
      Function .onInit
      ${GetParameters} $R0
      ClearErrors
      ${GetOptions} $R0 "/A" $0
      MessageBox MB_OK "$0"    ;проверка
      FunctionEnd

"Натаскиваю" файл на ярлык ЕХЕ_шника, отрабатывает код и в переменную $0 сбрасывается путь к файлу. Такой вариант меня вполне устраивает.

Serg866 14-12-2018 09:17 2845868

Привет
Нужна функция, определяющая, что инсталлятор был запущен из rar-архива, и в зависимости от этого выполнять определённый код. Подскажите, друзья, как мне такое реализовать?
Я понимаю, что при запуске из архива, файл инсталлятора распаковывается во временную папку и уже оттуда самозапускается. Но определить, что установщик был запакован в архив всё равно нужно.

MKN 14-12-2018 10:18 2845880

Цитата:

Цитата Serg866
Нужна функция, определяющая, что инсталлятор был запущен из rar-архива »

Детектишь сигнатуру архива. В теме уже было. Основные сигнатуры известны.
К примеру, сигнатура WinRAR compressed archive(v4.x) - 52 61 72 21 1A 07 00
Конкретнее есть здесь : https://www.rarlab.com/technote.htm
Цитата:

RAR 5.0 signature consists of 8 bytes: 0x52 0x61 0x72 0x21 0x1A 0x07 0x01 0x00. You need to search for this signature in supposed archive from beginning and up to maximum SFX module size. Just for comparison this is RAR 4.x 7 byte length signature: 0x52 0x61 0x72 0x21 0x1A 0x07 0x00.

Serg866 14-12-2018 11:04 2845888

MKN, к сожалению про сигнатуры я ничего не понял...


При запуске инсталлятора из rar-архива, происходит распаковка во временную папку, и уже из неё инсталлятор автоматически запускается в обычном виде.

Путь к временной папке, в которую распаковывается инсталлятор:
C:\Documents and Settings\Серж\Local Settings\Temp\Rar$EXa0.XXX (вместо XXX - три случайные цифры)
Вот думаю, надо привлекать сюда команду $EXEDIR, определять путь запуска и если в пути присутствует слово "temp" или "rar$", то выполнять определённый код. Меня бы такой вариант устроил. Буду благодарен за пример кода по данному сценарию.

MKN 14-12-2018 11:35 2845898

Serg866,
Т.е. ты сначала запускаешь SFX RAR, из которого в свою очередь запускается NSIS инсталлятор ?
А NSIS инсталлятор после запуска определяет откуда он появился на свет ? Если из RAR архива, то...
Тогда, раз известны некоторые данные в названии временного файла, можно с этим файлом работать,т.е. узнать RAR это архив или нет.
Я правильно понял ? Сигнатура тогда и нужна, для того, чтобы точно определить, какой это файл.
(Хотя в темпе ведь уже может быть непредсказуемый винегрет из кучи разных файлов с непредсказуемыми названиями, в том числе и с "temp" или "rar... Тут и сигнатура не поможет. :) Разве что сначала придётся очищать темп или детектить последнее время создания временного архивного файла... )

ps Зачем такие извращения ? И антивирусы сойдут с ума от такой матрёшки... :)

Serg866 14-12-2018 12:19 2845909

MKN, мне только этого будет достаточно:
1. Определяется путь запуска инсталлятора ($EXEDIR)
2. Если в $EXEDIR есть слово "rar"или "temp", то мессаджбокс и аборт установки.
Ничего вычищать из папок не требуется.


Зачем мне это надо
Недобросовестные персонажи упаковывают мою программу в winrar-архив, куда также кладут url-файлы ссылок на свои уг-сайты и ещё кучу всякого "добра".
И потом в таком виде на этих сайтах мою программу распространяют против моей воли.

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

Iska 14-12-2018 13:02 2845918

Serg866, пожалуйста, не делайте так. Это плохая практика, ибо есть ещё и добросовестные персонажи.

Flix 14-12-2018 14:13 2845935

Цитата:

Цитата Serg866
2. Если в $EXEDIR есть слово "rar"или "temp", то мессаджбокс и аборт установки. »

Для поиска подстроки в указанной строке можно воспользоваться функцией StrContains.

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

Код:


Function .onInit

 ; В строке пути $EXEDIR ищем подстроку Rar, результат поиска записываем в регистр $0
 ${StrContains} $0 "Rar" "$EXEDIR"
 ; Если в регистре $0 содержится подстрока "Rar", то...
 ${If} $0 == "Rar"
  ; Выводим на экран сообщение
  MessageBox MB_ICONEXCLAMATION|MB_OK "Вы используете нелегальную копию."
  ; Завершаем работу инсталлятора
  Quit
 ${EndIf}

 ; другие инструкции функции

FunctionEnd

Поиск подстроки "temp" использовать не рекомендую, т.к. любой NSIS инсталлятор при запуске активно задействует временный каталог.

MKN 14-12-2018 15:11 2845949

Цитата:

Цитата Flix
Поиск подстроки "temp" использовать не рекомендую »

Да и поиск в пути подстроки Rar тоже может подвести... Сочетание Rar запросто может входить в имя пользователя...
\Documents and Settings\Raritet\Local Settings\Temp\Rar$EXa0.XXX

Flix 14-12-2018 19:04 2846000

Цитата:

Цитата MKN
Сочетание Rar запросто может входить в имя пользователя... »

Абсолютно верное замечание. Я привел всего лишь простейший пример, который можно доработать, предусмотрев возможные коллизии. :)

MKN 15-12-2018 09:15 2846079

Flix,
Интересно, как долго висит процесс SFX модуля ? Если процесс ещё существует во время запуска NSIS инсталлятора, то это был бы очень хороший ориентир для детекта... Хорошо бы посмотреть, как работает, "оприходованный" пиратами, инсталлятор Serg866. :)

Iska 15-12-2018 15:13 2846148

Цитата:

Цитата MKN
Интересно, как долго висит процесс SFX модуля ? Если процесс ещё существует во время запуска NSIS инсталлятора, »

Только если задан флаг:
Цитата:

Программа установки / Ждать и устанавливать код возврата

Если включён этот параметр, SFX ждёт завершения работы каждой программы установки, указанной для запуска после извлечения данных, и устанавливает код возврата исполняемого SFX-файла равным коду возврата программы установки. Если из-за какой-либо ошибки SFX не может запустить программу установки, то он возвращает свои собственные коды ошибки, такие же, как коды возврата WinRAR. Коды возврата можно изменить на указанную величину, введя её в поле "Коррекция кода возврата"

Flix 16-12-2018 03:44 2846286

Встречайте NSIS v3.04 (релиз от 15 декабря 2018): страница загрузки

Что нового...
HTML код:

F.1 3.04

F.1.1 Changelog
F.1.1.1 Major Changes

    Added IsNativeMachineArchitecture helper macros to x64.nsh
    Added experimental WinVer "Windows as a Service" detection macros
    Added MakeNSISW window info "spy" tool

F.1.1.2 Minor Changes

    Added MUI_TEXTCOLOR setting
    nsDialogs::OnNotify can now return values back to Windows
    Added LIBRARY_INSTALL_EQUAL_VERSION InstallLib option
    Added NTMARTA to preload list to fix rare Windows 7 security issue (bug #1204)
    AddBrandingImage now supports dialog units
    Fixed !macroundef of last defined macro bug
    Fixed MultiUser caption string bug (bug #1012)
    !undef issues warnings instead of errors
    MakeNSIS prints -CMDHELP to stdout (bug #1203)
    Removed LibraryLocal utility

F.1.1.3 Translations

    Added Hindī (patch #289)
    Updated Belarusian, German (bug #1023), Mongolian and Spanish (bug #1205)


Serg866 11-01-2019 16:39 2851425

Привет, друзья!

Насчёт проверки запуска из архива - пример от Flix'a работает чётко.
Спасибо!
--------------------

Появилась ещё одна, а точнее две задачки по NSIS:

Можно ли определить тип видеокарты пользователя? (ATI или Nvidia).
И в зависимости от типа видюхи устанавливать файлы.

Также мне нужно определить, установлена ли у юзера Windows10.
В справке посмотрел, есть раздел "Определение ОС с помощью NSIS", но там только до Windows 8.

Я использую NSIS 3 c параметром Unicode true, правда не последнюю версию, а 3.0b2.

MKN 11-01-2019 17:59 2851441

Цитата:

Цитата Serg866
Можно ли определить тип видеокарты пользователя? »

самое простое, так :
Код:

;WMI.nsh  - https://nsis.sourceforge.io/WMI_header
OutFile "GetVideoController.exe"
!include WMI.nsh

Section
${WMIGetInfo} root\CIMV2 Win32_VideoController AdapterCompatibility callback_Function
SectionEnd

Function callback_Function
System::Call "user32::OemToChar(t R2, t. r2)" ; нужно, если вдруг символы будут "кракозябрами"
MessageBox MB_OK "$2"
FunctionEnd


Serg866 12-01-2019 12:14 2851535

Вложений: 1
MKN, благодарю!
Пример показал инфу, что у меня видеокарта от AMD (правильно).
Кстати, в папке скрипта зачем-то создался пустой bat-файл "TempWmicBatchFile.bat"
-
Подскажите, пожалуйста, по какому параметру работать дальше?
Т.е если драйверы от AMD, то чтобы устанавливались определённые файлы.
-
Работать с текстовой строкой "Advanced Micro Devices, Inc." ?
Типа, если $2 = Advanced Micro Devices, Inc., то устанавливаем файлы.

Или как-то иначе?

Serg866 22-01-2019 23:28 2853884

Вопрос выше актуален. Друзья-коллеги, помогите разобраться.

MKN 23-01-2019 10:08 2853925

Serg866,
Так всё очевидно... Сам же уже и ответил :
Цитата:

Цитата Serg866
если $2 = Advanced Micro Devices, Inc., то устанавливаем файлы. »

Если в переменной "то", то делаем "это". Простая логика.

динозавра 14-02-2019 17:57 2857985

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

Код:

!define NAME "0"
VIProductVersion "0.0.0.0"
VIAddVersionKey "0" "0"
VIAddVersionKey "FileVersion" "${PRODUCT_VERSION}"
VIAddVersionKey "FileDescription" "0"
Var RunParamVar
Name "${NAME}"
OutFile "0.exe"
Icon "0\0.ico"
SilentInstall silent
!include "x64.nsh"
!include "FileFunc.nsh"
Section main
        MessageBox MB_YESNO|MB_TOPMOST|MB_USERICON "Мама, вы жареной рыбы хотите ?" IDYES go
        Abort
        go:
        MessageBox MB_OK|MB_TOPMOST|MB_USERICON "Тогда нажарьте и не морочьте мне голову!"
SectionEnd
Function CheckRunParam
${GetParameters} $RunParamVar
ClearErrors
${GetOptions} $RunParamVar "" $1
${IfNot} ${Errors}
Quit
${EndIf}
FunctionEnd

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

MKN 15-02-2019 10:37 2858079

динозавра,
посмотри здесь :
https://nsis-dev.github.io/NSIS-Foru.../t-278793.html

динозавра 15-02-2019 12:42 2858092

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

MKN 15-02-2019 13:25 2858098

динозавра,
тогда так :
Код:

OutFile "Select LANG_ID.exe"
 !include "LogicLib.nsh"

Function .onInit
System::Call 'kernel32::GetSystemDefaultLangID() i .r0'
IntOp $0 $0 & 0xFFFF
IntFmt $0 "%04X" $0
MessageBox MB_OK "$0"
FunctionEnd

Section
${If} $0 != 0419
MessageBox MB_OK "Nachricht auf Deutsch"
${EndIf}

${If} $0 = 0419
MessageBox MB_OK "Сообщение на русском"
${EndIf}
SectionEnd


динозавра 15-02-2019 15:12 2858122

Огромное спасибо за помощь.
Но у меня это не работает, вернее криво и при смене регионального языка ничего не меняется.
Пробовал в коде менять MessageBox MB_OK "$0" на MessageBox MB_YESNO "$0" еще хуже,
а с двумя этими строками вдвойне хуже.
Вот можно посмотреть https://streamable.com/lxmyx

MKN 15-02-2019 15:30 2858130

динозавра,
Так ты не меняешь язык системы, потому и ID остаётся тот же. Вроде как задача была для не русской Windows ? На ней и будет работать...
А при смене языка, как делаешь ты, вероятно надо использовать - GetUserDefaultUILanguage, которая возвращает language identifier, выбранный пользователем.
Т.е. System::Call `kernel32::GetUserDefaultUILanguage() i.r0`
И вроде как, именно эту функцию использует и сам NSIS, потому и следовало бы обратить внимание на первую ссылку, что я давал...

динозавра 15-02-2019 15:51 2858132

Я не правильно поставил вопрос. Но с видео видно, что я хотел и что этот код не работает.
А по ссылке я вообще ничего не понял. Но , все равно большое спасибо.

Kopejkin 20-02-2019 14:30 2858997

Приветствую.
Понадобилось мне удалять из реестра ключи, сгенерированные случайным образом в различных корневых ветках, но всегда содержащие несколько одинаковых имен параметров. Пытался приспособить для этого пример из статьи Справочника по NSIS "Registry: Работа с реестром".
Что получилось...

Код:

!include "MUI2.nsh"
!include "Registry.nsh"
!include "logicLib.nsh"

Caption registry
Name registry
OutFile registry.exe
ShowInstDetails show

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Section
  ${registry::Open} "HKEY_CURRENT_USER\Software\" "/N='efUeeuskh'" $0
  StrCmp $0 0 0 loop
  MessageBox MB_OK "Error" IDOK close
  loop:
      ${registry::Find} "$0" $1 $2 $3 $4
      StrCmp $4 "" close
      DetailPrint "Ключ: $1"
      DetailPrint "Имя параметра: $2"
      DetailPrint "Значение параметра: $3"
      DetailPrint "Тип ключа: $4"
      DetailPrint "--------"

StrCpy $9 $1
        ; MessageBox MB_OK "$9" IDOK
${registry::DeleteKey} "HKCU\$9" $R0
        ; MessageBox MB_OK "HKCU\$9" IDOK
Goto loop
  close:
  ${registry::Close} "$0"
  ${registry::Unload}
SectionEnd

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

MKN 20-02-2019 16:49 2859022

Цитата:

Цитата Kopejkin
тогда получается, нужно такой код писать для каждой корневой ветки реестра? »

Для каждой. Но меньше писанины будет, если использовать RegistryFunc.nsh от kotkovets
Код:

${RegFind} "Key" "Options" Function
Попробуй, может подойдёт для твоего случая...

AlekseyPopovv 09-03-2019 12:33 2862211

После установки приложения запускаю файл "start.cmd" командой Exec "$EXEDIR\${APP}\start.cmd"
Файл запускается как и надо не скрыто, но почему то
эти команды

:info
echo.
if exist "%programfiles%/Notepad++/notepad++.exe" goto note64i
if exist "%programfiles(x86)%/Notepad++/notepad++.exe" goto note86i
notepad bin/info.txt
pause
goto home
:note64i
"%programfiles%/Notepad++/notepad++.exe" bin/info.txt
pause
goto home
:note86i
"%programfiles(x86)%/Notepad++/notepad++.exe" bin/info.txt
pause
goto home
в файле "start.cmd" не срабатывают. Т.е. Notepad++ не запускается, а сразу стандартный блокнот.
Если закрыть файл "start.cmd" и заново запустить, то всё работает как надо. В чём причина может быть?

Salmo 17-03-2019 14:20 2863542

Уважаемые, есть живые? :) После большого перерыва все забыл.....ну почти все... Подскажите, пожалуйста, как отловить нажатие клавиши на клаве (Ctrl) после закрытия MessageBox кнопкой "Отмена"? То есть нажимаю Ctrl, удерживаю и одновременно нажимаю Отмену в сообщении. Хочу "раздвоить" отмену...

MKN 19-03-2019 12:05 2863974

Цитата:

Цитата Salmo
как отловить нажатие клавиши на клаве (Ctrl) »

Можно с помощью функции GetAsyncKeyState
Пример отслеживания нажатия Shift http://nsis-dev.github.io/NSIS-Forum.../t-237087.html
Тебе нужен VK_CONTROL 0x11

Salmo 20-03-2019 03:05 2864162

MKN, отлично, все получилось! Спасибо за отзывчивость :yes:

Salmo 30-03-2019 16:35 2865969

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

Fedor Pechkin 01-04-2019 20:39 2866231

Ребят ткните носом пожалуйста нуба, не могу разобраться как в .exe файле заменить файл png на свой, вот в этом файле

MKN 02-04-2019 10:35 2866285

Цитата:

Цитата Salmo
закрыть окно проводника с открытой папкой? »

Может достаточно закрыть процесс проводника ?

Salmo 03-04-2019 17:01 2866473

MKN, Здравствуйте...Это слишком радикально. Другие окна\папки должны остаться открытыми. Нужно закрыть одну папку с определенным именем.

MKN 03-04-2019 17:53 2866479

Salmo,
Цитата:

Цитата Salmo
Нужно закрыть одну папку с определенным именем. »

Ищешь окно(хэндл) открытой папки с нужным именем (Текст окна = Имя папки. Можно уточнить любым оконным сканером.) и закрываешь это окно, послав соответствующее сообщение... Когда то вроде разбирали этот случай...
Сообщение, к примеру такое :
SendMessage $R0 ${WM_SYSCOMMAND} 0xF060 0
0xF060 - константа для SC_CLOSE.

Iska 03-04-2019 19:55 2866488

Тут как — у одного будет только имя конечного каталога, у другого — полный путь в заголовке.

Salmo 04-04-2019 03:10 2866522

MKN, С папкой получилось, спасибо.
Нашел тут давненько выложенный макрос, автор kotkovets. Что нужно в нем изменить, чтобы код "нажимал" на клавишу F5 - горячую клавишу программы?

Код:

!define VK_TAB                0x9
!define keybd_event "!insertmacro macro_keybd_event"
!macro macro_keybd_event setkey intkey
  !ifndef keybd
  !define keybd
  !define KEYEVENTF_EXTENDEDKEY 0x0001
  !define KEYEVENTF_KEYUP      0x0002
  !endif
  System::Store S
  ${For} $0 1 ${intkey}
    System::Call "user32::keybd_event(i${setkey}, i0x45, i${KEYEVENTF_EXTENDEDKEY}|0, i0)"
    System::Call "user32::keybd_event(i${setkey}, i0x45, i${KEYEVENTF_EXTENDEDKEY}|${KEYEVENTF_KEYUP}, i0)"
  ${Next}
  System::Store L
!macroend


MKN 04-04-2019 10:54 2866544

Цитата:

Цитата Salmo
чтобы код "нажимал" на клавишу F5 »

В том коде вместо !define VK_TAB 0x9
назначаем :
!define VK_F5 0x74

; эмуляция нажатия F5
Sleep 300
${keybd_event} ${VK_F5} 1

Salmo 05-04-2019 16:22 2866742

MKN, Спасибо, все получилось!

MaGoth 15-04-2019 13:09 2867846

Привет всем, :)
Решил тут скомпилить пример из справки с нсДиалогом, ну или лыжи не едут или я уже все позабывал..

еррор:
Error: resolving install function "myGuiInit" in function ".onGUIInit"
Note: uninstall functions must begin with "un.", and install functions must not

или то все проблемы моей Юникод версии? :dont-know

MKN 16-04-2019 15:12 2867969

MaGoth,
Чтобы что то подсказать, нужно видеть твой код...

MaGoth 16-04-2019 21:11 2868008

Цитата:

Цитата MKN
Чтобы что то подсказать, нужно видеть твой код... »

да это не проблема, тем более что код из этой темы::

Код:

!define PRODUCT_NAME "Winamp"
!define PRODUCT_VERSION "5.5.4.2147"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!include "MUI2.nsh"
!include "nsDialogs.nsh"
!include "LogicLib.nsh"

SetCompressor /SOLID lzma

!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\winamp.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
!define BRANDING "RePack by D!akov"
;\Unicode\Contrib\Graphics\Icons
Var dlg
Var Label
Var Check
Var Check1
Var Check2
Var CheckBox
Var CheckBox1
Var CheckBox2
Var Radio
Var Radio1
Var RadioButton
Var RadioButton1
Var ImageHandle
Var Image

!insertmacro MUI_PAGE_WELCOME
Page custom PageInit PageDestroy
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

; Описание фаqла
/*VIProductVersion "${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} "CompanyName" "RePack by D!akov"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} "FileDescription" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} "FileVersion" "${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} "LegalCopyright" "Копирайт © D!akov, 2019. Все права защищены."  */
; Конец описания файла

Name "${PRODUCT_NAME}"
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
UninstallCaption "Удаление ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES\Winamp"
ShowInstDetails show
ShowUnInstDetails show
BrandingText "${BRANDING}"


Function .onInit
  InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
  File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
  File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
FunctionEnd


Function PageInit
  !insertmacro MUI_HEADER_TEXT "Выбор типа и компонентов установки" "..."
  nsDialogs::Create 1018
  Pop $dlg
  ${NSD_CreateLabel} 0u 0u 120u 12u "Пожалуйста, сделайте выбор:"
  Pop $Label
  ;;
  ${NSD_CreateRadioButton} 0u 14u 150u 12u "Установка Winamp 5.623 Build 3199 Pro"
  Pop $RadioButton
  ${NSD_SetState} $RadioButton 1            ;делаем радиобутон отмеченным
  ${NSD_OnClick} $RadioButton RadioButton  ;событие отметки радиобутона
  ;;
  ${NSD_CreateRadioButton} 0u 28u 160u 12u "Распаковка Winamp 5.6.2.3199 Pro Full Final"
  Pop $RadioButton1
  ${NSD_OnClick} $RadioButton1 RadioButton1 ;событие отметки радиобутона
  ;;
  ${NSD_CreateCheckBox} 0u 100u 120u 12u "Ярлык(и) на рабочем столе"
  Pop $CheckBox
  ${NSD_SetState} $CheckBox 1
  ;;
  ${NSD_CreateCheckBox} 0u 115u 100u 12u "Ярлыки в меню «Пуск»"
  Pop $CheckBox1
  ${NSD_SetState} $CheckBox1 1
  ;;;;;;;;;;
  ${NSD_CreateCheckBox} 150u 115u 140u 12u "Установить набор скинов"
  Pop $CheckBox2
  ${NSD_SetState} $CheckBox2 1
  ;;;;;;;;
  ${NSD_CreateBitmap} 180u 0u 100% 100% "" ;создаем контрол для картинок
  Pop $Image
  ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle ;загружаем картинку
  nsDialogs::Show
  ${NSD_FreeImage} $ImageHandle ;удаляем картинку
FunctionEnd

Function switching
  ${NSD_GetState} $RadioButton $Radio ;снимаем статус отметки радиобуттона
  ${If} $Radio == 1                  ;если радибуттон "Установка обычной версии" отмеченный то...
      EnableWindow $CheckBox 1
      EnableWindow $CheckBox1 1
      EnableWindow $CheckBox2 1
      ${NSD_SetState} $CheckBox 1
      ${NSD_SetState} $CheckBox1 1
      ${NSD_SetState} $CheckBox2 1
      ${NSD_FreeImage} $ImageHandle                  ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle  ;загружаем картинку
  ${Else}                          ;если радибуттон "Установка обычной версии" неотмеченный то...
      EnableWindow $CheckBox 0    ;затеняем чекбокс
      EnableWindow $CheckBox1 0    ;затеняем чекбокс
      EnableWindow $CheckBox2 0    ;затеняем чекбокс
      ${NSD_SetState} $CheckBox 0  ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox1 0 ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox2 0
      ${NSD_FreeImage} $ImageHandle              ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\orange-r.bmp" $ImageHandle  ;загружаем картинку
  ${EndIf}
FunctionEnd

 ;функции события отметки радиобуттонов
Function RadioButton
  Pop $RadioButton
  Call switching
FunctionEnd
Function RadioButton1
  Pop $RadioButton1
  Call switching
FunctionEnd

Function PageDestroy
  ;функция которая выполняется при закрытии кастомной станички
  ;снимаем статусы отметок радиобуттонов и чекбоксов
  ${NSD_GetState} $RadioButton $Radio
  ${NSD_GetState} $RadioButton1 $Radio1
  ${NSD_GetState} $CheckBox $Check
  ${NSD_GetState} $CheckBox1 $Check1
  ${NSD_GetState} $CheckBox2 $Check2
FunctionEnd


Section "-Обычная установка"
  ${If} $Radio == 1
  SetOutPath "$INSTDIR\Winamp"
File /r "C:\Winamp\*.*"
 SetShellVarContext all
  /*CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Nullsoft" "" ""
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Nullsoft\Winamp" "regname" "D!akov"
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Nullsoft\Winamp" "regkey" "~AYKPaDABBRfbBTiZGjQO"
  ExecWait '$INSTDIR\winamp.exe /REG=LCAD'*/
  WriteUninstaller "$INSTDIR\uninst.exe"
  /*CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$INSTDIR\winamp.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "${PRODUCT_VERSION}"
Delete "$INSTDIR\Winamp"
      ;;;
      ;тут пишем все команды при обычной установке*/
      ;DetailPrint "Обычная установка"
      ;;;
  ${EndIf}
SectionEnd

Section "-Распаковка портативной версии"
  ${If} $Radio1 == 1
  ;;SetOutPath "$INSTDIR"
  ;;File /r "D:\Winamp\WinampPortable\*.*"
  SetShellVarContext all
      ;тут пишем все команды при распаковки портативной версии
      MessageBox MB_OK "Портативная версия распакована в текущую папку."
      ;;;
  ${EndIf}
SectionEnd

Section "-Ярлыки"
  ${If} $Check == 1
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\winamp.exe"
      ;;;
      DetailPrint "Ярлык на рабочий стол"
      ;;;

  ${EndIf}
  ${If} $Check1 == 1
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\winamp.exe"
      ;;;
      DetailPrint "Ярлык в меню Пуск"
      ;;;
      ${EndIf}
SectionEnd

 
Section "-Скины"
  ${If} $Check2 == 1
;;SetOutPath "$PROGRAMFILES\Winamp\Winamp\Skins"
;;File /r "C:\Winamp\Skins\*.*"
SetShellVarContext all
      ;;;
  ${EndIf}
SectionEnd

Section Uninstall
SectionEnd


Зы, Мой НСИС Юникодный 2.50, если что..

Flix 16-04-2019 23:57 2868022

Цитата:

Цитата MaGoth
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit »

MaGoth, в сценарии объявлена функция с именем myGuiInit, но сама функция отсутствует.

MaGoth 17-04-2019 01:08 2868026

Цитата:

Цитата Flix
в сценарии объявлена функция с именем myGuiInit, но сама функция отсутствует. »

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


Вопрос из другой оперы.
Есть плагин для выдирания срц из файла CRCCheck.dll, все бы хорошо, но он выдает в 10м виде значение, а как бы его дернуть в 16м?
Для примера накидал скриптик, который выдал следующее значение для файла: CRC: 3164762915 в мессага бокс и текстовку, а оригинальный файл: CRC32: bca27323.

Какой-нить конвертер с 10го в 16е существует ?!

MKN 17-04-2019 10:17 2868065

Цитата:

Цитата MaGoth
конвертер с 10го в 16е существует ?! »

Код:

OutFile "Test_DecToHex.exe"
; CRC: 3164762915 -> CRC32: bca27323
Section
StrCpy $1 "3164762915"
IntFmt $1 "%08x" $1
MessageBox MB_OK "$1"
SectionEnd


heloy2010 14-05-2019 17:35 2871685

А почему нельзя здесь просто взять и выложить конкретные примеры команд для изменения тех же хост-файлов? Я вижу здесь какое-то маниакальное желание автора справочника, всех заставить его изучать. Почему для внесения изменений в хост-файл, в сети выложено множество готовых батников и конкретные описания команд для тех или иных операций? И ни кому в голову не приходит посылать пользователей изучать справочники и пособия, на изучение которых требуется продолжительное время, а решить вопрос требуется непосредственно в данный момент. Конечно вам большая благодарность за данный справочник, но не всем дано так вот сходу в нем разобраться.
Хочу уточнить. Мне, например, как полагаю и многим, нужен шаблон (пример) скриптовой команды для внесения новой строки в хост-файл. Кроме того, необходимо, чтобы строка не прописывалась повторно (не дублировалась) в случае, если в хосте уже имеется аналогичная. А также нужен второй шаблон скриптовой команды, но только для удаления необходимой строки из хост-файла. В батниках, примеры всех этих команд, давно уже выложены в сети. Но к сожалению до сих пор нет конвертера, работающего по аналогии с Reg2Nsis и преобразующего батники в команды NSIS-скриптов. И указанные скриптовые команды, нужны людям довольно часто, при создании тех же репаков или портативок в формате Portable.paf. Почему выложены примеры команд по созданию разных банеров, заставок и прочего, а реально необходимых примеров не найти?

MaGoth 12-07-2019 15:48 2879523

Прив народ.. :)

Мелкая проблемка есть такой батник::

Код:

@echo off
sdbinst.exe -n "GOG.com Gothic"
sdbinst.exe -n "GOG.com Gothic 2"

Вопрос как его перегнать в скрипт Нсиськи ??

Накатал такие строчки:
Код:

ExecWait "$WINDIR\System32\sdbinst.exe -n 'GOG.com Gothic'"
ExecWait "$WINDIR\SysWOW64\sdbinst.exe -n 'GOG.com Gothic'"

Но что-то не работает.. в кавычках и/или путях грабли ??

зы.. отбой разобрался..

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

Flix 13-07-2019 12:56 2879611

Цитата:

Цитата MaGoth
график карты нормально определять можно чем нить через скрипт помимо левых костылей на всяких *.длл ?! »

На ОС Windows считывать необходимые данные прямо из реестра: ссылка.

MaGoth 14-07-2019 12:15 2879731

Цитата:

Цитата Flix
На ОС Windows считывать необходимые данные прямо из реестра: ссылка. »

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

Нашел немного иной путь, но там тоже своих грабель хватает, впрочем бум разбираться.. :)

Flix 14-07-2019 13:07 2879735

Цитата:

Цитата MaGoth
это вообще дичь какая-то и больше ориентированна на определение драйверов, а не самого девайса.. »

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

f0r_ce 14-08-2019 14:57 2884012

Привет, есть задача научить запускать скомпилированный exe nsis'ом только при наличии параметра, то есть:

Installer.exe -start - установщик запускается как положенно.
Installer.exe - без параметра, запуска не происходит.

Каким образом можно реализовать?

Begin2Fly 14-08-2019 15:09 2884013

Цитата:

Цитата f0r_ce
Привет, есть задача научить запускать скомпилированный exe nsis'ом только при наличии параметра »

Получаем параметры, ищем -start. Если есть, работаем, иначе завершение приложение.

Код:

${GetParameters} $CMDLINE
ClearErrors
${GetOptions} $CMDLINE "-start" $1
${IfNot} ${Errors}
        MessageBox MB_OK "Параметр -start получен"
${Else}
        Quit ; иначе - завершение приложения
${EndIf}


f0r_ce 14-08-2019 19:10 2884043

Begin2Fly, благодарю, есть так же задача научить запускать скомпилированный exe nsis'ом только при определенном имени exe:

имя Installer.exe - запускается в обычном режиме
имя отличное от Installer.exe - завершаться

Каким образом можно реализовать?

Begin2Fly 14-08-2019 19:15 2884045

${If} $EXEFILE == "Installer.exe"
MessageBox MB_OK "Обычный режим"
${Else}
Quit
${EndIf}

динозавра 15-08-2019 08:23 2884092

Друзья, нужна помощь. Состряпал для эксперимента экзешник.
Как запустить установленный батник?
Вот код
Скрытый текст
Код:

!define PRODUCT_NAME "PRODUCT"
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup.exe"
InstallDir "C:\Program Files\Proga"
Icon "icon.ico"
SilentInstall silent
!define RUN "C:\Program Files\Proga\1.bat"
Section "MainSection" SEC01
  SetOutPath "C:\Program Files\Proga"
 SetOverwrite on
  File "..\1.bat"
SectionEnd
Section -Post
SectionEnd



Все, разобрался.
Код:

Exec '"$INSTDIR\1.bat"'
Теперь другая проблема. Как прописать, чтобы окошко батника не промилькивало?

MKN 17-08-2019 11:56 2884433

обновился NSIS Dialog Designer
v.1.4.4 - 2019-08-01
Цитата:

FIX: Removed decimals from control coordinates in generated NSIS script.
Цитата:

Цитата динозавра
Как прописать, чтобы окошко батника не промилькивало? »

почитай, к примеру https://stackoverflow.com/questions/...entily-in-nsis

iglezz 18-08-2019 14:15 2884569

Цитата:

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

Код:

nsExec::Exec '"$INSTDIR\1.bat"'

динозавра 18-08-2019 16:23 2884597

iglezz,
Спасибо, все красиво и не мелькает.. А то я уже через .vbs слепил.

динозавра 21-08-2019 06:47 2884884

Друзья, У меня опять супер проблема. Ну никак не работает удаление файла из папки System32 на Вин х64.
Уже пишу такое и никак:

Код:

!include "x64.nsh"
Section
 Delete "$WINDIR\System32\1.txt
 Delete "$SYSDIR\1.txt
 Delete "C:\Windows\System32\1.txt"
SectionEnd

Но если я подсовываю 1.txt в SysWOW64 то оттуда удаляет. Что я делаю не так?

Begin2Fly 21-08-2019 11:01 2884910

${DisableX64FSRedirection}

динозавра 22-08-2019 05:34 2885045

Begin2Fly,
Спасибо.
Еще чуток лет и я постигну азы NSIS.

И еще вопрос, в NSIS есть такое, чтобы MessageBox было без MB_YESNO и т.д, а чтобы окошко показывалось, к примеру с моей фразой нужное количество секунд?

И, где вы берете все эти коды? Ведь в справке их нет.

iglezz 22-08-2019 10:28 2885063

Цитата:

Цитата динозавра
И, где вы берете все эти коды? Ведь в справке их нет. »

1. помимо справки полезно изучить содержимое каталога nsis:
Include\ содержит заголовочные файлы (.nsh), подключаемые через !include. Многие хорошо документированы
Examples\ -- примеры к nsh и плагинам
Docs\ -- документы к nsh и плагинам

2. https://nsis.sourceforge.io/Developer_Center -- дополнительные плагины, примеры

Цитата:

Цитата динозавра
И еще вопрос, в NSIS есть такое, чтобы MessageBox было без MB_YESNO и т.д, а чтобы окошко показывалось, к примеру с моей фразой нужное количество секунд? »

Если совсем без кнопок и с таймером -- есть в базовой поставке плагин Banner

А вот пример MessageBox с таймаутом:
Скрытый текст

Код:

Name "MessageBoxTimeout"

OutFile "MessageBoxTimeout.exe"

RequestExecutionLevel user

Page instfiles

Section ""
SectionEnd

; заголовок
Var MsgBoxTitle
; текст
Var MsgBoxText
; таймаут в милисекундах
Var MsgBoxTimeout
; параметр uType (комбинация значений)
; https://docs.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser-messageboxa
Var MsgBoxParams

Function .onInit
        StrCpy $MsgBoxTimeout 3500 ; время в милисекундах
        StrCpy $MsgBoxTitle "MessageBoxTimeoutA func test"
        StrCpy $MsgBoxText "Timeout set to $MsgBoxTimeout msec."
        StrCpy $MsgBoxParams 0x00001000 ; MB_SYSTEMMODAL
        IntOp $MsgBoxParams $MsgBoxParams | 0x00010000 ; MB_SETFOREGROUND
        IntOp $MsgBoxParams $MsgBoxParams | 0x00000030 ; MB_ICONEXCLAMATION
        IntOp $MsgBoxParams $MsgBoxParams | 0x00000004 ; MB_YESNO

        System::Call "user32::MessageBoxTimeoutA(p $HWNDPARENT, t '$MsgBoxText', t '$MsgBoxTitle', i $MsgBoxParams, i 0, i $MsgBoxTimeout)i.s"
        Pop $0
        MessageBox MB_OK|MB_ICONINFORMATION "result = $0"
        Quit
FunctionEnd


MKN 22-08-2019 13:15 2885098

Цитата:

Цитата динозавра
чтобы MessageBox было без MB_YESNO и т.д, а чтобы окошко показывалось, к примеру с моей фразой нужное количество секунд? »

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

OutFile "MsgBoxTimeoutTest.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

Цитата:

Цитата iglezz
помимо справки полезно изучить содержимое каталога nsis »

А также просмотреть тему. Всё, что динозавра спрашивал уже было рассмотрено.

динозавра 23-08-2019 07:35 2885171

Всем привет.
Вот, что у меня получилось.
Скрытый текст
Код:

!define NAME "Registry cleaning"

VIProductVersion "0.0.0.1"
VIAddVersionKey "LegalCopyright" "© Lbyjpfdh"
VIAddVersionKey "FileVersion" "0.1"
VIAddVersionKey "FileDescription" "Cleaning and editing the registry"
VIAddVersionKey "ProductName" "For version Total Uninstall 6.27.0.565"
VIAddVersionKey "ProductVersion" "0.0.0.1"

Name "${NAME}"
Caption "${NAME}"
OutFile "Cleaning and editing the registry.exe"
InstallDir "$TEMP"
Icon "icon.ico"

!include x64.nsh
!include "FileFunc.nsh"
!include "LogicLib.nsh"

SilentInstall silent
SetCompress off

Section
SetOutPath "$TEMP"
  SetOverwrite on
  File "..\..\..\..\install\Registry cleaning.exe"
  File "..\..\..\..\install\TrashRegFull.exe"
  File "..\..\..\..\install\TrashRegX64Full.exe"
  File "..\..\..\..\install\ACL.TXT"
  File "..\..\..\..\install\ACLL.TXT"
  File "..\f.bat"
 Delete "$APPDATA\mntemp"
 Delete "$WINDIR\System32\linjqbyk.kfl"
 Delete "$SYSDIR\linjqbyk.kfl"
 Delete "$WINDIR\SysWOW64\linjqbyk.kfl"
SectionEnd

Section
 ${DisableX64FSRedirection}
 Delete "$WINDIR\System32\linjqbyk.kfl"
 Delete "$SYSDIR\linjqbyk.kfl"
SectionEnd

Function .onInit
System::Call "kernel32::GetUserDefaultLCID() i.r0"
IntOp $LANGUAGE $0 & 0xFFFF
IntFmt $0 "%04X" $0
FunctionEnd

Section
${If} $0 = 0419
MessageBox MB_YESNO|MB_TOPMOST|MB_USERICON "Хотие очистить реестр от триальных ключей?" IDYES a IDNO b
Abort
a:
Exec '"$INSTDIR\Registry cleaning.exe"'
  nsExec::Exec '"$INSTDIR\f.bat"'
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "Реестр от триальных ключей очищен."
b:
  Delete "$INSTDIR\*.*"
Abort
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "Реестр от триальных ключей очищен."
  Delete "$INSTDIR\*.*"
${EndIf}
${If} $0 != 0419
MessageBox MB_YESNO|MB_TOPMOST|MB_USERICON "Wanting to clear the registry of trial keys?" IDYES c IDNO d
Abort
c:
Exec '"$INSTDIR\Registry cleaning.exe"'
  nsExec::Exec '"$INSTDIR\f.bat"'
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "The registry of trial keys is cleared."
d:
  Delete "$INSTDIR\*.*"
Abort
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "The registry of trial keys is cleared."
  Delete "$INSTDIR\*.*"
${EndIf}
SectionEnd


Теперь по порядку.

Registry cleaning.exe" это файл с кодом:
Скрытый текст
Код:

OutFile "Registry cleaning.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

SilentInstall silent
SetCompress off

!include "LogicLib.nsh"

Function .onInit
System::Call "kernel32::GetUserDefaultLCID() i.r0"
IntOp $LANGUAGE $0 & 0xFFFF
IntFmt $0 "%04X" $0
FunctionEnd

Section
${If} $0 = 0419
${MsgBoxTimeout} "Процес очистки закончится через несколько секунд." "Registry cleaning" 2500
${EndIf}
${If} $0 != 0419
${MsgBoxTimeout} "The cleaning process will end in a few seconds." "Registry cleaning" 2500
${EndIf}
SectionEnd


Файлы TrashRegFull.exe и TrashRegX64Full.exe - это "вылеченные" TrashReg, чтобы могла работать в форсированом, скрытом режиме.
Файлы ACL.TXT и ACLL.TXT - это получение прав владельца на ключ реестра с использованием встроенной команды REGINI.
Файлы - mntemp и linjqbyk.kfl один из многих видов защиты Гаврилы.
Файл f.bat - это батник с таким содержимым:
Скрытый текст
Код:

@echo off
start /wait TrashRegFull.exe /forced
start /wait TrashRegX64Full.exe /forced
REGINI "%temp%\acl.txt"
reg delete "HKEY_LOCAL_MACHINE\SECURITY" /va /f
reg add "HKEY_LOCAL_MACHINE\SECURITY" /v SecFlagsR0E /t reg_dword /d 4294967295 /f
reg add "HKEY_LOCAL_MACHINE\SECURITY" /v SecFlagsR0D /t reg_dword /d 4294967295 /f
REGINI "%temp%\acll.txt"
exit /b


Для чего сделана эта "поделка"?
После применения возобновляется работа Total Uninstall 6.27.0.565 с недоломаным лекарством от RmK-FreE. Лекарству от Jongan тоже в помощь.
Так же попутно очищается реестр от "мусорных" ключей, отвечающих за триальный период многих програм.
Готовая поделка лежит тут - https://www.upload.ee/files/10389548...istry.zip.html
Огромная благодарность всем отозвавшимся на мои просьбы о помощи (начиная с моего первого "помогите" Отправлено: 20:53, 09-08-2015 | #1739)
Так и не осилил "прикрутить" показ иконки в Registry cleaning.exe и избавиться от кнопки ОК. (Так, было бы красивей и практичней, может, кто поможет и в этом), но для начала сойдет и так.

MaGoth 25-08-2019 12:53 2885376

Привет народ, :)
Вообщем, я тут по граблям реестра::

Имеется такой батник:
Код:

reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\Games\Gothic II\System\Spacer.exe" /t REG_SZ /f /d DisableNXShowUI" "HIGHDPIAWARE
Я его прикрутил к инсис в виде такого кода:
Код:

Function DepInstExceptionEx
 
  IfFileExists "$INSTDIR\System\Spacer.exe" 0 +7
    ReadRegStr $R0 HKCU "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\System\Spacer.exe"
    StrCmp $R0 "HIGHDPIAWARE" 0 ACFlagsLayers
    DeleteRegValue HKCU "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\System\Spacer.exe"
    WriteRegStr HKCU "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\System\Spacer.exe" "DisableNXShowUI"
    StrCpy $R0 0
FunctionEnd

который толком не работает, из этого вопросы::
1. как поправить код в нсис чтобы работало на осях Вынь ХР ... Вынь 10 ?
2. если код в нсис не поправить, то как передать из скрипта путь игры расположенный на компе клиента ?
3. или есть какой может вариант как батник поправить, тога бы его в тихом режиме запускать без вывода окон и прочей ереси.. ?
4. код батника из скрипта запускать напрямую можно вообще ?!
Спасибо ,)

динозавра 26-08-2019 08:35 2885447

Цитата:

Цитата MaGoth
Имеется такой батник: »

Если я правильно понял, то ваш батник попросту добавляет в реестр:
параметр C:\Games\Gothic II\System\Spacer.exe тип REG_SZ с данными DisableNXShowUI" "HIGHDPIAWARE
Какие то данные странные DisableNXShowUI" "HIGHDPIAWARE , но это вы их так написали.
То тогда, вот ваш батник без запроса:
Код:

@echo off
reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\Games\Gothic II\System\Spacer.exe" /d DisableNXShowUI" "HIGHDPIAWARE /f
exit /b

Как раз несколько постов назад MKN и iglezz мне объясняли команду, которая делает запуск батника в NSIS невидимым:
Код:

nsExec::Exec '"$INSTDIR\1.bat"'
А добавление вашего параметра в реестр в NSIS выглядит примерно так: (но не уверен с кавычками в данные).
Код:

OutFile "HKCU.exe"
SilentInstall silent
Section
WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "C:\Games\Gothic II\System\Spacer.exe" "DisableNXShowUI HIGHDPIAWARE"
SectionEnd

Или вы не это спрашивали?

MaGoth 27-08-2019 10:55 2885591

Цитата:

Цитата динозавра
Если я правильно понял, то ваш батник попросту добавляет в реестр:
параметр C:\Games\Gothic II\System\Spacer.exe тип REG_SZ с данными DisableNXShowUI" "HIGHDPIAWARE
Какие то данные странные DisableNXShowUI" "HIGHDPIAWARE , но это вы их так написали.
То тогда, вот ваш батник без запроса: »

Да, правильно.. нормальные там данные, параметры ДЕПа и фикса высоких разрешений.. )

Цитата:

Цитата динозавра
Как раз несколько постов назад MKN и iglezz мне объясняли команду, которая делает запуск батника в NSIS невидимым: »

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

Цитата:

Цитата динозавра
Или вы не это спрашивали? »

От части, но я уже сам разобрался со всем с этим. У меня почему-то ни как не хотели прописываться в реестр эти значения на Вынь 10 при установке, хотя на моей ХР все работало отлично.. Пришлось разгружать проверки и переписывать иначе код и пути ко всему для этого дела. Возможно то был какой-то локальный баг моего старого юникодного НСИС ?! хз..

Iska 27-08-2019 16:30 2885642

Цитата:

Цитата MaGoth
У меня почему-то ни как не хотели прописываться в реестр эти значения на Вынь 10 при установке, хотя на моей ХР все работало отлично.. »

А Вы учитываете возможную разницу при работе между XP, которая наверняка была x86, и Windows 10, которая, возможно, была x64?

MaGoth 28-08-2019 23:23 2885794

Цитата:

Цитата Iska
А Вы учитываете возможную разницу при работе между XP, которая наверняка была x86, и Windows 10, которая, возможно, была x64? »

А что там учитывать-то ? разрядность Оси в моем случае никакого значения не играет, не говоря уже о том, что те функции для работы с реестрам которые использовались, до ужаса банальны.. а не от расчетов ракетостроения.. )

динозавра 14-09-2019 12:58 2887909

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

Begin2Fly 14-09-2019 13:54 2887917

динозавра, для этого можно воспользоваться плагином nsisxml.

динозавра 14-09-2019 14:52 2887926

Begin2Fly,
Спасибо, но я не нашел ни одного примера использования, когда в строке файла .xml , в которой есть число (неизвестное) нужно поменять одну любую цифру на случайную или как крайний вариант на заданную.
Нужно видимо как то ко всему непонятному прикручивать генераторы случайных чисел, а я в этом плагине и прикрутке генераторов полный дуб.
Короче для меня это не реально. Я по своей наивности думал, что есть какая то простая функция типа, если в строке найдена цифра к примеру 5, то заменить на, к примеру 6 или другое, если не найдена , то искать к примеру 6 и если найдена, то заменить на 7 или любое другое. Больше думаю не нужно, их там в файле аж 24.
Это строка <Data key="TrialSerialNumber">745920021237495069785432(это чисо на каждом компе разное)</Data> в файле application.xml что с акробата C:\Program Files (x86)\Adobe\Acrobat DC\Acrobat\AMT
Хотел состряпать фикс для акробат. Там нужно добавить в реестр, применить патч и поправить фай(сбросить окончание триала). Первое и второе сделал а править файл для меня темный лес.

Iska 14-09-2019 15:29 2887933

динозавра, вообще-то, xml-файл не имеет понятия «строка». Есть понятия разметка, тэг, атрибут, значение атрибута и т.п.

Цитата:

Цитата динозавра
Короче для меня это не реально. Я по своей наивности думал, »

Описываете здесь полное техзадание (не забыв упаковать образец полного файла в архив и приложить к сообщению) и ждёте.

динозавра 14-09-2019 16:44 2887941

Вложений: 1
Задача такая (машинный перевод) :
вам нужно будет отредактировать файл "application.xml", который находится в папке
C: \ Program Files (x86) \ Adobe \ Acrobat DC \ Acrobat \ AMT
измените любую цифру в поле <Data key = "TrialSerialNumber"> xxxxxxxxxxxx '
Оригинал текста тут http://w10.monkrus.ws/2019/08/adobe-...191220040.html
Только вот эти файлы на разных компах отличаются датой установки, местом установки может еще чем.
Отсюда и проблема, что нужно "изменить только одну любую цифру в поле <Data key = "TrialSerialNumber"> xxxxxxxxxxxx '", чтобы не изменился сам файл, ну, как бы так, если бы это было сделано вручную.

iglezz 14-09-2019 20:57 2887978

динозавра,
Вариант с изменением последней цифры
Скрытый текст
Код:

;Using https://nsis.sourceforge.io/NsisXML_plug-in_(by_Wizou)

Name "nsisXML-acrobat-example"
OutFile "nsisXML-acrobat-example.exe"

ShowInstDetails show
AutoCloseWindow false
SetOverwrite on
RequestExecutionLevel user

Page instfiles

Section ""
        nsisXML::create
        nsisXML::load "$EXEDIR\application.xml"
        nsisXML::select '/Configuration/Other/Data[@key="TrialSerialNumber"]'
        nsisXML::getText
        DetailPrint "get: $3"
       
;        Отрезаем в R1 всю строку без последней цифры
        StrCpy $R1 $3 -1

;        Отрезаем в R0 последнюю цифру
        StrCpy $R0 $3 "" -1

;        Увеличиваеи значение на 1
        IntOp $R0 $R0 + 1

;        Проверяем: если R0 равно 10, то записываем в R0 = 0
        StrCmp $R0 10 0 +2
        StrCpy $R0 0

;        Подклеиваем к R1 новое значение R0
        StrCpy $R1 "$R1$R0"
       
        DetailPrint "<: $3"
        DetailPrint ">: $R1"
       
        nsisXML::setText $R1
        nsisXML::save "$EXEDIR\application-new.xml"
SectionEnd


динозавра 18-09-2019 09:48 2888429

iglezz,
Огромное спасибо. Это именно то, что я просил. Меняется одна цифра. Просто супер!

динозавра 18-09-2019 16:50 2888479

Все удалил по причине нарушения ОПК п.3.18

Iska 18-09-2019 17:51 2888492

динозавра, Вы бы с этим поосторожнее. Вы вообще в курсе существования ОПК п.3.18?

динозавра 18-09-2019 17:58 2888494

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

iglezz 18-09-2019 18:16 2888496

динозавра, Самостоятельно можно отредактировать сообщение.

По самому коду:

Подобные многократно повторяющиеся конструкции поддерживать -- самому себе лишняя работа при дальнейших модификациях плюс прямая дорога к ошибкам.

1. Код языка записывается в регистр $0 в функции .onInit, а читается в секции. По пути $0 может многократно измениться

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

Var RunParamVar

Function .onInit
        ${GetParameters} $RunParamVar
        ClearErrors
        ${GetOptions} $RunParamVar "/S" $1
        IfErrors skip_check_param_S 0
                SetSilent silent
        skip_check_param_S:
       
        IfSilent do_some_work 0
        System::Call "kernel32::GetUserDefaultLCID() i.r0"
        IntOp $LANGUAGE $0 & 0xFFFF
        IntFmt $0 "%04X" $0

        ${If} $0 = 0419
                StrCpy $msgbox_ask_text "rus text"
                StrCpy $msgbox_completed_text "rus text"
        ${ElseIf} $0 = 0422
                StrCpy $msgbox_ask_text "ukr text"
                StrCpy $msgbox_completed_text "ukr text"
        ${Else}
                StrCpy $msgbox_ask_text "english text"
                StrCpy $msgbox_completed_text "english text"
        ${EndIf}
       
        MessageBox MB_YESNO|MB_TOPMOST|MB_USERICON "$msgbox_ask_text" IDYES +2 IDNO 0
        Abort

        do_some_work:
        Call MainInstructionsFunc

        IfSilent +2 0
        MessageBox MB_OK|MB_TOPMOST|MB_USERICON " $msgbox_completed_text"
FunctionEnd

Function MainInstructionsFunc
        .....
        рабочая часть скрипта
        .....
FunctionEnd



Или использовать
Код:

LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Ukrainian.nlf"

LangString VarName1 ${LANG_ENGLISH} "eng text"
LangString VarName1 ${LANG_RUSSIAN} "rus text"
LangString VarName1 ${LANG_UKRAINIAN} "ukr text"
.......

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

4. DetailPrint из моего примера можно было и удалить :)

K.A.V. 18-09-2019 19:08 2888502

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

Код:

${If} ${RunningX64}
  SetRegView 64
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\WOW6432Node\Adobe\Adobe Acrobat\DC\Activation" "IsAMTEnforced" 0x1
${Else}
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Adobe\Adobe Acrobat\DC\Activation" "IsAMTEnforced" 0x1
${EndIf}

А зачем вам команда SetRegView, если вы принудительно ветку прописываете? Могу скромно посоветовать сразу приучаться писать "логичный код", когда будут у вас скрипты большие, потом придётся переучиваться/переписывать и копаться в лишних строках.
SetRegView как раз нужна для того, чтобы скрипт сам определял, в какую ветку будет записывать данные, таким образом можно избавиться от лишних строк в коде.

либо так (без SetRegView):
Код:

${If} ${RunningX64}
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\WOW6432Node\Adobe\Adobe Acrobat\DC\Activation" "IsAMTEnforced" 0x1
${Else}
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Adobe\Adobe Acrobat\DC\Activation" "IsAMTEnforced" 0x1
${EndIf}

либо так:
Код:

${If} ${RunningX64}
SetRegView 32 ; переключаем на запись в WOW6432Node раздел
${EndIf}
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Adobe\Adobe Acrobat\DC\Activation" "IsAMTEnforced" 0x1

Но в последнем случае, вам придётся постоянно мучать команду SetRegView, если хотите постоянно писать в разные разделы "на автомате", тут уже смотря от проекта
Вообще, если нет надобности постоянно писать в разные разделы, то лучше бы при запуске определиться с командой SetRegView...Так вы сами себя избавите в дальнейшем как минимум от лишних конструкций с ${If}

динозавра 19-09-2019 16:12 2888627

Цитата:

iglezz,
По самому коду
Моей благодарности нету границ. Буду опробывать..... Но, ведь тогда не было вас, чтобы мне помочь http://forum.oszone.net/post-2857985-2254.html , и, если вы прочтете все дальнейшие решения начиная с сообщения 2254 , то они свелись к ссылке на "чужой" сайт, чем я воспользовался и оттуда взял примеры.
Цитата:

K.A.V.,
но начиная читать код сразу меня остановил вот этот кусок
Огромное спасибо за дополнительные решения.
Я тогда (очень давно) строго воспользовался вашей инструкцией и не отступал ни на децл http://forum.oszone.net/post-2541218-1741.html и дальнейшее после сообщения 1740

f0r_ce 30-09-2019 06:39 2890149

Исходные данные: дан список

string1
string2
string3
string4

Как выбрать из этого списка рандомно, одну из строк и записать в переменную?

StrCry "$1" string?

K.A.V. 30-09-2019 08:24 2890156

f0r_ce, какой ответ вы хотите получить с таким вопросом?
Цитата:

Цитата f0r_ce
Исходные данные: дан список
string1
string2
string3
string4 »

Откуда список? В каком он в формате? Список в элементе управления (List/TreeView, Combobox и т.д.) или в текстовом файле?

f0r_ce 30-09-2019 10:18 2890168

K.A.V., список там же в скрипте

StrCry $1 string1
StrCry $2 string2
StrCry $3 string3
StrCry $4 string4

Далее выбор рандомно одну из них и заносим в переменную

StrCry "$5" string(?)

iglezz 30-09-2019 10:21 2890169

f0r_ce,
NsRandom, StdUtils

f0r_ce 30-09-2019 10:46 2890173

iglezz, StdUtils работает только с числами, строки не рандомит, NsRandom тоже.

iglezz 30-09-2019 11:10 2890175

f0r_ce, Понятное дело, самое интересное - получить строку относительно её номера.
Например так

Код грязноват ибо не заботится о перезаписи переменных
Код:

Name "RandomStringTest"
OutFile "RandomStringTest.exe"
ShowInstDetails show
AutoCloseWindow false
RequestExecutionLevel user
Page instfiles

Section ""
        StrCpy $0 string0
        StrCpy $1 string1
        StrCpy $2 string2
        StrCpy $3 string3
       
        DetailPrint "input 0 = $0"
        DetailPrint "input 1 = $1"
        DetailPrint "input 2 = $2"
        DetailPrint "input 3 = $3"
       
        Push $0
        Push $1
        Push $2
        Push $3

        Push 4 ; (число строк)
        nsRandom::GetRandom
        Pop $R0 ; random 0 <= N < 4)
       
        DetailPrint "random = $R0"
       
        StrCpy $R1 3
       
        loop:
        IntCmp $R1 0 0 exitloop 0
        IntCmp $R0 $R1 0 +2 +2
                Exch $5
        Pop $4
        IntOp $R1 $R1 - 1
        Goto loop
        exitloop:
       
        DetailPrint "result = $5"
        DetailPrint " "
       
SectionEnd



Более корректный вариант, оформлен как функция:
Скрытый текст

Код:

Name "RandomStringTesFunc"
OutFile "RandomStringTesFunc.exe"
ShowInstDetails show
AutoCloseWindow false
RequestExecutionLevel user
Page instfiles

Section ""
        StrCpy $R0 0
        LoopS:
                Push string1
                Push string2
                Push string3
                Push string4
                Push string5
                Push 5
                Call GetRandomString
                Pop $0
               
                DetailPrint "result = $0"
               
                IntOp $R0 $R0 + 1
                InTCmp $R0 20 +2 0
                Goto LoopS
SectionEnd


Function GetRandomString
        Exch $0 ; stack size input for nsRandom::GetRandom
        Push $1 ; stack size, counts from zero
        Push $2 ; temp
        Push $3 ; output string
       
        IntOp $1 $0 - 1
       
        Push $0
        nsRandom::GetRandom
        Pop $0 ; get random (0 <= $0 <= $1)
       
        loop:
                IntCmp $1 0 0 exitloop 0
                Exch 4
                IntCmp $0 $1 0 +3 +3
                        Pop $3
                        Goto +2
                Pop $2
                Exch
                Exch 2
                Exch 3
                IntOp $1 $1 - 1
                Goto loop
        exitloop:
       
        Exch 3
        Pop $0
        Pop $2
        Pop $1
        Exch $3
FunctionEnd


MKN 30-09-2019 18:34 2890264

Можно ещё проще генерить рандомное число номера переменной в коде:
Пример - до 20 :
Код:

OutFile RandomTest.exe

Function Random
Exch $0
Push $1
System::Call 'kernel32::QueryPerformanceCounter(*l.r1)'
System::Int64Op $1 % $0
Pop $0
Pop $1
Exch $0
FunctionEnd

Section
Push 20
call Random
Pop $0
MessageBox MB_OK "Random $0"
SectionEnd


iglezz 01-10-2019 11:19 2890348

AlekseyPopovv,
Код:

${GetOptions} "$CMDLINE" "/U=" $R0
${If} $R0 == 1

Заменить на
Код:

${GetOptions} "$CMDLINE" "/U" $R0
${IfNot} ${Errors}


AlekseyPopovv 01-10-2019 11:28 2890350

iglezz,
Ага, въехал...

А как сделать что бы инсталлятор нельзя было открыть в 7z?
Можно в личку.

AlekseyPopovv 04-10-2019 17:59 2890714

Как создать MUI_PAGE_DIRECTORY custom?
И как задать разные InstallDir для обычной и портативной версий?

K.A.V. 04-10-2019 18:20 2890719

Цитата:

Цитата AlekseyPopovv
Как создать MUI_PAGE_DIRECTORY custom? »

Справочник по NSIS => Описания плагинов => nsDialogs: Создаем собственные страницы инсталлятора

Цитата:

Цитата AlekseyPopovv
И как задать разные InstallDir для обычной и портативной версий? »

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

AlekseyPopovv 04-10-2019 18:42 2890725

Цитата:

Цитата K.A.V.
в любой момент назначением переменной $INSTDIR »

А как быть с выбором папки на MUI_PAGE_DIRECTORY? По умолчанию обычная и портативная предлагают установку в $PROGRAMFILES\${APP} (InstallDir "$PROGRAMFILES\${APP}"), а хотелось бы портативную в $EXEDIR\${APP} Portable.

K.A.V. 04-10-2019 19:33 2890729

Цитата:

Цитата AlekseyPopovv
А как быть с выбором папки на MUI_PAGE_DIRECTORY? По умолчанию обычная и портативная предлагают установку в $PROGRAMFILES\${APP} (InstallDir "$PROGRAMFILES\${APP}"), а хотелось бы портативную в $EXEDIR\${APP} Portable. »

Так вы дайте больше инфы или кусок своего кода, чтобы мы конкретно подсказали, какие команды вам использовать в коде или, может, сами пример накидаем, сейчас мы в угадайку будем так играть с вами, я же не знаю, как вы пользователю предлагаете сделать выбор:
1) Показать диалог с взаимоисключаемыми секциями
2) На собственной созданной страничке поставили 2 радиобаттона и юзер жмакает тот, который ему нужен (обычная/портативная установки)
3) Или тупо при заапуске показываете мессадж-бокс (сообщение с вопросом "Портативку не желаете?")... :)
4) Если собственная страничка, то чем создаёте? InstallOptions или nsDialogs?

вот как-то так...Ребята, задавайте более конкретные вопросы или сразу кидайте свой код, задаёте размытые вопросы - размытые ответы и получаете...

небольшой пример со стандартными средствами с взаимоисключаемыми компонентами (некрасиво, старо и не модно, мне лень что-то воротить "впустую") :)
Код:


!include "MUI.nsh"
!include "Sections.nsh"
!include "Logiclib.nsh"

!define MUI_COMPONENTSPAGE_SMALLDESC

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
Page custom PageCreate
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"


Name "TESTttt"
OutFile "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.exe"
InstallDir "$TEMP"
ShowInstDetails nevershow

Section "Обычная установка" ID_1
SectionEnd

Section /o "Портативная" ID_2
SectionEnd

Function .onSelChange

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

FunctionEnd

Function .onInit
  StrCpy $1 ${ID_1}
FunctionEnd

Function PageCreate
  SectionGetFlags ${ID_1} $0 ; Получаем флаги секции
  IntOp $0 $0 & ${SF_SELECTED} ; Проверяем, отмеченая ли для установки секция "Обычная установка"
${If} $0 == 1 ; Если $0 = 1, значит секция отмечена для установки
 StrCpy $INSTDIR "$PROGRAMFILES\TEST"
  ${Else}
 StrCpy $INSTDIR "$EXEDIR\TEST"
${EndIf}
FunctionEnd



Section -Post
SectionEnd


AlekseyPopovv 05-10-2019 06:18 2890785

Цитата:

Цитата K.A.V.
Так вы дайте больше инфы или кусок своего кода »

Код:

!include "MUI2.nsh"

Page Custom FnCustPage FnRadioCheck
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "Test"
InstallDir "$TEMP"
OutFile "Test.exe"
ShowInstDetails nevershow

Var Dialog
Var Check
Var Check1
Var CheckBox
Var CheckBox1
Var Radio
Var Radio1
Var RadioButton
Var RadioButton1

Function FnCustPage
  nsDialogs::Create 1018
  Pop $Dialog
 
  ${NSD_CreateRadioButton} 5u 10u 124u 12u "1"
  Pop $RadioButton
  ${NSD_SetState} $RadioButton 1
  ${NSD_OnClick} $RadioButton RadioButton
 
  ${NSD_CreateRadioButton} 5u 22u 124u 12u "1"
  Pop $RadioButton1
  ${NSD_OnClick} $RadioButton1 RadioButton1
 
  ${NSD_CreateCheckBox} 5u 60u 124u 12u "2"
  Pop $CheckBox
  ${NSD_SetState} $CheckBox 1
 
  ${NSD_CreateCheckBox} 5u 72u 124u 12u "2"
  Pop $CheckBox1
  ${NSD_SetState} $CheckBox1 1
  nsDialogs::Show
FunctionEnd

Function Switching
  ${NSD_GetState} $RadioButton $Radio
  ${If} $Radio == 1
    EnableWindow $CheckBox 1
    EnableWindow $CheckBox1 1
    ${NSD_SetState} $CheckBox 1
    ${NSD_SetState} $CheckBox1 1
  ${Else}
    EnableWindow $CheckBox 0
    EnableWindow $CheckBox1 0
    ${NSD_SetState} $CheckBox 0
    ${NSD_SetState} $CheckBox1 0
  ${EndIf}
FunctionEnd

Function RadioButton
  Pop $RadioButton
  Call Switching
FunctionEnd

Function RadioButton1
  Pop $RadioButton1
  Call Switching
FunctionEnd

Function FnRadioCheck
  ${NSD_GetState} $RadioButton $Radio
  ${NSD_GetState} $RadioButton1 $Radio1
  ${NSD_GetState} $CheckBox $Check
  ${NSD_GetState} $CheckBox1 $Check1
FunctionEnd

Section
  ${If} $Radio == 1
DetailPrint ""
StrCpy $INSTDIR "$PROGRAMFILES\Install"
  ${EndIf}
SectionEnd

Section
  ${If} $Radio1 == 1
    DetailPrint ""
    StrCpy $INSTDIR "$EXEDIR\Portable"
  ${EndIf}
SectionEnd

Section
  ${If} $Check == 1
    DetailPrint ""
  ${EndIf}
 
  ${If} $Check1 == 1
    DetailPrint ""
  ${EndIf}
SectionEnd

Чего не хватает?

K.A.V. 05-10-2019 08:31 2890792

AlekseyPopovv, отвечу сразу на вопрос, заданный в личке
При нажатии кнопки "Назад" - у вас диалог заново инициализируется с вашими прописанными состояниями элементов
Соответственно, чтобы сделать более умный диалог, нам нужно код написать таким образом, чтобы он учитывал сей факт, что кто-то нажмёт "Назад" и нам будет необходимо поставить всё так, как выставил пользователь
Для этого, нам нужно сначала в секцию .onInit прописать в переменные, состояние элементов управления по-умолчанию:
Код:

Function .onInit
 StrCpy $Radio 1
 StrCpy $Radio1 0
 StrCpy $Check 1
 StrCpy $Check1 1
FunctionEnd

Затем заменим ваш кусок кода:
Скрытый текст

Код:

Function FnCustPage
  nsDialogs::Create 1018
  Pop $Dialog
 
  ${NSD_CreateRadioButton} 5u 10u 124u 12u "1"
  Pop $RadioButton
  ${NSD_SetState} $RadioButton 1
  ${NSD_OnClick} $RadioButton RadioButton
 
  ${NSD_CreateRadioButton} 5u 22u 124u 12u "1"
  Pop $RadioButton1
  ${NSD_OnClick} $RadioButton1 RadioButton1
 
  ${NSD_CreateCheckBox} 5u 60u 124u 12u "2"
  Pop $CheckBox
  ${NSD_SetState} $CheckBox 1
 
  ${NSD_CreateCheckBox} 5u 72u 124u 12u "2"
  Pop $CheckBox1
  ${NSD_SetState} $CheckBox1 1
  nsDialogs::Show
FunctionEnd


Этим:
Скрытый текст

Код:

Function FnCustPage
  nsDialogs::Create 1018
  Pop $Dialog

  ${NSD_CreateRadioButton} 5u 10u 124u 12u "1"
  Pop $RadioButton
  ${NSD_SetState} $RadioButton $Radio ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
  ${NSD_OnClick} $RadioButton RadioButton

  ${NSD_CreateRadioButton} 5u 22u 124u 12u "1"
  Pop $RadioButton1
  ${NSD_SetState} $RadioButton1 $Radio1 ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
  ${NSD_OnClick} $RadioButton1 RadioButton1

  ${NSD_CreateCheckBox} 5u 60u 124u 12u "2"
  Pop $CheckBox
  ${NSD_SetState} $CheckBox $Check ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit

  ${NSD_CreateCheckBox} 5u 72u 124u 12u "2"
  Pop $CheckBox1
  ${NSD_SetState} $CheckBox1 $Check1 ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit

  EnableWindow $CheckBox $Radio ; Активируем/деактивируем чекбокс из значения радиобаттона
  EnableWindow $CheckBox1 $Radio ; Активируем/деактивируем чекбокс1 исходя из значения радиобаттона

  nsDialogs::Show
FunctionEnd



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

Далее заменим
Код:

Function Switching
  ${NSD_GetState} $RadioButton $Radio
  ${If} $Radio == 1
    EnableWindow $CheckBox 1
    EnableWindow $CheckBox1 1
    ${NSD_SetState} $CheckBox 1
    ${NSD_SetState} $CheckBox1 1
  ${Else}
    EnableWindow $CheckBox 0
    EnableWindow $CheckBox1 0
    ${NSD_SetState} $CheckBox 0
    ${NSD_SetState} $CheckBox1 0
  ${EndIf}
FunctionEnd

на
Код:

Function Switching
  ${NSD_GetState} $RadioButton $Radio  ; Получаем статус радиобаттона
    EnableWindow $CheckBox $Radio ; и используем это значение для активации/деактивации элементов
    EnableWindow $CheckBox1 $Radio ; и используем это значение для активации/деактивации элементов
    ${NSD_SetState} $CheckBox $Radio ; и используем это значение для назначения статуса чекбоксу
    ${NSD_SetState} $CheckBox1 $Radio ; и используем это значение для назначения статуса чекбоксу
FunctionEnd

так мы сделаем код более компактным, функционал остаётся тот же ;)

Теперь о том, чего не хватает
У вас переназначение $INSTDIR прописано в секции, это неправильно, т.к. секции обрабатываются непосредственно при начале установки в
Код:

!insertmacro MUI_PAGE_INSTFILES
соответственно, нам нужно переназначать $INSTDIR до появления диалога выбора директории установки
Код:

!insertmacro MUI_PAGE_DIRECTORY
Поэтому можно просто в конец функции FnCustPage прописать то, что нам нужно:
Код:

${If} $Radio == 1
  StrCpy $INSTDIR "$PROGRAMFILES\Install"
  DetailPrint "Папка установки: $INSTDIR"
${Else}
  StrCpy $INSTDIR "$EXEDIR\Portable"
  DetailPrint "Папка установки: $INSTDIR"
${EndIf}

Не обязательно проверять статус двух взаимоисключающих радиобаттанов, как это у вас прописано:
Код:

Section
  ${If} $Radio == 1
DetailPrint ""
StrCpy $INSTDIR "$PROGRAMFILES\Install"
  ${EndIf}
SectionEnd

Section
  ${If} $Radio1 == 1
    DetailPrint ""
    StrCpy $INSTDIR "$EXEDIR\Portable"
  ${EndIf}
SectionEnd

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

Готовый вариант вашего кода

Код:

!include "MUI2.nsh"

Page Custom FnCustPage FnRadioCheck
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "Test"
InstallDir "$TEMP"
OutFile "Test.exe"
ShowInstDetails nevershow

Var Dialog
Var Check
Var Check1
Var CheckBox
Var CheckBox1
Var Radio
Var Radio1
Var RadioButton
Var RadioButton1


Function .onInit
 StrCpy $Radio 1
 StrCpy $Radio1 0
 StrCpy $Check 1
 StrCpy $Check1 1
FunctionEnd


Function FnCustPage
  nsDialogs::Create 1018
  Pop $Dialog

  ${NSD_CreateRadioButton} 5u 10u 124u 12u "1"
  Pop $RadioButton
  ${NSD_SetState} $RadioButton $Radio ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
  ${NSD_OnClick} $RadioButton RadioButton

  ${NSD_CreateRadioButton} 5u 22u 124u 12u "1"
  Pop $RadioButton1
  ${NSD_SetState} $RadioButton1 $Radio1 ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
  ${NSD_OnClick} $RadioButton1 RadioButton1

  ${NSD_CreateCheckBox} 5u 60u 124u 12u "2"
  Pop $CheckBox
  ${NSD_SetState} $CheckBox $Check ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit

  ${NSD_CreateCheckBox} 5u 72u 124u 12u "2"
  Pop $CheckBox1
  ${NSD_SetState} $CheckBox1 $Check1 ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit

  EnableWindow $CheckBox $Radio ; Активируем/деактивируем чекбокс из значения радиобаттона
  EnableWindow $CheckBox1 $Radio ; Активируем/деактивируем чекбокс1 исходя из значения радиобаттона

  nsDialogs::Show
 
${If} $Radio == 1
  StrCpy $INSTDIR "$PROGRAMFILES\Install"
  DetailPrint "Папка установки: $INSTDIR"
${Else}
  StrCpy $INSTDIR "$EXEDIR\Portable"
  DetailPrint "Папка установки: $INSTDIR"
${EndIf}
FunctionEnd

Function Switching
  ${NSD_GetState} $RadioButton $Radio  ; Получаем статус радиобаттона
    EnableWindow $CheckBox $Radio ; и используем это значение для активации/деактивации элементов
    EnableWindow $CheckBox1 $Radio ; и используем это значение для активации/деактивации элементов
    ${NSD_SetState} $CheckBox $Radio ; и используем это значение для назначения статуса чекбоксу
    ${NSD_SetState} $CheckBox1 $Radio ; и используем это значение для назначения статуса чекбоксу
FunctionEnd

Function RadioButton
  Pop $RadioButton
  Call Switching
FunctionEnd

Function RadioButton1
  Pop $RadioButton1
  Call Switching
FunctionEnd

Function FnRadioCheck
  ${NSD_GetState} $RadioButton $Radio
  ${NSD_GetState} $RadioButton1 $Radio1
  ${NSD_GetState} $CheckBox $Check
  ${NSD_GetState} $CheckBox1 $Check1
FunctionEnd

Section
  ${If} $Check == 1
    DetailPrint ""
  ${EndIf}

  ${If} $Check1 == 1
    DetailPrint ""
  ${EndIf}
SectionEnd


AlekseyPopovv 05-10-2019 11:29 2890810

K.A.V., Как добавить картинки .bmp на каждый буттон?
Код:

  ${NSD_CreateBitmap} 150u 3u 100% 100% ""
  Pop $Image
  ${NSD_SetImage} $Image "$PLUGINSDIR\1.bmp" $ImageHandle
  nsDialogs::Show
  ${NSD_FreeImage} $ImageHandle


K.A.V. 06-10-2019 08:22 2890905

AlekseyPopovv, если вы именно про то, чтобы заменить стиль квадратика галочки - то я не знаю, возможно, это делается только рисованием элемента "вручную" через стиль BS_OWNERDRAW
Может здесь кто таким вопросом озадачивался, подскажет

AlekseyPopovv 06-10-2019 08:25 2890908

K.A.V., нет, я про картинки которые меняются при выборе "Установка" или "Распаковка".
Как здесь

K.A.V. 06-10-2019 08:53 2890911

AlekseyPopovv, перед:
Код:

nsDialogs::Show
добавьте
Код:

  ${NSD_CreateBitmap} 150u 3u 100% 100% ""
  Pop $Image
  call SwitchImage

и в функцию Switching добавьте:
Код:

Function Switching
  ${NSD_GetState} $RadioButton $Radio  ; Получаем статус радиобаттона
    EnableWindow $CheckBox $Radio ; и используем это значение для активации/деактивации элементов
    EnableWindow $CheckBox1 $Radio ; и используем это значение для активации/деактивации элементов
    ${NSD_SetState} $CheckBox $Radio ; и используем это значение для назначения статуса чекбоксу
    ${NSD_SetState} $CheckBox1 $Radio ; и используем это значение для назначения статуса чекбоксу
    call FnRadioCheck
    call SwitchImage  ; вызов функции по смене изображения в зависимости от установки
FunctionEnd

и саму функцию по смене изображения добавьте:
Код:

Function SwitchImage
 ${If} $Radio == 1
  ${NSD_SetImage} $Image "ПУТЬ_К_ФАЙЛУ_ОБЫЧНАЯ_УСТАНОВКА\1.bmp" $ImageHandle
 ${Else}
  ${NSD_SetImage} $Image "ПУТЬ_К_ФАЙЛУ_ПОРТАТИВНАЯ_УСТАНОВКА\2.bmp" $ImageHandle
 ${EndIf}
FunctionEnd


AlekseyPopovv 06-10-2019 09:59 2890916

K.A.V., Как пропустить (не показывать) страницу, если нет определённого параметра? И как назад?
Сделал так: :lamer:
Код:

StrCmp $R0 0 0 +50

K.A.V. 06-10-2019 11:12 2890930

Цитата:

Цитата AlekseyPopovv
K.A.V., Как пропустить (не показывать) страницу, если нет определённого параметра? И как назад?
Сделал так:
Код: Выделить весь код
StrCmp $R0 0 0 +50 »

:o
раз уж решились кодить на NSIS, почитайте тогда, как минимум, наш Справочник по NSIS, в разделе "Статьи" для начала откройте для себя "метки", прочитав страничку "Labels: Метки, безусловные переходы", чтобы как минимум такой кошмар в коде не делать:
Цитата:

Цитата AlekseyPopovv
StrCmp $R0 0 0 +50 »

потом забудете про это "+50" и будете голову ломать, почему у вас скрипт не работает после каких-то доработок

iglezz 06-10-2019 11:18 2890932

Цитата:

Цитата AlekseyPopovv
Как пропустить (не показывать) страницу, если нет определённого параметра? И как назад »

Читать справку 4.5.3 Callbacks.
Пример
Код:

Name "CallbackExampleSkipPage"
OutFile "CallbackExampleSkipPage.exe"

ShowInstDetails show
AutoCloseWindow false
RequestExecutionLevel user

Page components
Page directory dirPagePre
Page instfiles

Section "Install"
        DetailPrint "Doing some stuff..."
SectionEnd

Section /o "Skip Directory Page" secDir
SectionEnd

Function dirPagePre
        SectionGetFlags ${secDir} $1
        IntOp $1 $1 << 7
        StrCmp $1 128 0 +2
        Abort
FunctionEnd


AlekseyPopovv 06-10-2019 11:23 2890933

K.A.V., Я уже давненько пишу на NSIS, но редко, в основном портативные версии. Там таких "запар" с созданием страниц и т.д. нет. Спасибо за помощь. :yahoo:

iglezz, Сейчас попробую, а то забыл уже сколько строк добавил, опять заново считать. :shocked:

AlekseyPopovv 06-10-2019 16:51 2890965

Как на "UnInstallBtn" назначить функцию на кастомной странице? Пример бы какой ни будь.
У меня все кнопки делают одно и тоже действие почему то...

iglezz 06-10-2019 16:59 2890968

Цитата:

Цитата AlekseyPopovv
Как на "UnInstallBtn" назначить функцию на кастомной странице? Пример бы какой ни будь. »

А где код, в котором этот "UnInstallBtn"?

AlekseyPopovv 06-10-2019 17:01 2890969

Так нет его, только это:
${NSD_SetText} $0 "$(^UnInstallBtn)"

iglezz 06-10-2019 17:10 2890973

Внимательное чтение ${NSISDIR}\Docs\nsDialogs\Readme.html подскажет верный ответ.
Что-то в духе
Код:

${NSD_OnClick} $0 ИмяФункции

AlekseyPopovv 10-10-2019 06:07 2891411

Как сделать, что бы при выборе папки установки дописывалась папка приложения?
Пример: "C:\Program Files\Proga\", а не так "C:\Program Files".
Как удалить пустую папку при закрытии инсталлятора или при нажатии кнопки отмена?

iglezz 10-10-2019 08:21 2891415

Цитата:

Цитата AlekseyPopovv
Как сделать, что бы при выборе папки установки дописывалась папка приложения?
Пример: "C:\Program Files\Proga\", а не так "C:\Program Files". »

В зависимости от того, о каком сценарии идет
Это может быть
InstallDir "$PROGRAMFILES\Proga"
или
StrCpy $INSTDIR "$INSTDIR\Proga"
или
SetOutPath "$INSTDIR\Proga"

Цитата:

Цитата AlekseyPopovv
Как удалить пустую папку при закрытии инсталлятора или при нажатии кнопки отмена? »

RMDir "FOLDERNAME"
Подробности в справке

K.A.V. 10-10-2019 15:17 2891501

Цитата:

Цитата AlekseyPopovv
Как удалить пустую папку при закрытии инсталлятора »

Упорно сопротивляетесь к чтению справочника
Код:

Function .onGUIEnd
 RMDIR /r "путь_к_папке"
FunctionEnd

Цитата:

Цитата AlekseyPopovv
или при нажатии кнопки отмена? »

Код:

!define MUI_CUSTOMFUNCTION_ABORT custom_abort
Код:

Function custom_abort
 MessageBox MB_YESNO|MB_ICONQUESTION "Отменить установку?" IDYES +2
 abort
 RMDIR /r "путь_к_папке"
FunctionEnd


AlekseyPopovv 10-10-2019 15:25 2891503

K.A.V., Спасибо, сам разобрался... Вроде всё сделал как хочется. Теперь осталось добавить ключи тихой установки. Это тёмный лес для меня... :closed-to

K.A.V., Не разобрался...
Код:

Function Button
${If} $Radio == 1
  Pop $Button
  nsDialogs::SelectFolderDialog "Выберите папку для установки:" "$INSTDIR"
  Pop "$INSTDIR"
  ${If} "$INSTDIR" != error
      ${NSD_SetText} $Text3 "$INSTDIR\${APP}"
  ${EndIf}
${EndIf}
FunctionEnd

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

K.A.V. 10-10-2019 16:51 2891524

Цитата:

Цитата AlekseyPopovv
что бы при нажатии на кнопку "Обзор..." создавалась папка (что бы в проводнике была выбрана она) »

Перед
Код:

nsDialogs::SelectFolderDialog
добавить команду на создание папки...

Цитата:

Цитата AlekseyPopovv
и при нажатии отмена она удалялась »

При нажатии "отмена" в nsDialogs::SelectFolderDialog??
У вас же там написано условие, если error => то пользователь отменил выбор, значит в этом участке прописать удаление папки...

AlekseyPopovv 10-10-2019 16:54 2891525

K.A.V., Я так делал, если выбрать и отменить, то всё работает, если выбор нажать опять, то папка не успевает создаваться и список сбрасывается.
При нажатии ок всё чётко.

K.A.V. 10-10-2019 16:59 2891528

Цитата:

Цитата AlekseyPopovv
Теперь осталось добавить ключи тихой установки. Это тёмный лес для меня... »

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

По вашему вопросу:
GetParameters
GetOptions


Цитата:

Цитата AlekseyPopovv
папка не успевает создаваться »

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

AlekseyPopovv 10-10-2019 17:12 2891533

Ставил Sleep 500, не идёт. При нажатии ок всё хорошо, создаётся и удаляется, при нажатии отмена первый раз всё как надо, если выбирать второй раз, то всё, скидывает на папку "Мои документы".
Буду думать...

K.A.V. 10-10-2019 17:26 2891536

Цитата:

Цитата AlekseyPopovv
Буду думать... »

Вы внимательнее смотрите на свой код, вы используете $INSTDIR как переменную для возвращаемого значения плагином nsDialogs, соответственно, если вы жмёте "отмена", то в $INSTDIR помещается значение error
Потом вы опять хотите показать этот диалог и ставите папкой по-умолчанию значение $INSTDIR, которое при втором вызове после "отмены" содержит возвращаемое значение после предыдущей отмены, т.е. error

AlekseyPopovv 10-10-2019 17:29 2891539

Так я и не пойму.
Я убирал эти строки, результат тот же:
Код:

${If} "$INSTDIR" != error
      ${NSD_SetText} $Text3 "$INSTDIR\${APP}"
  ${EndIf}


K.A.V. 10-10-2019 17:35 2891541

Не используйте $INSTDIR как переменную для возвращаемых значений и будет вам счастье
У вас же есть $0-$9, $R0-R9...

Код:

Function Button
${If} $Radio == 1
  Pop $Button
  nsDialogs::SelectFolderDialog "Выберите папку для установки:" "$INSTDIR"
  Pop $0
  ${If} $0 != error
      ${NSD_SetText} $Text3 "$0\${APP}"
      StrCpy $INSTDIR "$0\${APP}"
  ${EndIf}
${EndIf}
FunctionEnd


AlekseyPopovv 11-10-2019 14:19 2891663

Как поменять цвет нижней части инсталлятора/деинсталлятора?

MKN 11-10-2019 16:24 2891680

Цитата:

Цитата AlekseyPopovv
Как поменять цвет нижней части инсталлятора/деинсталлятора? »

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

AlekseyPopovv 13-10-2019 20:23 2891937

Как сделать, что бы с ключом /S ни чего не устанавливалось? А с ключом /S /I то что мне нужно. И ключ /D=путь не работает.
Код:

${If} ${Silent}
 ClearErrors
 ${GetOptions} "$CMDLINE" "/I" $R0
 ${IfNot} ${Errors}
 StrCpy $INSTDIR "$PROGRAMFILES\${APP}"
 SetOutPath "$INSTDIR"
 File /r "${APPDIR}\${APP}\*"
 Quit
 ${EndIf}
${EndIf}


iglezz 13-10-2019 20:45 2891939

Цитата:

Цитата AlekseyPopovv
Как сделать, что бы с ключом /S ни чего не устанавливалось? »

В данном случае можно обойтись таким способом:
Код:

${If} ${Silent}
    ClearErrors
    ${GetOptions} "$CMDLINE" "/I" $R0
    ${IfNot} ${Errors}
        StrCpy $INSTDIR "$PROGRAMFILES\${APP}"
        SetOutPath "$INSTDIR"
        File /r "${APPDIR}\${APP}\*"
        Quit
    {Else} ; эта пара строк обеспечит выход
        Quit ; при отсутствии параметра /I
    ${EndIf}
${EndIf}

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

Цитата AlekseyPopovv
И ключ /D=путь не работает. »

Пример нерабочей строки?
Согласно справки (пункт 3.2.1) параметр /D должен быть последним, путь не должен содержать кавычек.
В справке это, вроде бы, не упомянуто: все встроенные параметры пишутся с прописной буквы (/S /D, а не /s /d)

AlekseyPopovv 19-10-2019 14:45 2892749

Цитата:

Цитата iglezz
В данном случае можно обойтись таким способом: »

А как в данном случае? :o
Код:

${If} ${Silent}
ClearErrors
${GetOptions} "$CMDLINE" "/I" $R0
${IfNot} ${Errors}
StrCpy $INSTDIR "$PROGRAMFILES\${APP}"
SetOutPath "$INSTDIR"
File /r "${APPDIR}\${APP}\*"
Quit
${ElseIf} ${Errors}
Quit
${Else}
ClearErrors
${GetOptions} "$CMDLINE" "/P" $R0
${IfNot} ${Errors}
StrCpy $INSTDIR "$EXEDIR\${APP}"
SetOutPath "$INSTDIR"
File /r "${APPDIR}\${APP}\*"
Quit
${ElseIf} ${Errors}
Quit
${Else}
ClearErrors
${EndIf}
${EndIf}
${EndIf}


K.A.V. 19-10-2019 21:28 2892800

Если вам сложно ориентироваться в ${If} конструкциях, то лучше на начальном этапе обойдитесь без них, а когда "набьёте" руку и будете легко накидывать большинство кода - можете попробовать снова осилить конструкции с ${If}
В вашем коде не то, что все ключи будут обработаны, а инсталлятор закроется сразу после запуска с ключем /S (тихая установка), по причине, указанной выше - намудрили с конструкцией.
Для начала могу посоветовать вам форматировать свой код и писать комментарии (в первую очередь для себя), т.к. частенько при больших размерах кода или из-за недостаточного опыта (да и достаточного), можно допускать ошибки и не видеть их у себя под носом (по личному опыту)

Смотрите, как сейчас отрабатывает ваш код (ваша построенная логика):
Запускаем с ключем /S

Есть ключ /I?
Да => Отрабатываю пару команд. Выход из инсталлера
Нет => Выход из инсталлера

До проверки /P ваш код никогда не дойдёт с тихой установкой
Накидаю вам пару одинаковых примеров:

1. Если тихая установка, проверяю наличие сначала ключа I (выполняю команды), затем ключа P (выполняю команды). Если тихая установка, то выход из инсталлера после проверки ключей
Код:

${If} ${Silent}
  ClearErrors
    ${GetOptions} "$CMDLINE" "/I" $R0
        ${IfNot} ${Errors} ; проверка ключа /I
        MessageBox MB_OK "ключ  /I есть"
        ${EndIf}  ; проверка ключа /I завершена
  ClearErrors
    ${GetOptions} "$CMDLINE" "/P" $R0
        ${IfNot} ${Errors}  ; проверка ключа /P
        MessageBox MB_OK "ключ  /P есть"
        ${EndIf} ; проверка ключа /P завершена
Quit
${EndIf} ; проверка на тихую установку завершена

2. То же самое, только без ${If} конструкций
Код:

${If} ${Silent}
ClearErrors
  ${GetOptions} "$CMDLINE" "/I" $R0
  IfErrors noIkey
  MessageBox MB_OK "ключ  /I есть"
noIkey:

ClearErrors
  ${GetOptions} "$CMDLINE" "/P" $R0
  IfErrors noPkey
  MessageBox MB_OK "ключ  /P есть"
noPkey:
Quit
${EndIf} ; проверка на тихую установку завершена

3. То же самое, только без ${If} конструкций и с обёрткой в функции
Код:

${If} ${Silent}
ClearErrors
  ${GetOptions} "$CMDLINE" "/I" $R0
  IfErrors +2
  Call silent_I_key

ClearErrors
  ${GetOptions} "$CMDLINE" "/P" $R0
  IfErrors +2
  Call silent_P_key
Quit
${EndIf} ; проверка на тихую установку завершена

Код:

Function silent_I_key
  MessageBox MB_OK "ключ  /I есть"
FunctionEnd

Function silent_P_key
  MessageBox MB_OK "ключ  /P есть"
FunctionEnd


AlekseyPopovv 20-10-2019 13:48 2892861

Как удалить папку с деинсталлятором из папки $TEMP?

AlekseyPopovv 22-10-2019 19:25 2893129

Мне вот больше всего нравится, что многие знают как защитить инсталлятор от распаковки, т.к. сами этим пользуются. Отправляют искать на просторах интернета, а потом говорят что ты этого ни где не найдёшь, и теперь даже не купишь. Это что, секретная разработка какая то? Или вы это купили по цене квартиры? Прям всё желание отбивает что то писать...

K.A.V. 22-10-2019 20:07 2893131

Цитата:

Цитата AlekseyPopovv
Как удалить папку с деинсталлятором из папки $TEMP? »

Можно воспользоваться ключом "/REBOOTOK" в команде удаления папки/файла, при указании данного ключа и невозможности удаления в момент исполнения инсталлятора, папка/файл будет удалена после перезагрузки Windows
Если нужно удалить без перезагрузки, то можно сделать отдельный EXE, запускать его со своим ключом, передавая полный путь удаляемого файла деинсталлятора.
В коде отдельного EXE, соответственно, нужно будет прочитать значение переданного пути файла деинсталлятора и, поместив в цикл с ожиданием и проверкой существования файла - пытаться удалять файл деинсталлятора
Может есть еще какие более красивые методы, не особо интересовался этим вопросом последние "цать" лет :)

Цитата:

Цитата AlekseyPopovv
Мне вот больше всего нравится, что многие знают как защитить инсталлятор от распаковки, т.к. сами этим пользуются. Отправляют искать на просторах интернета, а потом говорят что ты этого ни где не найдёшь, и теперь даже не купишь. Это что, секретная разработка какая то? Или вы это купили по цене квартиры? Прям всё желание отбивает что то писать... »

Вам пошаговое руководство написать? Люди скрипты на NSIS не все могут писать, а уж писать огромную статью, как пересобрать билд NSIS - ну такое себе...Да и кому это нужно?
В официальной справке есть Appendix G: Building NSIS, это вам поможет вам пересобрать билд.
На вопрос "Как защитить инсталлятор от распаковки" отвечу вам просто: секретной кнопочки нет, которая бы делала это в 1 клик.
Там в исходниках самого NSIS и в заголовочных файлах упаковщиков меняется пара надписей и всё это дело пересобирается. Скажите, лично вы, будете так заморачиваться? Прям вижу, как у вас появилось желание качнуть дистрибутив с исходниками NSIS и какой-нибудь Microsoft Visual C++ 2005...

1. Качаете исходники NSIS
2. Правите нужные файлы в нужных местах
3. Правите файлы заголовочных файлов упаковщиков
4. Собираете свой билд NSIS
5. Его все благополучно вскрывают, т.к. метод всем давно известный
Так какой смысл в этой "защите"?

AlekseyPopovv 22-10-2019 20:13 2893132

Цитата:

Цитата K.A.V.
Можно воспользоваться ключом "/REBOOTOK" »

Так и сделал.
Цитата:

Цитата K.A.V.
5. Его все благополучно вскрывают, т.к. метод всем давно известный »

По ходу мне только одному не известный. :o

AlekseyPopovv 22-10-2019 20:39 2893133

Цитата:

Цитата K.A.V.
Там в исходниках самого NSIS и в заголовочных файлах упаковщиков меняется пара надписей и всё это дело пересобирается. Скажите, лично вы, будете так заморачиваться? Прям вижу, как у вас появилось желание качнуть дистрибутив с исходниками NSIS и какой-нибудь Microsoft Visual C++ 2005... »

Да, придётся заморочиться.
Цитата:

Цитата K.A.V.
Так какой смысл в этой "защите"? »

Я же не могу открыть такие инсталляторы...

habib2302 23-10-2019 09:56 2893169

Цитата:

Цитата AlekseyPopovv
По ходу мне только одному не известный. »

Просто нужно знать в каком месте менять байты через hex редактор

AlekseyPopovv 23-10-2019 20:24 2893271

Цитата:

Цитата K.A.V.
Код:

${If} ${Silent}
 ClearErrors
 ${GetOptions} "$CMDLINE" "/I" $R0
 ${IfNot} ${Errors} ; проверка ключа /I
 MessageBox MB_OK "ключ /I есть"
 ${EndIf} ; проверка ключа /I завершена
 ClearErrors
 ${GetOptions} "$CMDLINE" "/P" $R0
 ${IfNot} ${Errors} ; проверка ключа /P
 MessageBox MB_OK "ключ /P есть"
 ${EndIf} ; проверка ключа /P завершена
Quit
${EndIf} ; проверка на тихую установку завершена

»

Как сюда добавить:
Код:

ClearErrors
    ${GetOptions} "$CMDLINE" "/D=" $R0
      ${IfNot} ${Errors}
      StrCpy $INSTDIR "$R0"
      ${EndIf}

Как сделать что бы с ключом /I создавались ярлыки (по умолчанию), а с ключами /I /Y не создавались?
Скрытый текст
Код:

${If} ${Silent}
  ClearErrors
    ${GetOptions} "$CMDLINE" "/D=" $R0
      ${IfNot} ${Errors}
      StrCpy $INSTDIR "$R0"
      ${EndIf}
  ClearErrors
    ${GetOptions} "$CMDLINE" "/I" $R0
      ${IfNot} ${Errors}
      StrCpy $INSTDIR "$PROGRAMFILES\${APP}"
      SetOutPath "$INSTDIR"
      File /r "${APPDIR}\${APP}\*"
          SetShellVarContext All
          CreateShortCut "$DESKTOP\${APP}.lnk" "$INSTDIR\${APP}.exe"
          CreateDirectory "$SMPROGRAMS\${APP}"
          CreateShortCut "$SMPROGRAMS\${APP}\${APP}.lnk" "$INSTDIR\${APP}.exe"
      ${EndIf}
  ClearErrors
    ${GetOptions} "$CMDLINE" "/Y" $R0
      ${IfNot} ${Errors}
      SetShellVarContext All
      Delete "$DESKTOP\${APP}.lnk"
      ${EndIf}
  ClearErrors
    ${GetOptions} "$CMDLINE" "/T" $R0
      ${IfNot} ${Errors}
      SetShellVarContext All
      Delete "$SMPROGRAMS\${APP}\${APP}.lnk"
      RMDir "$SMPROGRAMS\${APP}"
      ${EndIf}
  ClearErrors
    ${GetOptions} "$CMDLINE" "/P" $R0
      ${IfNot} ${Errors}
      StrCpy $INSTDIR "$EXEDIR\${APP}"
      SetOutPath "$INSTDIR"
      File /r "${APPDIR}\${APP}\*"
      ${EndIf}
Quit
${EndIf}


K.A.V. 24-10-2019 18:38 2893424

AlekseyPopovv, мы уже вам всю обработку с нуля написали, и добавить еще одно условие с ключом /Y - это не сложная задача, учитывая то, как уже разжевана логика проверки ключей+я вам накидал несколько вариантов и пара из них "для новичков" с более простым кодом для понимания.
У меня вот вопрос нарисовывается, а вы вообще пытаетесь вникать в то, что мы тут вам пишем? Или просто копипастите?

AlekseyPopovv 25-10-2019 17:41 2893584

Цитата:

Цитата K.A.V.
и добавить еще одно условие с ключом /Y - это не сложная задача »

Добавить как понятно, а вот как добавить условие в условие мне не понятно. Так же и с ключом "/D=".

Serg866 26-10-2019 00:44 2893630

K.A.V.
Привет
Подскажите, пожалуйста, самый простой способ (без использования winver) определить, что у пользователя установлена Windows10? Может по наличию какого-либо файла, который есть только в Win10?

K.A.V. 26-10-2019 08:25 2893638

Цитата:

Цитата AlekseyPopovv
Как сделать что бы с ключом /I создавались ярлыки (по умолчанию), а с ключами /I /Y не создавались? »

Цитата:

Цитата AlekseyPopovv
а вот как добавить условие в условие мне не понятно »

Создаёте условие проверки существования ключа I
Если ключ есть, то следующий код в условии на проверку ключа I - проверка существования ключа Y
Если ключа Y нет, то создавать ярлыки
Простая логика же. Примеры построения логических конструкций есть в нашем справочнике.

Цитата:

Цитата Serg866
Подскажите, пожалуйста, самый простой способ (без использования winver) определить, что у пользователя установлена Windows10? Может по наличию какого-либо файла, который есть только в Win10? »

А чем, собственно, winver не устраивает? Он вызывает системную функцию GetVersionEx для определения версии системы...
1. Можете проверять версию любого системного файла в папке System32

2. Либо в разделе
Код:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
можете прочитать значения новых DWORD ключей CurrentMajorVersionNumber (10) + CurrentMinorVersionNumber (0), которые появились как раз-таки в Windows 10

AlekseyPopovv 26-10-2019 19:54 2893694

Цитата:

Цитата K.A.V.
Примеры построения логических конструкций есть в нашем справочнике. »

Да, есть такое. С ярлыками разобрался. А как быть с ключом "/D="? Ведь для ключа /I путь StrCpy $INSTDIR "$PROGRAMFILES\${APP}", а для ключа /P путь StrCpy $INSTDIR "$EXEDIR\${APP} Portable".

iglezz 27-10-2019 02:47 2893718

Цитата:

Цитата AlekseyPopovv
А как быть с ключом "/D="? Ведь для ключа /I путь StrCpy $INSTDIR "$PROGRAMFILES\${APP}", а для ключа /P путь StrCpy $INSTDIR "$EXEDIR\${APP} Portable". »

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

Это можно сделать так:
Скрытый текст
Код:

; Создадим константу, которая содержит Путь установки по умолчанию
!define DEFAULT_DIR_INST "$PROGRAMFILES\SomeProgDir"

; Запишем её в атрибут InstallDir. Это будет наш $INSTDIR по умолчанию
InstallDir "${DEFAULT_DIR_INST}"

...

Var commandline ; переменная для считывания командной строки
Var i_CommandlineSetDir ; переменная для хранения состояния "путь взят из командной строки" да=1, нет=0

...

Function .onInit
    ; Установим переменную в ноль (путь с командной строки не считывался)
    StrCpy $i_CommandlineSetDir 0
   
    ${GetParameters} $commandline
   
    ; Если путь установки, сохранённый в установщике (в ${DEFAULT_DIR_INST}) не совпадает с текущим $INSTDIR,
    ; значит использовался NSIS параметр /D=
    ${If} "$INSTDIR" != "${DEFAULT_DIR_INST}"
        StrCpy $i_CommandlineSetDir 1 ; установим в единицу, т.е. путь взят из командной строки
    ${EndIf}
   
    ...

    ${GetOptions} "$CMDLINE" "/P" $R0
    ${IfNot} ${Errors} ; проверка ключа /P
        ${If} $i_CommandlineSetDir = 0 ; если путь не взят из командной строки
            StrCpy $INSTDIR "$EXEDIR\${APP} Portable" ; меняем его на свой
        ${EndIf}
    ${EndIf}

    ...

FunctionEnd


diakov 04-11-2019 21:58 2894748

Приветствую, кто нибудь может адаптировать https://nsis.sourceforge.io/mediawik...-in&oldid=6883 под NSIS 3.x
Или подсказать плаг что бы на странице распаковки файлов отобразить bmp/jpg и/или gif, перепробовал кучу на 2.46 работает на третьей версии нет.

iglezz 05-11-2019 10:10 2894789

diakov, Под NSIS 3.04 примеры из архива с плагином компилируются, запускаются и отображают всё, что прописано.

MKN 05-11-2019 11:12 2894803

diakov,
Есть ещё занятный китайский плагин - XZBHelper.
Можно организовать в процессе установки слайд шоу из картинок или, как настроишь (время показа и затухания).
Кроме того, каждая картинка может являться гиперссылкой на какой либо сайт.
Единственное, не то чтобы неудобство, а момент - в инишнике(файл Slides.dat) обязательна "авторская" запись: [_www.xiazaiba.com], остальное редактируемо.
Скачать плагин : https://yadi.sk/d/pnunedULcQdcwg
Ну, и ессно можно поместить картинку на страницу обычным способом при помощи кучи кода... Примеры были.

diakov 05-11-2019 15:41 2894878

iglezz, я пробовал компилить в этой сборке https://sourceforge.net/projects/nsisbi/, ничего не отображает.
MKN, спасибо, гляну.

iglezz 05-11-2019 18:39 2894904

diakov,
Стоило упомянуть, что используется не чистый nsis, ибо в сборках-модификациях поведение может отличаться от стандартного.
Как и в этом случае.
Сборка по умолчанию создаёт unicode-установщик, который, соответственно, передаёт не-unicode плагину unicode-строки, а не ansi. Как результат - плагин получает абракадабру вместо текстовых строк.

Решение 1:
Добавить в скрипт атрибут Unicode false

Решение 2:
Передавать в unicode-установщике ansi-плагину строки конвертированные в ansi.
Как это можно сделать
Добавляем в скрипт макрос для перекодировки (вариант не идеальный, но для большинства случаев достаточный):
Код:

!define Unicode2Ansi "!insertmacro Unicode2Ansi"

!macro Unicode2Ansi String OutVar
        System::Call /NOUNLOAD 'kernel32::WideCharToMultiByte(i 0, i 0, w "${String}", i -1, t .s, i ${NSIS_MAX_STRLEN}, i 0, i 0) i '
        Pop "${OutVar}"
!macroend

Перекодируем макросом строку, предназначенную плагину, в переменную
Код:

${Unicode2Ansi} "строка" $переменная
которую потом передаём плагину
Код:

Plugin::Command $переменная

Таким образом строка
Код:

ebanner::show /NOUNLOAD /HALIGN=LEFT /FIT=HEIGHT "$EXEDIR\wizard.jpg"
Превращается в последовательность команд
Код:

${Unicode2Ansi} "/HALIGN=LEFT" $R1
${Unicode2Ansi} "/FIT=HEIGHT" $R2
${Unicode2Ansi} "$EXEDIR\wizard.jpg" $R3
ebanner::show /NOUNLOAD $R1 $R2 "$R3"


Сокращённый вариант Example.nsi из архива плагина
Код:

;--------------------------------
; General Attributes

Name "EmbeddedBanner plug-in test"
OutFile "EBannerU.exe"


;--------------------------------
;Interface Settings

!include "MUI.nsh"
; To reduce package size, 70 bytes 2x2 placeholder
!define MUI_WELCOMEFINISHPAGE_BITMAP plholder.bmp
!define MUI_PAGE_CUSTOMFUNCTION_PRE pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW show
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE leave
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

RequestExecutionLevel user

!define Unicode2Ansi "!insertmacro Unicode2Ansi"

!macro Unicode2Ansi String OutVar
        System::Call /NOUNLOAD 'kernel32::WideCharToMultiByte(i 0, i 0, w "${String}", i -1, t .s, i ${NSIS_MAX_STRLEN}, i 0, i 0) i '
        Pop "${OutVar}"
!macroend


Function pre
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 1" "Text" ""
Functionend

Function show
  ${Unicode2Ansi} "/HALIGN=LEFT" $R1
  ${Unicode2Ansi} "/FIT=HEIGHT" $R2
  ${Unicode2Ansi} "$EXEDIR\wizard.jpg" $R3
  ebanner::show /NOUNLOAD $R1 $R2 "$R3"
FunctionEnd

Function leave
  ebanner::stop
FunctionEnd

Section

SectionEnd


AlekseyPopovv 03-12-2019 16:04 2898916

Запускаю приложение командой:
ExecWait "Proga\Proga.exe"
В этом приложении есть настройки, которые вступят в силу после перезагрузки приложения, естественно это приложение само выдаёт запрос на перезагрузку приложения.
Как сделать так, что бы после перезапуска приложения, оно снова запустилось с моего "*.exe" файла?
Либо какой то есть выход с самим процессом "Proga.exe"...

iglezz 03-12-2019 23:09 2898968

AlekseyPopovv,
Что имеется в виду под "что бы после перезапуска приложения, оно снова запустилось с моего "*.exe" файла?" ?
Какая цель преследуется?

AlekseyPopovv 04-12-2019 06:51 2898994

iglezz,
Всё, спасибо, додумался.

iglezz 04-12-2019 19:23 2899073

AlekseyPopovv,
Решением, думаю, стоит поделиться -- может ещё сгодится кому-нибудь.

AlekseyPopovv 04-12-2019 19:29 2899074

iglezz, Придумал сам, может есть что то лучше и проще...
Скрытый текст
Код:

Replay:
ExecWait "Proga\Proga.exe"
Sleep 50
${If} ${ProcessExists} "Proga.exe"
${KillProcess} "Proga.exe" $R0
Goto Replay
${Else}
Sleep 50
${EndIf}


Cyberworm 05-01-2020 15:33 2903635

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

InstallDirRegKey HKLM "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 17470" "InstallLocation"

Неужели ветка реестра InstallDirRegKey HKLM "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*******" только для избранных?
В параметрах инсталлятора указал RequestExecutionLevel admin, потом его убрал. Ничего не изменилось. Как можно решить или обойти данную проблему? Просто охота, чтобы программа установки самостоятельно искала директорию куда была установлена игра.

iglezz 05-01-2020 16:00 2903639

Cyberworm, Такое может быть под 64-бит системой. Путь для InstallDirRegKey надо указывать "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 17470"

Cyberworm 05-01-2020 22:10 2903681

Цитата:

Цитата iglezz
Cyberworm, Такое может быть под 64-бит системой. Путь для InstallDirRegKey надо указывать "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 17470" »

Это дохлый номер, потому что клиент Steam прописывает основные данные игр только в ветке "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\******"

В данной директории "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 17470" вообще ничего нет, как и самой важной ветки Steam App 17470. Я скомпилировал ради теста твой вариант с Wow6432Node, но это результатов не принесло.

iglezz 05-01-2020 23:55 2903699

Cyberworm, Что-то я слона сразу не приметил :)
HKEY_LOCAL_MACHINE\ удалить надо.

Какие, кстати? версия NSIS и разрядность Steam и Windows?

iglezz 06-01-2020 00:27 2903704

Только что проверил. Как-то непонятно этот InstallDirRegKey работает - из HKCU читает, а из HKLM - нет

Обходной путь - установка значения $INSTDIR в .onInit:
Скрытый текст
Код:

Name "RegReadTest"
Unicode true
RequestExecutionLevel admin
SetOverwrite on
SetCompressor  LZMA
OutFile "RegReadTest.exe"

page directory
page instfiles

Function .onInit
        SetRegView 64
        Push $0
        ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinRAR archiver" "InstallLocation"
        IfErrors 0 +3
                MessageBox MB_OK "Программа ХХХ не установлена!"
                Quit
        StrCpy $INSTDIR $0
        Pop $0
FunctionEnd

Section ""
        MessageBox MB_OK "Установка в папку:$\n $INSTDIR"
SectionEnd


Cyberworm 06-01-2020 13:05 2903757

Цитата:

Цитата iglezz
Какие, кстати? версия NSIS и разрядность Steam и Windows? »

Windows 10 Professional x64 и NSIS 3.05 взял с официального сайта. Версию NSIS x64 надо компилировать из исходников. Steam распространяется только в стандартной 32-битной версии. Вот поэтому я и решил разобрать этот вопрос здесь, потому что команда InstallDirRegKey действительно должным образом не работает. Точнее работает с исключениями или даже ограничениями. Сейчас попробую твой вариант с назначением переменной в .onInit

mss307 10-03-2020 17:35 2912671

Всем привет.

Возникла следующая проблема:

Необходимо задать картинку в качестве MUI_HEADERIMAGE_BITMAP. С этим проблем нет. Картинка строго по ширине окна инсталлятора.

После попытки задать $mui.Header.Text и $mui.Header.SubText они становятся невидимыми. Это тоже не проблема, обошел примерно так:
GetDlgItem $8 $HWNDPARENT 0x416 ; Header image
GetDlgItem $9 $HWNDPARENT 0x40A ; Header
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
b ($8, $9, 0, 0, 497, 57, 0)"

Только при этом координаты Text и SubText хедера теперь не прижаты к левому краю.
Пытаюсь так менять координаты:
System::Call "*${stRECT} .r1"
System::Call "User32::GetWindowRect(i, i) i ($mui.Header.Text, r1) .r2"
System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"
IntOp $6 $4 - $2
IntOp $7 $5 - $3
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
b ($mui.Header.Text, 0, 20, 15, ir6, ir7, 0" ;

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

Для текста цвета задаются так:
CreateFont $2 "$(^Font)" "9" "700"
SendMessage $mui.Header.Text ${WM_SETFONT} $2 0
SetCtlColors $mui.Header.Text "0x0F0FAF" "transparent"

Был бы благодарен за помощь!

iglezz 10-03-2020 17:40 2912672

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

mss307 10-03-2020 17:46 2912673

Цитата:

Цитата iglezz
Да, конечно, овнокодинг и велосипедостроение.

!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "..\img\test_top_logo.bmp"
!define MUI_HEADER_TRANSPARENT_TEXT
!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH
(...)
# LICENSE PAGE
!define MUI_PAGE_HEADER_TEXT "End User License Agreement"
!define MUI_PAGE_HEADER_SUBTEXT "Please read the following license agreement \
carefully"
!define MUI_PAGE_CUSTOMFUNCTION_PRE LicensePagePre
!define MUI_LICENSEPAGE_CHECKBOX
!insertmacro MUI_PAGE_LICENSE "..\..\..\EULA\LICENSE.rtf"
(...)
Function LicensePagePre
${If} 1 == $GoToFinish
Abort
${EndIf}
Call ChangeHeaderTextPos
FunctionEnd
(...)
Function ${un}ChangeHeaderTextPos
System::Call "*${stRECT} .r1"
System::Call "User32::GetWindowRect(i, i) i ($mui.Header.Text, r1) .r2"
System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"
IntOp $6 $4 - $2
IntOp $7 $5 - $3
MessageBox MB_OK "$4-$2=$6 $5-$3=$7"
!define ${un}HWND_TOPMOST -1
; System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
; b ($mui.Header.Text, ${HWND_TOPMOST}, 20, 15, ir6, ir7, ${SWP_NOMOVE}|${SWP_NOSIZE})" ; hwnd hwndafterZdepth x y w h flags
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
b ($mui.Header.Text, 0, 20, 15, ir6, ir7, 0" ; hwnd hwndafterZdepth x y w h flags
CreateFont $2 "$(^Font)" "9" "700"
SendMessage $mui.Header.Text ${WM_SETFONT} $2 0
SetCtlColors $mui.Header.Text "0x0F0FAF" "transparent"
System::Call "*${stRECT} .r1"
System::Call "User32::GetWindowRect(i, i) i ($mui.Header.Text, r1) .r2"
System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"
IntOp $6 $4 - $2
IntOp $7 $5 - $3
MessageBox MB_OK "$4-$2=$6 $5-$3=$7"
CreateFont $3 "$(^Font)" "8" "700"
SendMessage $mui.Header.SubText ${WM_SETFONT} $3 0
SetCtlColors $mui.Header.SubText "0x0F0FAF" "transparent"
System::Call "*${stRECT} .r1"
System::Call "User32::GetWindowRect(i, i) i ($mui.Header.SubText, r1) .r2"
System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"
IntOp $6 $4 - $2
IntOp $7 $5 - $3
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
b ($mui.Header.SubText, 0, 40, 30, ir6, ir7, 0)" ; hwnd hwndafterZdepth x y w h flags
GetDlgItem $8 $HWNDPARENT 0x416 ; Header image
GetDlgItem $9 $HWNDPARENT 0x40A ; Header
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
b ($8, $9, 0, 0, 497, 57, 0)" ; hwnd hwndafterZdepth x y w h flags
FunctionEnd »


MKN 10-03-2020 18:21 2912683

Цитата:

Цитата mss307
Text и SubText хедера теперь не прижаты к левому краю »

Добавь !define MUI_HEADERIMAGE_RIGHT
К примеру, в таком виде у меня вроде всё нормально (a1.bmp - моя картинка) :
Код:

!include "nsDialogs.nsh"
!include "MUI2.nsh"
OutFile "test.exe"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP  "c:\Program Files\NSIS\Contrib\Graphics\Header\a1.bmp"
!define MUI_HEADERIMAGE_RIGHT
!define MUI_HEADER_TRANSPARENT_TEXT

Page Custom MyPage

Function MyPage
        !insertmacro MUI_HEADER_TEXT "Title text" "Subtitle text"
        nsDialogs::Create 1018
        Pop $0
        GetDlgItem $0 $HWNDPARENT 0x416 ; Header image
        GetDlgItem $1 $HWNDPARENT 0x40A ; Header
        System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($0, $1, 0, 0, 497, 57, 0)"
        nsDialogs::Show
FunctionEnd

!insertmacro MUI_LANGUAGE "English"

Section
SectionEnd


mss307 10-03-2020 18:30 2912685

Да, а ларчик просто открывался. Неожиданно, честно говоря. Это так очевидно было?

AlekseyPopovv 18-03-2020 11:13 2913678

Вложений: 1
Как изменить цвет окна MessageBox?

iglezz 18-03-2020 11:40 2913683

Никак, это системный диалог.

AlekseyPopovv 22-03-2020 08:20 2914237

Как изменить параметры в *.ini?
Пример:
Код:

[Section]
Parameter1=5000
Parameter2=7000

Если эти параметры равны 5000 и 7000, то Parameter2 нужно заменить на 3000
Если параметры не равны 5000 и 7000, то замена не нужна
Код:

[Section]
Parameter1=5000
Parameter2=3000

Как это сделать?

iglezz 22-03-2020 09:32 2914240

ReadINIStr, WriteINIStr

Примерно так:
Код:

ReadINIStr $0 "filename" "section" "param1"
StrCmp $0 5000 0 +4
ReadINIStr $0 "filename" "section" "param2"
StrCmp $0 7000 0 +2
WriteINIStr "filename" "section" "param2" 30000


AlekseyPopovv 28-03-2020 11:47 2914931

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

iglezz 28-03-2020 11:57 2914934

AlekseyPopovv, Если под перетягиванием подразумевается перетягивание файла на ярлык/exe, то
Код:

!include "FileFunc.nsh"

; В теле секции/функции/макро:
${GetParameters} $0
; В $0 теперь содержатся все параметры, переданные лаунчеру
; Далее можно запустить программу с этими параметрами:
Exec 'program.exe $0'


Iska 28-03-2020 17:42 2914954

iglezz, лишние кавычки, обрамляющие имена программы и передаваемого файла, не нужны там?

iglezz 28-03-2020 18:54 2914960

Iska, Это в качестве домашнего задания :)

Если перетаскиваемый на лаунчер файл имеет в полном пути пробелы, то Проводник (и не только) обрамляет его в кавычки. NSIS эти кавычки не трогает, поэтому строку параметров можно передать в исходном виде.
А если понадобится несколько указанных в параметрах файлов передать в программу по одному, то тогда понадобится немного подумать над алгоритмом разбора и реализовать его. Или поискать готовый...

Iska 29-03-2020 00:24 2914977

Цитата:

Цитата iglezz
то Проводник (и не только) »

Так у нас же не Проводник, у нас NSIS. И речь про единственный параметр.

Exec — это в NSIS обёртка над ShellExecute()? Тут: Reference/Exec - NSIS этого нет, но про кавычки — кое-что есть.

iglezz 29-03-2020 01:59 2914983

Цитата:

Цитата Iska
Так у нас же не Проводник, у нас NSIS. И речь про единственный параметр. »

Но процесс перетаскивания файла на nsis-лаунчер будет происходить при помощи файл-менеджера. Наиболее вероятно, что это будет Проводник.
Понимание необходимости обрамлять в кавычки имя запускаемой команды, по моему, уже должно быть, поэтому уточнил только момент с параметрами, т.к. иногда встречаются "особенности" у некоторых представителей двоичного мира (wsh, total commander)

AlekseyPopovv 07-04-2020 10:19 2916119

При Unicode true ругается на !include "ProcessFunc.nsh".
Как быть? NSIS 3.04

iglezz 07-04-2020 10:30 2916120

Цитата:

Цитата AlekseyPopovv
При Unicode true ругается на !include "ProcessFunc.nsh". »

Как именно?

AlekseyPopovv 07-04-2020 10:48 2916123

Цитата:

Цитата iglezz
Как именно? »

Код:

Command line:
"C:\Program Files (x86)\NSIS\makensis.exe"  /NOTIFYHWND 6882462  "P:\Portable\Scripts\Program.nsi.hmnetempscript1"

Processing config: C:\Program Files (x86)\NSIS\nsisconf.nsh
Processing script file: "P:\Portable\Scripts\Program.nsi.hmnetempscript1" (ACP)
Bad text encoding: C:\Program Files (x86)\NSIS\Include\ProcessFunc.nsh:1
!include: error in script: "C:\Program Files (x86)\NSIS\Include\ProcessFunc.nsh" on line 1
Error in script "P:\Portable\Scripts\Program.nsi.hmnetempscript1" on line 52 -- aborting creation process

Не верная кодировка текста. У меня кодировка "Windows 1251".

iglezz 07-04-2020 11:10 2916128

Определённо, надо или править кодировку скрипта/включаемого файла, или указать её в !include через /CHARSET=***, или методом комментирования/удаления искать сбойные строки в ProcessFunc.nsh.

AlekseyPopovv 07-04-2020 11:21 2916130

iglezz, не понял конечно ни чего, всё желание уже отбила "эта" программа, теперь даже морочиться с ней не буду. А вам спасибо за помощь.

MKN 07-04-2020 15:32 2916168

Цитата:

Цитата AlekseyPopovv
При Unicode true ругается на !include "ProcessFunc.nsh". »

А какой именно Header ты используешь ? Есть старый и поновее от kotkovets - http://forum.oszone.net/post-2390157-1283.html

AlekseyPopovv 08-04-2020 08:32 2916267

Цитата:

Цитата MKN
А какой именно Header ты используешь?»

Поновее. На версии 3.05 вообще теперь предупреждение, что это?
Код:

warning: 7998: ANSI targets are deprecated

MKN 08-04-2020 10:13 2916277

Цитата:

Цитата AlekseyPopovv
На версии 3.05 вообще теперь предупреждение, что это? »

Это заявленное - переходите на Unicode, что то в Вашем скрипте не поддерживается новой версией... : https://nsis.sourceforge.io/Docs/AppendixF.html#v3.05
Цитата:

F.2 3.05
Released on December 15th, 2019
F.2.1 Release Notes
ANSI targets are deprecated, consider moving to Unicode.
В ряде случаев можно игнорировать или использовать предыдущие версии NSIS...

Serg866 16-04-2020 12:27 2917418

Привет
Файлы моего инсталлятора в сумме превысили размер 2гб. Соответственно скрипт не компилируется. Ищу решение по архивации файлов, чтобы архивы распаковывались при установке, при этом незаметно для пользователя и без наличия дополнительных программ на его ПК. Всё должен сделать установщик. Понимаю, что тут нужен архиватор, умеющий распаковывать архивы в тихом режиме и его надо включать в дистрибутив инсталлятора. Пожалуйста, подскажите как решить вопрос.
P.S. Надо обойтись без bat-ников, так как у многих пользователей они не запустятся из-за включенного UAC.

iglezz 16-04-2020 12:37 2917425

Примерно так:
Код:

InitPluginsDir
File "/oname=$PLUGINSDIR\7za.exe" "7za.exe"
nsExec::Exec '"$PLUGINSDIR\7za.exe" x -y -o"$INSTDIR" "$EXEDIR\pack.7z"'


AlekseyPopovv 22-04-2020 16:49 2918559

Программа запускается через лаунчер командой:
ExecWait "$EXEDIR\${APPEXE}"
Вопрос:
Как завершить процесс "${APPEXE}", если эта программа на закрывается по нажатию на "крестик", а сворачивается в трей?

Цитата:

Цитата MKN
А какой именно Header ты используешь ? »

Как ни странно, проблема была в закоментированном тексте в самом файле "ProcessFunc.nsh".

iglezz 23-04-2020 08:40 2918627

Цитата:

Цитата AlekseyPopovv
Программа запускается через лаунчер командой:
ExecWait "$EXEDIR\${APPEXE}"
Вопрос:
Как завершить процесс "${APPEXE}", если эта программа на закрывается по нажатию на "крестик", а сворачивается в трей? »

Для начала определится по каким критериям программу нужно закрывать.
В любом случае, если это делать из лаунчера, надо процесс запускать не через ExecWait, т.к. здесь лаунчер будет ждать завершения ${APPEXE} для перехода к следующей инструкции.

inco1 07-05-2020 08:42 2920188

Всем доброго времени суток.
Подскажите по нубовскому вопросу. Например пишу запустить файл
Код:

Exec '"$TEMP\Br Pr\Prrr.exe"'
или не запустить, а провести другие манипуляции с файлом.
'Как сделать код с таким условием, "если файл найден, то запустить файл (или например не запускать, а провести с ним другие действия), а если не найден, то вообще пропустить выполнение этого действия" ?

MKN 07-05-2020 13:02 2920224

Цитата:

Цитата inco1
"если файл найден, то запустить файл (или например не запускать, а провести с ним другие действия), а если не найден, то вообще пропустить выполнение этого действия" »

Как вариант :
Код:

IfFileExists "$TEMP\Br Pr\Prrr.exe" Next
MessageBox MB_OK "Файл Prrr.exe НЕ ОБНАРУЖЕН ! "
; Quit если надо...
Next:
MessageBox MB_OK "Файл Prrr.exe - на месте! Производим (или нет)какое либо действие"


inco1 07-05-2020 14:10 2920232

MKN,
Спасибо, но MessageBox MB_OK не нужен, как в таком случае?

PS. Все, разобрался, еще раз спасибо.

inco1 20-05-2020 06:23 2921813

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

MKN 20-05-2020 10:28 2921831

Цитата:

Цитата inco1
Как привязать реестр к папке установки, ведь некоторые данные указывают в реестре папку установки »

Папка установки, которую ессно можно изменять при установке, задаётся в скрипте.
Например, InstallDir "$PROGRAMFILES\MyProg".
Это - переменная $INSTDIR, которая фигурирует в скрипте, в частности в реестре.
К примеру, WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninstall MyProg.exe"
Собственно всё... :) Внимательно читаем "Справочник по NSIS" (ссылка в шапке темы).

inco1 21-05-2020 10:57 2921989

MKN, Я правильно понял?, что если у меня, например,
InstallDir "$PROGRAMFILES\MyProg" ,
но пользователь во время установки изменит по своему выбору , например, в
D:\Misha\MyProg
и я пропишу:
WriteRegStr HKEY_CURRENT_USER "Software\MyProg" "123" "$INSTDIR\MyProg.exe" ,
то и в реестре пропишется все правильно:
[HKEY_CURRENT_USER\Software\MyProg]
"123"="D:\Misha\MyProg\MyProg.exe"

В справке ничего по моему вопросу не обнаружил.

MKN 21-05-2020 13:04 2922018

inco1,
InstallDir "любое изменяемое бла-бла". Это "любое изменяемое бла-бла" = $INSTDIR.
$INSTDIR используй далее в скрипте, где угодно.
Давно бы проэксперементировал и увидел что и как. :)

inco1 21-05-2020 14:57 2922037

MKN, Спасибо. Все просто и доступно. Жаль, что создатели справки не умеют объяснять вот таким простейшим способом.

inco1 02-06-2020 12:42 2923682

Всем доброго времени суток.
В установщике с помощью ExecShell "open" "$INSTDIR\readme.txt" запускается текстовый документ. Но также продолжают срабатывать все последующие команды.
Как нужно сделать, чтобы после запуска этого документа следующие команды в установщике не запускались до тех пор, пока пользователь сам не закроет этот документ. Или это сделать не возможно?

iglezz 02-06-2020 12:45 2923684

inco1,
ExecShellWait

Begin2Fly 02-06-2020 12:48 2923685

Цитата:

Цитата inco1
Всем доброго времени суток.
В установщике с помощью ExecShell "open" "$INSTDIR\readme.txt" запускается текстовый документ. Но также продолжают срабатывать все последующие команды.
Как нужно сделать, чтобы после запуска этого документа следующие команды в установщике не запускались до тех пор, пока пользователь сам не закроет этот документ. Или это сделать не возможно? »

ExecWait '"$WINDIR\Notepad.exe" "$INSTDIR\readme.txt"'
Либо, как ответил iglezz, ExecShellWait, тогда запустится ассоциированная с txt программа.

inco1 02-06-2020 12:53 2923688

iglezz, Спасибо. Это именно то, что мне нужно. Потратил час на поиск в справке и не нашел, а вы мне за 3 минутки.
Begin2Fly, Благодарю. Экспериментну с обеими вариантами.

inco1 04-06-2020 11:30 2923944

Всем доброго времени суток.
Помогите, пожалуйста вот в каком деле.
Стоит задача. Если язык в системе русский и на диске D в папке test имеется изображение test.gif , то оно должно показаться на две секунды. С другим языком это изображение не должно показываться. Сделал такой код:
Код:

OutFile "Test.exe"
SilentInstall silent
SetCompressor /SOLID lzma

!include "LogicLib.nsh"

Function .onInit
System::Call "kernel32::GetUserDefaultLCID() i.r0"
IntOp $LANGUAGE $0 & 0xFFFF
IntFmt $0 "%04X" $0
FunctionEnd

Section
${If} $0 = 0419
newadvsplash::show 2000 100 100 "D:\test\test.gif"
Abort
${EndIf}
SectionEnd

Задача выполнена. Код компилируется. Экзешник создается и работает согласно поставленной задаче. Ничего криминального.
Но почему тогда 9 антивирусников пишут всякую всячину по поводу этого файла?
virustotal
Помогите, пожалуйста поправить мой код, чтобы антивирусники замолчали. Видать они что то видят неправильное в коде.

iglezz 04-06-2020 11:42 2923946

inco1,
Эта задача решается сугубо административными методами - обвешивание сертификатами, контакт с разрабами "антивирусов" на тему внесения своего безвредного творения в белые списки и т.п.

inco1 04-06-2020 11:48 2923950

iglezz, С антивирусниками ясно, но думается мне, что не разрешимо. Код сгодиться? Ничего править не нужно?

iglezz 04-06-2020 12:19 2923953

inco1,
Не стоит переносить данные в переменных общего значение ($0..$9, $R0..$R9) между разными блоками кода, они могут потеряться при использовании колбек-функций .onMouseOverSection, .onSelChange или плохо оформленного куска кода, который не заботится о сохранении состояния $0..$9, $R0..$R9.

Код получения системного языка по умолчанию лучше поместить в отдельную функцию/макрос (или даже вынести в свой отдельный .nsh):
Скрытый текст

Код:

Function GetDefaultLanguageFunc
    Push $0 ; отправим $0 в стек, чтобы сохранить её состояние до вызова функции
    System::Call "kernel32::GetUserDefaultLCID() i.r0"
    IntOp $LANGUAGE $0 & 0xFFFF
    IntFmt $0 "%04X" $0
    Exch $0 ; сохранённое значение $0 из стека возвращается на место, полученный код языка помещается в стек
FunctionEnd

Section
    Call GetDefaultLanguageFunc ; вызываем функцию
    Pop $0 ; извлекаем из стека полученный функцией код языка
    ${If} $0 = 0419
        newadvsplash::show 2000 100 100 "D:\test\test.gif"
        Abort
    ${EndIf}
SectionEnd


inco1 04-06-2020 12:49 2923961

iglezz, Спасибо.

inco1 04-06-2020 14:35 2923988

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

MKN 04-06-2020 18:03 2924003

Цитата:

Цитата inco1
чтобы в самом начале запуска установщика была проверка учетной записи »

Так это стандартные возможности "боксового" NSIS... В доке есть и пример :
Код:

Name "UserInfo.dll test"
OutFile UserInfo.exe
RequestExecutionLevel Highest

!define REALMSG "$\nOriginal non-restricted account type: $2"

Function .onInit
        ClearErrors
        UserInfo::GetName
        IfErrors PluginFail
        Pop $0
        StrCmp $0 "" 0 +2
                StrCpy $0 "?"
        UserInfo::GetAccountType
        Pop $1
        UserInfo::GetOriginalAccountType
        Pop $2
        StrCmp $1 "Admin" 0 +3
                MessageBox MB_OK 'User "$0" is in the Administrators group${REALMSG}'
                Goto done
        StrCmp $1 "Power" 0 +3
                MessageBox MB_OK 'User "$0" is in the Power Users group${REALMSG}'
                Goto done
        StrCmp $1 "User" 0 +3
                MessageBox MB_OK 'User "$0" is just a regular user${REALMSG}'
                Goto done
        StrCmp $1 "Guest" 0 +3
                MessageBox MB_OK 'User "$0" is a guest${REALMSG}'
                Goto done
        MessageBox MB_OK "Unknown error"
        Goto done

        PluginFail:
                MessageBox MB_OK "Error! Unable to call plug-in!"
        done:
FunctionEnd

Section
SectionEnd

Можно конечно и по всякому...

inco1 04-06-2020 19:55 2924009

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

PS. Всё красиво прикрутил, как в поставленной задаче и всё работает.
Не ясен один момент, кто такой Power?

MKN 05-06-2020 10:11 2924053

Цитата:

Цитата inco1
кто такой Power? »

Цитата:

Power Users group - Группа опытных пользователей
Приложения, требующие повышения прав при запуске в Windows 7, не могут выполнять стандартные учетные записи пользователей, в отличие, например, от загрузки и установки Firefox. Именно здесь приходит группа опытных пользователей, чтобы предоставить необходимые привилегии для этих унаследованных приложений.
Или здесь про Power Users :
https://docs.microsoft.com/en-us/pre...ectedfrom=MSDN

inco1 06-06-2020 14:08 2924175

Всем доброго времени суток.
Я в тупике. Существует ли способ, чтобы не дожидаясь завершения команды "newadvsplash::show 5000 100 100" сделать переход к следующей команде?
Вариант с отдельным экзешником, как то не по взрослому. Может старожилы чего смогут подсказать?

Begin2Fly 06-06-2020 14:28 2924177

Цитата:

Цитата inco1
Всем доброго времени суток.
Я в тупике. Существует ли способ, чтобы не дожидаясь завершения команды "newadvsplash::show 5000 100 100" сделать переход к следующей команде?
Вариант с отдельным экзешником, как то не по взрослому. Может старожилы чего смогут подсказать? »

newadvsplash::show 5000 100 100 /BANNER

inco1 06-06-2020 14:33 2924179

Begin2Fly, Я это пробовал в первую очередь. Пока эта команда не отработает следующая не начинается.

Begin2Fly 06-06-2020 14:39 2924182

Цитата:

Цитата inco1
Begin2Fly, Я это пробовал в первую очередь. Пока эта команда не отработает следующая не начинается. »

https://streamable.com/wj35df
Если дадите более полный код, попробую с вашим.

inco1 06-06-2020 15:31 2924193

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

K.A.V. 07-06-2020 17:57 2924311

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

Будет что-то типа:
Код:

Function ThreadProc
  newadvsplash::show 5000 100 100 /BANNER "$DESKTOP\2222222222222222222222222222222222.jpg"
  MessageBox MB_OK "Сообщение из потока"
FunctionEnd
   

Function .oninit
  ${Thread_Create} ThreadProc $R0
  MessageBox MB_OK "Основной поток"
FunctionEnd


inco1 08-06-2020 19:54 2924447

K.A.V., Спасибо. Begin2Fly предложил простой вариант:
Код:

newadvsplash::show /NOUNLOAD 5000 100 100 -2 /BANNER
; После отработки всех последующих команд добавить это:
newadvsplash::stop

Можно пример добавить в справку.

inco1 12-06-2020 06:15 2924785

Всем доброго времени суток.
Столкнулся с двумя проблемами.
В папке $WINDIR\System32\drivers\ хочу удалить файл .sys. В семерке этот файл спокойно удаляется с помощью макроса и команды:
Скрытый текст
Код:

!insertmacro DisableX64FSRedirection
Delete "$WINDIR\System32\drivers\test.sys"
!insertmacro EnableX64FSRedirection


В десятке почему то не удаляется. Когда начал пробовать в десятке удалить его вручную, то он пишет, что занят процессом. Но IObit Unlocker показывает, что никаким процессом он не занят и командой "разблокировать и удалить" спокойно его удаляет.
Вот такой вопрос, имеется ли в nsis команда типа "снять все атрибуты, разблокировать и удалить", чтобы удалялся в десятке файл, как это делает IObit Unlocker?
И вторая проблема.
Имеется батник - это вполне рабочий генератор случайного 32 значного кода с записью в нужную область реестра:
Скрытый текст
Код:

@echo off
cls
 
@echo.
@echo.
 
call :randomizeSequence 32 sequence
@echo sequence = '%sequence%'
 
REG ADD HKLM\Software\Test/v TestId /t REG_SZ /d %sequence% /f
 exit /b
 
:randomize
    set MIN=%1
    set MAX=%2
    set /A %3=%MIN% + (%MAX% - %MIN% + 1) * %random% / 32768
exit /b
 
:fillArray
    set "array[%cnt%]=%1"
    set /a cnt +=1
exit /b
 
:initialRandomize
    if defined ALREADYINIT (exit /b)
    set ALREADYINIT=true

    for %%a in ( 1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  g) do (
        call :fillArray %%a 
    )
exit /b
 
:accumulate
    call :randomize 1 15 index
    call set "char=%%array[%index%]%%"
    call set "%dst%=%%%dst%%%%char%"
exit /b
 
:randomizeSequence
    set len=%1
    set dst=%2
    call :initialRandomize
    for /L %%a in (1 1 %len%) do (
        call :accumulate %%a
    )
exit /b


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

iglezz 12-06-2020 17:54 2924837

Цитата:

Цитата inco1
имеется ли в nsis команда типа "снять все атрибуты, разблокировать и удалить", чтобы удалялся в десятке файл, как это делает IObit Unlocker? »

Нет.
Если "IObit Unlocker показывает, что никаким процессом он не занят и командой "разблокировать и удалить" спокойно его удаляет", то он, скорее всего, чего-то не договаривает (дабы не перегрузить пользователю мозг технической информацией ).

Цитата:

Цитата inco1
Имеется батник - это вполне рабочий генератор случайного 32 значного кода »

Можно сгенерировать GUID и отфильтровать до [0-9A-F]
Скрытый текст
макрос ${GetRandomHexStringG} OUTPUT LENGTH
Запишет в переменную OUTPUT строку длиной:
LENGTH символов для 1 <= LENGTH <= 32
32 символа для других значений
Код:

!include "Util.nsh"

!define GetRandomHexStringG '!insertmacro GetRandomHexStringG'

!macro GetRandomHexStringG OUTPUT LENGTH
        Push ${LENGTH}
        ${CallArtificialFunction} GetRandomHexStringG_
        Pop ${OUTPUT}
!macroend

!macro GetRandomHexStringG_
        Push $0 ; result string
        Exch
        Exch $1 ; result chars count
        Push $2 ; guid string
        Push $3 ; length of guid string
        Push $4 ; counter
        Push $5 ; temp / char
       
        StrCpy $0 ''
        System::Call 'ole32::CoCreateGuid(g .r2)'
        StrLen $3 $2
        IntOp $3 $3 - 1 ; to skip last curly bracket
        StrCpy $4 1 ; to skip first curly bracket
       
        Loop:
                IntCmp $4 $3 ExitLoop 0 ExitLoop
                StrCpy $5 $2 1 $4
               
                IntOp $4 $4 + 1
                StrCmp $5 '-' Loop
               
                StrCpy $0 $0$5
                IntOp $1 $1 - 1
                IntCmp $1 0 ExitLoop
                Goto Loop
        ExitLoop:
       
        Pop $5
        Pop $4
        Pop $3
        Pop $2
        Pop $1
        Exch $0
!macroend

пример:
Код:

        ${GetRandomHexStringG} $9 10
        DetailPrint "result $9"


inco1 12-06-2020 21:27 2924856

iglezz,
Цитата:

Можно сгенерировать GUID и отфильтровать до [0-9A-F]
Я понял, что ничего не понял. Что конкретно нужно прописать в строку добавления в реестр WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Test" "TestId" "?" , чтобы с вашего кода прописывалось 32 значное случайное число?

iglezz 12-06-2020 22:32 2924863

inco1,
Код:

${GetRandomHexStringG} $0 32 ; записать сгенерированное значение (32 символа) в $0
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Test" "TestId" "$0" ; записать $0 в реестр


inco1 12-06-2020 22:39 2924865

iglezz, Спасибо, буду пробовать.

PS. Всё отлично работает. Правда буквы заглавные, но это не критично. Спасибо.

iglezz 13-06-2020 07:20 2924878

Цитата:

Цитата inco1
Правда буквы заглавные, но это не критично. »

Вот такой вариант генератора позволяет задавать регистр
Код:

!define GetRandomHexStringRL '!insertmacro GetRandomHexStringR x'
!define GetRandomHexStringRU '!insertmacro GetRandomHexStringR X'

!macro GetRandomHexStringR CASE OUTPUT LENGTH
        Push ${LENGTH}
        Push ${CASE}
        ${CallArtificialFunction} GetRandomHexStringR_
        Pop ${OUTPUT}
!macroend

!macro GetRandomHexStringR_
        Exch $0 ; 'x'/'X'
        Exch
        Exch $1 ; length
        Push $2 ;
        Push $3 ;
        Push $4 ;
        Push $5 ;
        Push $R0 ; CSP handle returned by CryptAcquireContext()
        Push $R1 ; buffer address for data generated by CryptGenRandom()
       
        System::Alloc 32
        Pop $R1
       
        System::Call "advapi32::CryptAcquireContext(*i.R0, i0, i0, i1, i0x40)"
        System::Call "advapi32::CryptGenRandom(iR0, i32, iR1)"
        System::Call "advapi32::CryptReleaseContext(iR0, i0)"
       
        System::Call "*$R1(&i4.r2, &i4.r3, &i4.r4, &i4.r5)"
        System::Free $R0
       
        StrCpy $R0 "%08$0"
        IntFmt $2 $R0 $2
        IntFmt $3 $R0 $3
        IntFmt $4 $R0 $4
        IntFmt $5 $R0 $5
       
        StrCpy $0 $2$3$4$5 $1
       
        Pop $R1
        Pop $R0
        Pop $5
        Pop $4
        Pop $3
        Pop $2
        Pop $1
        Exch $0
!macroend

Пример:
Код:

${GetRandomHexStringRL} $0 32 ; lowercase
${GetRandomHexStringRU} $0 32 ; uppercase


MKN 13-06-2020 11:24 2924891

Для генерации стандартного 32 значного GUID, вроде как достаточно :

Код:

OutFile CreateGuid-test.exe
!include "WordFunc.nsh"

Section
System::Call 'OLE32::CoCreateGuid(g.R0)'
${StrFilter} "$R0" "-" "" "" $R1
MessageBox MB_OK "$R1"
SectionEnd

(${StrFilter} из WordFunc.nsh используем для смены регистра)

inco1 13-06-2020 11:53 2924897

iglezz,
Цитата:

Вот такой вариант генератора позволяет задавать регистр
Это то. что я хотел. Спасибо.

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

MKN, А как я могу прикрутить ваш код , чтобы добавлялось 32 знака из цифр и нижнего регистра в нужную ветку реестра?

MKN 13-06-2020 14:41 2924931

inco1,
Очевидно же :
Код:

OutFile CreateGuid-test.exe

Section
System::Call 'OLE32::CoCreateGuid(g.R0)'
MessageBox MB_OK "$R0"
SectionEnd


inco1 13-06-2020 15:08 2924936

MKN,
Это вообще не то. Я же выложил батник, он генерирует такой код d2b7daaed38c3532d7d7aa6895fb96ge
iglezz выложил код, который отлично генерит в верхнем регистре 848D8134AB514E70ABE491A6551B5E99
Потом он выложил код с нижним регистром, но который генерит только в семерке, но не хочет генерить в десятке - записывает ноли.
Вы выложили код, который генерит следующее {AE68BE6F-43A2-1FB4-423D-D0C358720163} это не то, что я спрашивал.

iglezz 13-06-2020 15:17 2924938

Цитата:

Цитата inco1
Этот вариант с нужным мне нижним регистром вносит 32 знака в реестр только на семерке. На десятке вносит 32 нуля. »

Странно, под десяткой код и писался.
x64, version 10.0.19041.264

inco1, Вот библиотечка и скрипт для тестирования. Оно нормально генерирует?
Для статистики - какие версии и разрядность на используемых системах (и с рабочим результатом и с нерабочим)

inco1 13-06-2020 16:40 2924944

iglezz,
На семерках 32 и 64 от идима https://i.paste.pics/a21061b1ec34356...40262bc1c2.png
На десятках 32 и 64 и 8х64 от монкруса https://i.paste.pics/205de24bee8fd46...7684f39adc.png
Десятки 1809 17753.253 про и корпорат.
Восьмерка про последняя от монкрус.

MKN 13-06-2020 16:50 2924947

Цитата:

Цитата inco1
Вы выложили код, который генерит следующее {AE68BE6F-43A2-1FB4-423D-D0C358720163} это не то, что я спрашивал. »

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

iglezz 13-06-2020 17:54 2924955

inco1, Раз на некоторых системах генерятся нули, лучше на этот метод и не расчитывать, тем более что это функции из крипто апи, которое объявлено устаревшим и когда-нибудь будет внезапно выпилено из актуальных на тот момент систем. Да и не быстрое оно, если часто его дёргать.

inco1 13-06-2020 18:29 2924957

iglezz, Для моего случая подходит и работает ваш первый вариант с заглавными буквами. Просто хотелось "по честному" :)

NorvesBear 18-06-2020 14:57 2925459

Вложений: 1
Добрый день, возник вопрос как передаются параметры из скрипта в динамическую библиотеку.
Код не мой (остался от предшественника) хочу разобраться. Код рабочий!!!! Ничего придумывать не нужно.
Напомню, что согласно оф. документации параметры при подключении dll передаются (с права на лево)

Это вызов библиотечной функции из скрипта. Как видно передаются параметры для распаковки БД, но это не важно.

Код:

dbdll::NSIS_IBExecuteRestore /NOUNLOAD $0 $szGBackUtilityPath "$INSTDIR\DataBase\BackUp\${SDMP_DB_IB}" "localhost:$INSTDIR\DataBase\DataBase.FDB" "SYSDBA" "masterkey" "$INSTDIR\DataBase\LogFile.LOG"
А это кусок библиотечной функции. Как можно видеть параметры передаются через стек.
(во вложенном файле)

Вопросы к знатокам:
1) Что хранится в стеке (не тип переменной, а идейно. Что туда кладут, какую информацию?)
2) Кто пишет в стек (NSIS или внутри DLL)
3) Кто читает из стека
4) Где располагается стек. Тип в памяти процесса скрипта или в памяти dll?
5) Где можно почитать подробнее про то каким образом происходит взаимодействия с внешними функциями у NSIS?

P.S: на некоторые вопросы я предполагаю ответы, но хочу узнать у более опытных людей.

NorvesBear 19-06-2020 03:45 2925504

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

https://nsis.sourceforge.io/Examples/Plugin/exdll.c

В местном справочнике по NSIS удалось найти зачем.
В плагинах файл "System: Вызов функций из внешних библиотек"

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

Цитата:

Очень полезное свойство у системного плагина - отдельный(приватный) стек. Очень помогает при написании макросов и сложных функций.
Позволяет сохранить все исходные значения переменных в приватный стек до использования макроса, и восстановить все эти значения
переменных, после завершения макроса или функции в исходное(оригинальное) состояние.
Вы не будете получать конфликтов значений, при использовании одновременно одинаковых переменных.
S cохраняет значения переменых $R0 - $R9
L восстанавливает значения переменых $R0 - $R9

s cохраняет значения переменых $0 - $9
l восстанавливает значения переменых $0 - $9
Единственно важно помнить, что согласно офф документации, параметры передаются в любом случае справа на лево "https://nsis.sourceforge.io/Docs/Chapter4.html#plugindlls" Зачем сделано так для меня загадка...

И отвечая на свои же вопросы для моего примера:
1) В стеке находится то что в него засунули (ДА ЛАДНО?!), ну а именно в моём случае это параметры для функции. Ничего особенного в этом стеке нет.
2) В стек пишет NSIS, но он может доставать из стека например результат внешней функции.
3) Из стека читает функция (она сама разбирает стек и забирает нужное).
4) Стек располагается где-то в системе (не важно где). Он один и он глобальный (для всего процесса) т.е. для скрипта NSIS и всей подключённой либы вместе..
5) Подробнее про подключение динамических библиотек можно почитать
5.1) официальная документация с примерами "https://nsis.sourceforge.io/Docs/Chapter4.html#plugindlls"
5.2) замечательный хелпер этого сообщества. Ссылка, я думаю излишняя

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

inco1 20-06-2020 06:32 2925629

Всем доброго дня.
В Messagebox по умолчанию текст выравнивается по левому краю. Применив right можно выравнять по правому краю. А center не работает.
Покажите , пожалуйста, как центрируются слова и предложения в Messagebox. А то применение пробелов для "центрации" как то не серьёзно и не совсем "центрально".

MKN 20-06-2020 09:19 2925632

Цитата:

Цитата inco1
center не работает »

В стандартном варианте не работает.
https://nsis-dev.github.io/NSIS-Foru.../t-212400.html
Или используй спец. плагины или делай свой Messagebox из окна и т.п.

inco1 20-06-2020 09:48 2925633

MKN, по данной ссылке некий DrO в 2005 году писал, что, когда закончит с почтовым плагином, то займется этим.
Дайте, пожалуйста ссылку этого самого спец плагина.

iglezz 20-06-2020 11:11 2925643

inco1, Разумнее всего будет забыть про выравнивание по центру в MessageBox.

MKN 20-06-2020 11:25 2925644

inco1,
Плагин(одну из вариаций самопальной messagebox.dll) однажды встречал у китайцев (на nsisfans.com). Где он там закопан, ищи уж сам.
Есть еще интересная малюсенькая прожка Wbox.exe (www.horstmuc.de ). В ней точно есть центровка текста и много чего ещё. Теоретически можно приспособить в NSIS, если разобраться как приладить Callback... Но, ИМХО, в такой возне, смысла нет...

K.A.V. 20-06-2020 22:00 2925706

Вложений: 1
Цитата:

Цитата NorvesBear
Спасибо сообществу за замечательный хелпер без него как без рук уже (он у меня работает не корректно и не отображает содержимое страниц. Приходится доставать оттуда нужные html ручками хз почему »

Возможно, система заблокировала CHM файл, т.к. он был загружен из интернета, зайдите в свойства файла и нажмите кнопку (или поставьте галочку) "Разблокировать"

Цитата:

Цитата inco1
MKN, по данной ссылке некий DrO в 2005 году писал, что, когда закончит с почтовым плагином, то займется этим.
Дайте, пожалуйста ссылку этого самого спец плагина. »

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

Что касается решения вопроса, то MKN выше уже вам дал ответ:
Если так сильно нужна центровка текста, то делайте свою DLL и в ней создавайте свой диалог через WinApi функцию DialogBox с использованием заранее созданного ресурса с окном, присвоив стиль SS_CENTER Static-элементу, в котором будет располагаться непосредственно текст вашего сообщения

inco1 25-06-2020 19:20 2926269

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

iglezz 26-06-2020 00:14 2926311

inco1, sc config SERVICE_NAME start= demand через nsexec

inco1 26-06-2020 10:56 2926342

iglezz, Спасибо. Это именно то, что нужно.

Serg866 29-06-2020 18:06 2926700

Привет. Подскажите, пожалуйста, как модифицировать данный код, чтобы кроме 1920*1080 добавить второе возможное разрешение по принципу: если у пользователя разрешение 1920*1080 или 1366*768, то продолжаем установку, если любое другое - аборт.
Не получается сопоставить логическую конструкцию.

Код:

Function .onInit
; Получаем текущие размеры экрана
  System::Call 'user32::GetSystemMetrics(i 0) i .r0' ; Ширина в пикселях
  System::Call 'user32::GetSystemMetrics(i 1) i .r1' ; Высота в пикселях
${If} $0 == 1920
${AndIf} $1 == 1080
MessageBox MB_OK "Установлено разрешение 1920x1080"
${Else}
  MessageBox MB_OK "Установлено любое другое разрешение"
${EndIf}
FunctionEnd


iglezz 29-06-2020 18:16 2926702

Serg866, Например, так:
Код:

System::Call 'user32::GetSystemMetrics(i 0) i .r0' ; Ширина в пикселях (основного дисплея)
System::Call 'user32::GetSystemMetrics(i 1) i .r1' ; Высота в пикселях (основного дисплея)

StrCpy $2 "$0x$1" ; делаем строку "<ширина>x<высота>"

${If} $2 != "1920x1080"
${AndIf} $2 != "1366x768"
    MessageBox MB_ICONSTOP "Экран не тот, работать не буду"
    Quit
${EndIf}

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

inco1 10-07-2020 01:17 2927849

Всем доброй ночи.
Тут вот такое дело. Смотрю в CCleaner в "Запланированные задачи", там много всякой всячины. Такой вопрос: есть ли в NSIS команды для удаления запланированных задач?

MKN 10-07-2020 10:21 2927870

Цитата:

Цитата inco1
есть ли в NSIS команды для удаления запланированных задач? »

NSIS может работать с обычными "классическими" командами, типа :

ExecWait 'SchTasks /Delete /TN “My Task”'
ExecWait 'SchTasks /Change /TN "My Task" /Disable'

http://forums.shoutcast.com/showthread.php?t=374970

https://docs.microsoft.com/ru-ru/win...mands/schtasks
https://www.celitel.info/klad/bathelp/schtasks.htm и т.п.

или
https://nsis.sourceforge.io/Talk:Scheduled_Tasks

или можно заморочиться с API, что не имеет смысла... :
https://nsis.sourceforge.io/mediawik...ks&oldid=21526

inco1 10-07-2020 19:25 2927895

MKN, Спасибо. Наилучшим образом работает это:
Код:

nsExec::Exec 'schtasks /Delete /tn "My Task" /f'

inco1 28-07-2020 10:03 2929460

Здравствуйте. Такой вот вопрос. Если система неким уникумом установлена на диск D.
Будут ли в таком случае работать стандартные переменные?
Интересует $PROGRAMFILES.

iglezz 28-07-2020 10:25 2929463

inco1,
Будут.
Цитата:

Цитата inco1
Если система неким уникумом установлена на диск D. »

Не обязательно уникумом. По крайней мере раньше сама логика установщика Windows порождала таких кадавров

inco1 02-08-2020 18:13 2929974

Всем доброго времени суток. Столкнулся с такой проблемой. Имеется команда "если файл не найден"
Код:

(${IfNot} ${FileExists} C:\test.exe
 MessageBox MB_OK "дыр-дыр-дыр"
 ${EndIf}

А есть ли команда поиска нескольких файлов C:\test.exe и C:\test1.exe и C:\test2.exe и если только все отсутствуют выдать сообщение?

Begin2Fly 02-08-2020 18:17 2929975

Цитата:

Цитата inco1
А есть ли команда поиска нескольких файлов C:\test.exe и C:\test1.exe и C:\test2.exe и если только все отсутствуют выдать сообщение? »

Справочник по NSIS - Статьи - Логические конструкции: ${AndIf}

inco1 02-08-2020 18:30 2929976

Begin2Fly,
Ничего я там не понял, да и пример с ${AndIf} один единственный с равенством.
Можете дать конкретный пример?

Begin2Fly 02-08-2020 18:35 2929977

!include Logiclib.nsh

${IfNot} ${FileExists} C:\test.exe
${AndIfNot} ${FileExists} C:\test1.exe
${AndIfNot} ${FileExists} C:\test2.exe
MessageBox MB_OK "дыр-дыр-дыр"
${EndIf}

inco1 02-08-2020 18:41 2929978

Begin2Fly,
Спасибо, ну я и лошара.

ZVSRus 18-08-2020 12:34 2931546

Кто подскажет в чем причина?
То, что крокозябрами должно быть Русским. Может кто сталкивался.





PS: Вопрос снят, решение найдено.

Serg866 18-08-2020 21:30 2931601

Цитата:

Цитата iglezz
System::Call 'user32::GetSystemMetrics(i 0) i .r0' ; Ширина в пикселях
System::Call 'user32::GetSystemMetrics(i 1) i .r1' ; Высота в пикселях
StrCpy $2 "$0x$1" ; делаем строку "<ширина>x<высота>"
${If} $2 != "1920x1080"
${OrIf} $2 != "1366x768"
MessageBox MB_ICONSTOP "Экран не тот, работать не буду"
Quit
${EndIf} »

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

iglezz 19-08-2020 10:38 2931625

Serg866,
Ух.. Мой косяк :(
${OrIf} надо заменить на ${AndIf}

Hoha 25-08-2020 23:01 2932099

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

iglezz 26-08-2020 09:18 2932114

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

Hoha 26-08-2020 13:16 2932133

iglezz, Спасибо!

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

Function .onVerifyInstDir
LockWindow off
FunctionEnd

iglezz 26-08-2020 16:06 2932148

Hoha, непонятно что за проблема с накладыванием текста. Тут надо пару скринов/анимация проблемы или компилируемый кусок скрипта.

MKN 20-10-2020 13:13 2936972

Напомните пожалуйста, есть ли простой способ(код в одну строку :) ), чтобы удалить файлы из каталога, НЕ УДАЛЯЯ сам каталог ? (Что то мне кажется, что такового не существует в NSIS...) В две строки - удалив каталог с файлами и создав вновь- это как то топорно...

AlekseyPopovv 20-10-2020 13:23 2936974

MKN, Delete "$DESKTOP\*.*"

MKN 20-10-2020 13:40 2936978

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

Begin2Fly 20-10-2020 13:43 2936979

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

AlekseyPopovv 20-10-2020 13:43 2936980

MKN, Я сразу понял что что то не то тут... :)

MKN 20-10-2020 13:46 2936982

Begin2Fly,
Действительно, любопытное поведение... А для удаления и папок, вроде как макрос какой то был...

AlekseyPopovv 21-10-2020 16:27 2937103

Есть ли способ создать файл *.ini в кодировке UTF-16LE?

iglezz 21-10-2020 17:51 2937111

Цитата:

Цитата AlekseyPopovv
Есть ли способ создать файл *.ini в кодировке UTF-16LE? »

Создать пустышку.
UTF-16LE BOM:
Код:

FileOpen $0 ИМЯ_INI_ФАЙЛА w
FileWriteWord $0 65279

; Если сейчаc закрыть файл, то первая строка файла после первого же WriteINIStr получится пустой.
; Поэтому её можно использовать для комментария:
FileWriteUTF16LE $0 ";комментарий для инишника "

FileClose $0

UTF-16LE без BOM:
Код:

FileOpen $0 ИМЯ_INI_ФАЙЛА w
FileWriteUTF16LE $0 "  " ; Записать два пробела
FileClose $0

Дальше писать обычным WriteINIStr.

MKN,
Ещё вариант в две строки :)
Код:

SetOutPath DIR
RMDir /r DIR


MKN 18-11-2020 16:20 2940357

Цитата:

Цитата heloy2010
обновленный ProcessFunc.nsh для версий NSIS 3.XX »

А разве не эта версия входит в состав справочника NSIS_Help-1.5.chm ? (раздел "Работа с процессами с помощью NSIS")

heloy2010 29-11-2020 06:52 2941374

Вложений: 1
К сожалению, из ссылки справочника NSIS_Help-1.5.chm, до сих пор загружается устаревшая версия ProcessFunc.nsh для NSIS 2.XX размером в 13.7 КБ.
Обновленная последняя версия ProcessFunc.nsh для NSIS 3.XX, имеет размер 12.8 КБ и здесь на сайте находится на нее ссылка на яндекс-диск. Сразу я ее не нашел, поэтому и обратился к автору ProcessFunc.nsh.

MKN 10-12-2020 17:22 2942531

Вложений: 1
Отыскал полезный док файлик с примерами от kotkovets , как использовать ProcessFunc.nsh

murlocks 26-12-2020 18:09 2944253

Подскажите пожалуйста примеры по использованию SendMessage с ключем WM_GETTEXT.
Примером с WM_SETTEXT очень много, а с этим ни одного не нашел

iglezz 26-12-2020 19:48 2944262

murlocks,
Для WM_GETTEXT и других сообщений, которые возвращают значения в wParam/lParam, встроенная инструкция SendMessage не подходит.
Но можно воспользоваться плагином System.
Пример, читающий текст с кнопки Next/Install/Close

Код:

GetDlgItem $0 $HWNDPARENT 1
System::Call 'USER32::SendMessage(i $0, i ${WM_GETTEXT}, i ${NSIS_MAX_STRLEN}, t .r1)  i .r2'
MessageBox MB_OK 'text: $1$\nchars: $2'

Что здесь происходит (упрощённо):

Функция SendMessage принимает 4 параметра:
HWND - дескриптор окна, которому отсылается сообщение
Msg - код сообщения
wParam - значение, специфичное для конкретного сообщения
lParam - значение, специфичное для конкретного сообщения

Параметры для сообщения WM_GETTEXT:
wParam - максимальное число символов, которые надо прочитать, включая концевой нулевой (null, \0) символ (для чтения максимум 5 символов необходимо задать значение 6).
В примере выше ${NSIS_MAX_STRLEN} задаёт максимально возможное значение в используемой сборке NSIS (по умолчанию - 1024 символа)
lParam - указатель на буфер, содержащий прочитанный текст.
В примере выше это "t .r1", что (упрощённо) говорит "текстовое значение поместить в переменную (регистр) $1".

Функция SendMessage с сообщением WM_GETTEXT возвращает число прочитанных символов, не включая концевой символ. Это фрагмент " i .r2" в примере выше и его можно удалить, если использование этого числа не планируется.

Результат, помимо переменных $0..$9, $R0..$R9, можно поместить и в стек, $INSTDIR, $OUTDIR и некоторые другие переменные. Подробности есть в справке по плагину System.

MKN 06-01-2021 12:21 2945147

Задача: узнать какие разрешения(права доступа), кто владелец конкретного ключа реестра ?
Первым делом попробовал имеющийся известный инструментарий - AccessControl plug-in с заявленным :
Цитата:

Gets the owner of an object.
GetRegKeyOwner <rootkey> <regkey>
Pop $Owner ; or "error" + error details
т.е. , как пример :
Код:

!addplugindir .
OutFile AccessControlTest.exe
RequestExecutionLevel admin
var Owner

Section
AccessControl::GetRegKeyOwner "HKLM" "SYSTEM\ControlSet001\Control\AGP"
Pop $Owner
MessageBox MB_OK "$Owner"
SectionEnd

В итоге - error.
Или я что то не так делаю, или плагин...
Также интересно, как можно использовать для этих целей RegGetKeySecurity фунукцию ?
У кого какие соображения ?

iglezz 06-01-2021 13:45 2945157

MKN, Формат вызова неверный
GetRegKeyOwner <rootkey> <regkey>
Код:

GetRegKeyOwner <rootkey> <regkey>

<rootkey>
  The well-known root of a registry key. Following values are defined:

    HKCR - HKEY_CLASSES_ROOT
    HKLM - HKEY_LOCAL_MACHINE
    HKCU - HKEY_CURRENT_USER
    HKU  - HKEY_USERS

<regkey>
  The name of the registry to alter (ie. "Software\Microsoft\Windows").


Следовательно:
Код:

AccessControl::GetRegKeyOwner "HKLM" "SYSTEM\ControlSet001\Control\AGP"
Но возвращает оно что-то не то...

MKN 06-01-2021 13:50 2945159

Цитата:

Цитата iglezz
Формат вызова неверный »

Я уж попробовал по всякому. :) (и зачем было <rootkey> выделять в отдельный параметр ?)

iglezz 06-01-2021 15:53 2945177

MKN, Оно как-то странно работает или плохо документировано.
Скрытый текст
Для кода
Код:

AccessControl::GetRegKeyGroup "HKCU" "Software\7-Zip\"
Pop $R1
DetailPrint "HKCU:R1: $R1"
Pop $R2
DetailPrint "HKCU:R2: $R2"

AccessControl::GetRegKeyGroup "HKLM" "Software\7-Zip\"
Pop $R1
DetailPrint "HKLM:R1: $R1"
Pop $R2
DetailPrint "HKLM:R2: $R2"

Выдаёт в лог:
Код:

HKCU:R1: Software\7-Zip\
HKCU:R2: Cannot look up owner. Error code: 87
HKLM:R1: error
HKLM:R2: Cannot get current ownership. Error code: 2


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

MKN 06-01-2021 16:33 2945187

iglezz,
Значит этот плагин не годится... ( Придётся пользоваться PS, там с этим всё чётко, ну и можно "прикрутить" к Nsis... )

inco1 08-01-2021 00:06 2945332

Всем привет.
У меня такой вот вопрос. Я, например, извлекаю реальное место установки программы так
Код:

ReadRegStr $R9 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\test.exe" "Put"
Все просто, если извлекать только из одного раздела. Это меня устраивает, но....
Можно ли как то прописать, чтобы указать дополнительное извлечения места с другого раздела.
Код:

ReadRegStr $R9 HKLM "SOFTWARE\test" "Put"
Параметр "Put"показывает одно и то же место , но вся закавыка, что любой из этих разделов может отсутствовать в реестре.
Нужно взять с первого раздела, а если раздел не найден, то со второго, но обязательно в одну переменную, например $R9. Если один из разделов или оба не найдены, то уведомление об этом не нужно. Как вот такое сотворить?

iglezz 08-01-2021 00:56 2945337

inco1, Нужно просто последовательно читать необходимые значения, с прерыванием последовательности в случае успеха.
В простейшем случае с проверкой на пустое/несуществующее значение:
Код:

ReadRegStr $R9 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\test.exe" "Put"
StrCmp $R9 "" 0 +4
ReadRegStr $R9 HKLM "SOFTWARE\test" "Put"
StrCmp $R9 "" 0 +2
StrCpy $R9 "X:\путь\"


inco1 08-01-2021 07:14 2945346

iglezz, Спасибо, это то, что нужно. Все просто и работает.

pckassa 10-01-2021 21:07 2945712

...подскажите как сделать так чтобы nsis отсылал запрос на iplogger!?
Хочу получать статистику о запуске моего софта.

Iska 10-01-2021 23:55 2945725

pckassa, коли так — ну, так и делайте сие «в моём софте», а не в инсталляторе.

pckassa 11-01-2021 10:17 2945744

Это рекламная кампания.
Я пускаю траффик и мне нужно отслеживать конверт.
В сам софт я лезть не имею права, да и откровенно говоря я дуб-дубом в коде, элементарный NSIS скрипт Еще могу написать, кое как, но не более...

В общем нужно сделать именно так. Вдруг есть решение, подскажите пожалуйста!

inco1 17-01-2021 18:35 2946579

Всем желаю здравствовать.
У меня опять проблема. Подскажите, ну никак не могу решить. Делаю простейший экзешник, который вносит настройки в некую программу и добавляет в папку с этой программой текстовый документ. Настройки этой программы для каждого конкретного пользователя в реестре в ветке HKEY_CURRENT_USER.
Вот код:

Код:

    Unicode true
    OutFile "test1.exe"
RequestExecutionLevel Admin
    SilentInstall silent
    SetCompressor /FINAL /SOLID lzma
    !include "x64.nsh"
    !include "FileFunc.nsh"
Section
      WriteRegDWORD HKEY_CURRENT_USER "SOFTWARE\Adobe\Adobe Acrobat\DC\3D" "b3DEnableFlashPlayer" 0x0
        SetOutPath "$PROGRAMFILES\\Adobe\Acrobat DC\Acrobat"
        File "1.txt"       
SectionEnd

Всё работает пока учетка админа. Добавляет настройку и добавляет текстовый файл. Но под простым пользователем это не работает. При запуске просит подтверждения админа и отрабатывает. Вот только эта настройка в реестре добавляется тому самому админу от которого получено разрешение. Текстовый файл в папку добавляется.

Если применить вот такой код:

Код:

    Unicode true
    OutFile "test1.exe"
RequestExecutionLevel user
    SilentInstall silent
    SetCompressor /FINAL /SOLID lzma
    !include "x64.nsh"
    !include "FileFunc.nsh"
Section
      WriteRegDWORD HKEY_CURRENT_USER "SOFTWARE\Adobe\Adobe Acrobat\DC\3D" "b3DEnableFlashPlayer" 0x0
        SetOutPath "$PROGRAMFILES\\Adobe\Acrobat DC\Acrobat"
        File "1.txt"       
SectionEnd

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

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

iglezz 17-01-2021 18:58 2946586

inco1,
Под какой версией/разрядностью Windows дело происходит?

inco1 17-01-2021 19:10 2946588

iglezz, Доброго вечера.
Испытывал на 10х64. Параметры контроля на низу ползунка.

Добавлено.
Пробовал на 7х64 с двумя пользователями админ и одним простым с включенным контролем ползунок по рекомендации.
Простой пользователь отдаёт настройки реестра программы тому админу от кого получает разрешения.
Как то это не правильно.

iglezz 18-01-2021 01:37 2946645

inco1,
В первом случае всё понятно и правильно - установщик запускается от имени пользователя с админскими привилегиями и CURRENT_USER здесь уже не наш пользователь, запустивший установщик.
Во втором случае тоже всё правильно - нефиг пользователю в системных папках делать, чай не 90-е на дворе :)

Для внесения изменений в реестр сразу всем пользователям можно воспользоваться готовым решением в виде EnumUsersReg.nsh

inco1 18-01-2021 12:17 2946691

iglezz, Спасибо. Это именно то, что я искал. Путем нехитрых подстановок в мой тестовый экзешник получилось следующее:

Код:

    Unicode true
    OutFile "test1.exe"
RequestExecutionLevel Admin
    SilentInstall silent
    SetCompressor /FINAL /SOLID lzma
    !include "x64.nsh"
    !include "FileFunc.nsh"
    !include "EnumUsersReg.nsh"
Section
        ${EnumUsersReg} CallbackFunction temp.key
        SetOutPath "$PROGRAMFILES\\Adobe\Acrobat DC\Acrobat"
        File "1.txt"       
SectionEnd
Function CallbackFunction
Pop $0
WriteRegDWORD HKU "$0\SOFTWARE\Adobe\Adobe Acrobat\DC\3D" "b3DEnableFlashPlayer" 0x0
FunctionEnd

Работает так как нужно, но вот компилируется с предупреждением "1 warning: 6020: Uninstaller script code found but WriteUninstaller never used - no uninstaller will be created".
На работу это предупреждение не влияет, но может можно как нибудь его убрать, чтобы совсем по правильному было?

MKN 18-01-2021 12:30 2946696

Цитата:

Цитата inco1
может можно как нибудь его убрать »

Удали из EnumUsersReg.nsh всё связанное с макросом EnumUsersReg UN

inco1 18-01-2021 15:17 2946716

MKN,
Спасибо. С этим разобрался.

iglezz,
Появилась попутная проблема.
Это работает как надо:
Скрытый текст
Код:

    Unicode true
    OutFile "test1.exe"
RequestExecutionLevel Admin
    SilentInstall silent
    SetCompressor /FINAL /SOLID lzma
    !include "x64.nsh"
    !include "FileFunc.nsh"
    !include "EnumUsersReg.nsh"
Section
        ${EnumUsersReg} CallbackFunction temp.key
        SetOutPath "$PROGRAMFILES\\Adobe\Acrobat DC\Acrobat"
        File "1.txt"       
SectionEnd
Function CallbackFunction
Pop $0
WriteRegDWORD HKU "$0\SOFTWARE\Adobe\Adobe Acrobat\DC\3D" "b3DEnableFlashPlayer" 0x0
FunctionEnd



И это работает как надо:
Скрытый текст
Код:

    Unicode true
    OutFile "test2.exe"
RequestExecutionLevel Admin
    SilentInstall silent
    SetCompressor /FINAL /SOLID lzma
  !include "ProcessFunc.nsh"
Section
        ${KillProcess} "P.exe" $0   
SectionEnd



Но вот незадача, не работает первое и второе вместе.
Скрытый текст
Код:

    Unicode true
    OutFile "test3.exe"
RequestExecutionLevel Admin
    SilentInstall silent
    SetCompressor /FINAL /SOLID lzma
    !include "x64.nsh"
    !include "FileFunc.nsh"
    !include "ProcessFunc.nsh"   
    !include "EnumUsersReg.nsh"
Section
        ${KillProcess} "P.exe" $0   
SectionEnd
Section
        ${EnumUsersReg} CallbackFunction temp.key
        SetOutPath "$PROGRAMFILES\\Adobe\Acrobat DC\Acrobat"
        File "1.txt"       
SectionEnd
Function CallbackFunction
Pop $0
WriteRegDWORD HKU "$0\SOFTWARE\Adobe\Adobe Acrobat\DC\3D" "b3DEnableFlashPlayer" 0x0
FunctionEnd



При компиляции ошибка !include "EnumUsersReg.nsh" или !include "ProcessFunc.nsh" , в зависимости, что первой объявить.

!include "EnumUsersReg.nsh" и !include "ProcessFunc.nsh" не совместимы? Или я что то не так слепил?

iglezz 18-01-2021 15:32 2946718

inco1, Причина ошибок - одинаковые !define
По хорошему надо и в EnumUsersReg.nsh и в ProcessFunc.nsh добавить
Код:

!include Win\WinNT.nsh
и удалить дефайны, совпадающие во всех трёх файлах

Iska 18-01-2021 17:18 2946731

iglezz, а разве в NSIS не пользуют какие-нибудь !IFNOTDEFINE и т.п.?

iglezz 18-01-2021 17:29 2946733

Iska, это можно, но на перспективу лучше не плодить сущности..

iglezz 18-01-2021 18:05 2946740

inco1, Модифицированные EnumUsersReg.nsh и ProcessFunc.nsh, которые не конфликтуют.

inco1 19-01-2021 09:51 2946806

iglezz,
Спасибо за модификацию.
Сейчас все компилируется и работает. Экзешник сделал через MessageBox MB_YESNO. YES - установка, NO - не установка. И тут опять проблема по моему незнанию. Как прописать, чтобы и Function CallbackFunction подчинялась кнопке NO. А то получается. если кликнул YES, то все правильно устанавливается. Ели кликнул NO, то файлы-майлы и прочее, как и требуется не ставится, а настройки в реестр все равно прописываются, ведь они в Function CallbackFunction, а MessageBox MB_YESNO в Section.

iglezz 19-01-2021 10:35 2946810

inco1, Call CallbackFunction

inco1 19-01-2021 12:08 2946823

iglezz, Спасибо. Вот теперь работает так как было в моих планах.
Какое же все таки классное решение EnumUsersReg.nsh, хоть и мало востребованное. Но для компьютеров с пользователями в пол аула с одинаковыми задачами это самое то.

iglezz 19-01-2021 13:32 2946833

inco1, мало востребовано, ибо сценарии обычно простые - установка только текущему юзеру или общесистемная установка и дальше пользователь сам всё настраивает. Сложные сценарии - это, в основном, либо корпоративщина (а там - Windows Installer), либо плохо спроектированный софт, либо недостаток информации/знаний о продукте у собирающего установщик, либо сборки с включением разнообразных хотелок создателя/пользователя сборки.

Конкретно в образце выше точно есть необходимость писать в пользовательскую ветку? Это уместно, если
- Акробат не в состоянии читать из HKLM при отсутствии настройки в HKCU
- необходимо изменить уже имеющийся параметр у пользователя

inco1 19-01-2021 14:56 2946845

iglezz,
Что касаемо Акробат, то это именно тот продукт, где все его настройки хранятся отдельно для каждого пользователя в HKCU. После установки и настройки акробата, если зайдет другой пользователь, то все настройки для него будут по умолчанию пока этот пользователь их под себя не настроит.
Что касаемо меня, то в связи с обилием свободного времени начал экспериментировать. Была для себя поставлена задача, чтобы в идеале один пользователь мог изменять HKCU другого или вообще всех. С вашей лёгкой подачи задача, которую я ставил для себя успешно разрешилась. В виду моего полного отсутствия знаний NSIS, да и всего остального для меня это очень важно.
Вы, наверное программист или преподаватель, к чему я больше склоняюсь. Ваша помощь всегда корректно подается без рассуждений о пользе справке, как некоторые, не намёками, а конкретно.
Еще раз благодарю вас за помощь.

P.S. В личку отправил полный сценарий, что я сделал.

Iska 19-01-2021 17:34 2946863

Цитата:

Цитата inco1
Какое же все таки классное решение EnumUsersReg.nsh, хоть и мало востребованное. Но для компьютеров с пользователями в пол аула с одинаковыми задачами это самое то. »

Цитата:

Цитата iglezz
inco1, мало востребовано, ибо сценарии обычно простые - установка только текущему юзеру или общесистемная установка и дальше пользователь сам всё настраивает. »

Не так. Если возникает вопрос с содержимым, которое надо «развесить всем пользователям» — значит, приложение криво написано. Предварительные настройки «на пользователя» обязаны выполняться самим приложением при его первом запуске. Отсутствующие некритичные пользовательские файлы и содержимое реестра — восстанавливаться при каждом запуске приложения.

Цитата:

Цитата inco1
Была для себя поставлена задача, чтобы в идеале один пользователь мог изменять HKCU другого или вообще всех. »

Не делайте так.

inco1 19-01-2021 18:10 2946871

Iska,
Я писал о акробат. Он написан, ну никак не криво. При первом запуске любого пользователя подтягиваются настройки по умолчанию. Но все дело в том, что по умолчанию. Изменение этих настроек, а их огромное множество, как раз и пишется только на того пользователя, который их совершает. Я не зря написал. что "для компьютеров с пользователями в пол аула с одинаковыми задачами". Если одним кликом можно нескольким пользователям дать идентичные настройки программы, то что в этом криминального. Суждения о пользе EnumUsersReg.nsh так и останутся суждениями. Другое дело, что в NSIS нету возможности прописать в инсталляторе, чтобы запуск мог произвести только админ. Все, что есть сработает только на висте и семерке с выключенным контролем учеток.

Iska 19-01-2021 18:44 2946880

inco1, для этих целей есть домен и политики. А то, что пытаетесь сделать Вы — называется иначе.

K.A.V. 19-01-2021 19:24 2946893

Цитата:

Цитата inco1
Всё работает пока учетка админа. Добавляет настройку и добавляет текстовый файл. Но под простым пользователем это не работает »

Цитата:

Цитата inco1
и просто сделать двойной клик, то запись добавляется правильно, но не добавляется текстовый файл. Если запустить от админа , о и запись настройки добавится админу, текстовый файл добавится. »

Так и должно быть
"Учите мат.часть" или работайте в Windows XP, где еще не было "такой сложной системы", с чего бы под юзером вам операционная система должна давать доступ в Program Files? В новых ОС это уже давно заблочено на уровне системы от шаловливых ручек, нужны права на запись в Program Files - дайте права админа программе

Цитата:

Цитата inco1
Испытывал на 10х64. Параметры контроля на низу ползунка. »

Цитата:

Цитата inco1
Пробовал на 7х64 с двумя пользователями админ и одним простым с включенным контролем ползунок по рекомендации.
Простой пользователь отдаёт настройки реестра программы тому админу от кого получает разрешения.
Как то это не правильно. »

Согласен, скачали такой файлик, который 5-ти летний Пашка написал в какой-то супермегапростойхакерскойпроге, которая очищает Program Files и другие системные папки, запустили без прав админа, и она давай вам всё зачищать, и это правильно :up


Цитата:

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

Цитата:

Цитата inco1
При первом запуске любого пользователя подтягиваются настройки по умолчанию. Но все дело в том, что по умолчанию »

Вам бы почитать, как устроена ОС, что такое реестр (и что он может), что такое bat-файлы/переменные среды ОС, например...это так, навскидку, что первое приходит в голову

Цитата:

Цитата Iska
А то, что пытаетесь сделать Вы — называется иначе. »

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

Цитата:

Цитата inco1
Другое дело, что в NSIS нету возможности прописать в инсталляторе, чтобы запуск мог произвести только админ »

Цитата:

Цитата inco1
Ваша помощь всегда корректно подается без рассуждений о пользе справке, как некоторые, не намёками, а конкретно »

Я бы, всё-таки, порассуждал на тему о пользе справки к NSIS

Iska 19-01-2021 19:59 2946901

Цитата:

Цитата K.A.V.
или работайте в Windows XP, где еще не было "такой сложной системы", с чего бы под юзером вам операционная система должна давать доступ в Program Files? В новых ОС это уже давно заблочено на уровне системы от шаловливых ручек, нужны права на запись в Program Files - дайте права админа программе »

Так ещё с NT 3.x уже не давала, если мне не изменяет память.


Цитата:

Цитата K.A.V.
Такой порнухи я еще не встречал, там заморочиться только для того, чтобы настройки нужные подкинуть только что установленному ПО... »

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

K.A.V. 21-01-2021 11:22 2947077

Цитата:

Цитата Iska
Ну, человек открывает для себя мир программирования »

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

Iska 21-01-2021 18:53 2947129

K.A.V., боже, боже… :shot:

Вот так и теряешь веру в человечество.

динозавра 27-01-2021 09:58 2947685

Господа товарищи. Прочитал весь форум, но так и не понял, как добиться уведомления для пользователя без прав, что установщик типа не для него и далее quit. Для пробы Win10 32, ничего не работает из того что здесь и в справке. Установщик все равно лезет устанавливать, появляется окно от имени админа, а мне нужно чтобы тупо quit. Что нужно написать в скрипте?

MKN 27-01-2021 10:04 2947686

Цитата:

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

А разве UserInfo::GetAccountType не работает ?

Попробуй так :

Код:

OutFile "IsUserAdmin-test.exe"
!Include "LogicLib.nsh"

Function .onInit
System::Call setupapi::IsUserAdmin()i.r0
${If} $0 = 1
MessageBox MB_OK|MB_ICONINFORMATION "Есть права администратора"   
${Else}
MessageBox MB_OK|MB_ICONINFORMATION "Нет прав администратора. До свидания !"
Quit
${EndIf}
FunctionEnd

Section
MessageBox MB_OK "Setup"
SectionEnd


динозавра 27-01-2021 10:28 2947689

MKN, Скомпилировал ваш скрипт без изменений. Не работает. Точнее работает, но сначала появляется окно от имени админа и по нажатию да выдает "Есть права администратора". Все так же как и с другими способами.

iglezz 27-01-2021 11:00 2947693

Цитата:

Цитата динозавра
о сначала появляется окно от имени админа и по нажатию да выдает "Есть права администратора". »

Потому что нужен RequestExecutionLevel user RequestExecutionLevel highest

динозавра 27-01-2021 11:26 2947697

iglezz, Если добавить RequestExecutionLevel user в тест от MKN то для пользователя без прав пишет правильно "Нет прав администратора". Но админу тоже пишет "Нет прав администратора". Что не так.

iglezz 27-01-2021 11:34 2947699

Цитата:

Цитата динозавра
Что не так. »

Где не так? Код в студию.
IsUserAdmin() возвращает 1 при наличии админских привелегий

динозавра 27-01-2021 12:21 2947701

iglezz, Я же написал, если добавить RequestExecutionLevel user в тест от MKN.

Код:

OutFile "IsUserAdmin-test.exe"
!Include "LogicLib.nsh"
RequestExecutionLevel user
Function .onInit
System::Call setupapi::IsUserAdmin()i.r0
${If} $0 = 1
MessageBox MB_OK|MB_ICONINFORMATION "Есть права администратора"   
${Else}
MessageBox MB_OK|MB_ICONINFORMATION "Нет прав администратора. До свидания !"
Quit
${EndIf}
FunctionEnd

Section
SectionEnd

для пользователя без прав пишет правильно "Нет прав администратора". Но админу тоже пишет "Нет прав администратора".
если изменить на RequestExecutionLevel admin то админу пишет "Есть права администратора", а у пользователя появляется окно разрешения от имени администратора.
Почти голая десятка лицензия. Никакие твики шмихи не применял, ничего не регулировал. Как есть с установочного диска. Попробуйте сами, если не верите сниму видео.

PS. Нашел код UserInfo::GetAccountType. Все точно так же.

динозавра 27-01-2021 13:19 2947712

Путем тыка обнаружил, что адекватно себя ведет тест, если применить RequestExecutionLevel highest.
Админу пишет "Есть права администратора", пользователю "Нет прав администратора. До свидания !". Если же пользователю тест произвести правой кнопкой мыши "Запуск от имени администратора" то только тогда появляется окно от администратора. Вроде все правильно и адекватно.
Но теперь мне не понятно какие привилегии потеряет установщик с RequestExecutionLevel highest в отличие от RequestExecutionLevel admin.

iglezz 27-01-2021 14:46 2947725

Цитата:

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

Моя ошибка, давно в эту тему не влазил...

Цитата:

Цитата динозавра
Но теперь мне не понятно какие привилегии потеряет установщик с RequestExecutionLevel highest в отличие от RequestExecutionLevel admin. »

Установщик - никаких, это пользовательское понятие.
В описании RequestExecutionLevel есть ссылка на статью MSDN с подробностями.
user == asInvoker
highest == highestAvailable

динозавра 30-01-2021 13:31 2948009

Хотел подытожить. Для многих будет очень познавательно. Три рабочих примера.

Пример 1
Код:

  Unicode true
OutFile "1-test.exe"
!Include "LogicLib.nsh"
RequestExecutionLevel highest
Function .onInit
System::Call setupapi::IsUserAdmin()i.r0
${If} $0 = 1
MessageBox MB_OK|MB_ICONINFORMATION "Есть права администратора"   
${Else}
MessageBox MB_OK|MB_ICONINFORMATION "Нет прав администратора. До свидания !"
Quit
${EndIf}
FunctionEnd
Section
SectionEnd


Пример 2
Код:

  Unicode true
OutFile "2-test.exe"
!Include "LogicLib.nsh"
RequestExecutionLevel highest
Function .onInit
System::Call setupapi::IsUserAdmin()i.r0
Pop $0
${If} $0 = "admin"
MessageBox MB_OK|MB_ICONINFORMATION "Нет прав администратора. До свидания !"
Quit
${EndIf}
MessageBox MB_OK|MB_ICONINFORMATION "Есть права администратора"
FunctionEnd
Section
SectionEnd


Пример 3 для конкретики для кого запрет
Код:

  Unicode true
OutFile "3-test.exe"
!Include "LogicLib.nsh"
RequestExecutionLevel highest
Function .onInit
UserInfo::GetAccountType
Pop $1
${If} $1 == "Guest"
${OrIf} $1 == "User"
MessageBox MB_OK|MB_ICONINFORMATION "Нет прав администратора. До свидания !"
Quit
${EndIf}
MessageBox MB_OK|MB_ICONINFORMATION "Есть права администратора"
FunctionEnd
Section
SectionEnd


Эти примеры объединяет RequestExecutionLevel highest. По другому это совсем не работает.
Есть нюанс. В виста и семь с выключенным UAC - это когда системный настройщик уведомлений в крайнем нижнем положении и в восемь и десять с полностью выключенным UAC - это когда системный настройщик уведомлений в крайнем нижнем положении и нужные отключения в реестре.
В этом случае пользователи без прав не смогут запустить установщик, не двойным кликом, не от имени администратора. Как в ХР.
Если же системный настройщик уведомлений будет в другом положении, то пользователь без прав не сможет запустить установщик двойным кликом, но все же сможет запустить его от имени администратора.
Простыми словами: добиться Quit для пользователя без прав для установщика с большими привилегиями с включенным UAC не возможно. Исходя из того, что я написал эти коды на практике мало полезны. Зря потратил два дня на обобщение всего этого. Почему тогда этого нету в справке? Поправьте меня, если я ошибаюсь.

Iska 30-01-2021 15:35 2948020

динозавра, может, потому, что это достаточно странные хотелки?

динозавра 30-01-2021 16:10 2948022

Iska, Не понял вопроса? В чем странность? В том, что в справочнике устаревший код, который работает только в ХР и об этом ничего не указано? Или в том, что я хочу сделать установщик, который бы не запускался с малыми правами пользователя без всяких от имени? Или странность в том, что я первый об этом очень подробно написал?

iglezz 30-01-2021 16:28 2948027

динозавра,
Во-первых, второй пример не работает, т.к. после System::Call setupapi::IsUserAdmin()i.r0 в стеке ничего не появится и дальнейшее не имеет смысла.
Цитата:

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

В любом положении и в любой оси и не сможет запустить? "Несите новую ось, эта сломана!"
Серьёзно -- или система криво затвикана, или в исходных данных где-то ошибки.
Цитата:

Цитата динозавра
Простыми словами: добиться Quit для пользователя без прав для установщика с большими привилегиями с включенным UAC не возможно. Исходя из того, что я написал эти коды на практике мало полезны. Зря потратил два дня на обобщение всего этого. Почему тогда этого нету в справке? Поправьте меня, если я ошибаюсь. »

Чего именно нет в справке и какая справки имеется в виду?

Пока вижу, что выложенные скрипты для полноценного тестирования условий запуска и получаемых результатов не содержат.
Так-же подозреваю, что решать-то надо совсем другую задачу. Стоит её озвучить.

Ибо происходящее похоже на типичную XY-проблему.


динозавра 30-01-2021 18:12 2948036

iglezz,
Цитата:

Во-первых, второй пример не работает, т.к. после System::Call setupapi::IsUserAdmin()i.r0 в стеке ничего не появится и дальнейшее не имеет смысла.
Во-первых, я не знаю, чего должно появиться в стеке, но второй пример работает, точно как и первый и третий.
Цитата:

В любом положении и в любой оси и не сможет запустить? "Несите новую ось, эта сломана!"
Серьёзно -- или система криво затвикана, или в исходных данных где-то ошибки.
Тут меня извините, я не правильно выразился, а вы не правильно поняли. Системный настройщик уведомлений я тестировал на всех системах по умолчанию, на нескольких 32 и 64. Установщик по двойному клику запустится, но сработает, как и надо Quit. Но его просто можно запустить от имени и никакой Quit уже не сработает.
Цитата:

Чего именно нет в справке и какая справки имеется в виду?
В нашей справке. Не указано, что тот код, что там, и мои в том числе работают только в ХР, ну еще на других с полностью отключенным UAC. С включенным UAC по рекомендованному умолчанию любой бесправный пользователь от имени установит прогу или чего там. Нужно только паролить.
Юмор ценю. Спасибо.
Чуть не забыл, вот видео, как в стеке ничего не появляется и дальнейшее не имеет смысла https://streamable.com/9hr0vi

iglezz 30-01-2021 20:34 2948053

Цитата:

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

Цитата:

Цитата динозавра
Чуть не забыл, вот видео, как в стеке ничего не появляется и дальнейшее не имеет смысла https://streamable.com/9hr0vi »

Если стек пуст, то содержимое регистра останется неизменным. В обсуждаемом примере это так и только поэтому сия конструкция работает (повезло). Зато потом, по мере усложнения скрипта, запросто вылезут сюрпризы.

Цитата:

Цитата динозавра
Тут меня извините, я не правильно выразился, а вы не правильно поняли. Системный настройщик уведомлений я тестировал на всех системах по умолчанию, на нескольких 32 и 64. Установщик по двойному клику запустится, но сработает, как и надо Quit. Но его просто можно запустить от имени и никакой Quit уже не сработает. »

Скрипт в любом случае работает как надо, но непонимание того, как оно работает в сочетании с неясным ТЗ даёт результат "не работает".

Для начала стоит конкретизировать условия (мини-ТЗ) и только потом уже подбирать решение.
Если будет необходимость продолжать реализацию на UserInfo/IsUserAdmin, то предварительно следует изучить вывод этих команд при разных условиях запуска без условий {If/Else} -- тупо вызвать, забрать значение и вывести его в DetailPrint/MessageBox).
А потом ещё, по-хорошему, следует проверить и наличие конкретных привилегий у пользователя (на запись в фс/реестр, ...) ...
Ради чего это всё? Оно точно надо?

Может всё-таки подобрать более популярное решение?

Цитата:

Цитата динозавра
Юмор ценю. Спасибо. »

Этот юмор демонстрирует довольно серьёзную проблему, от которой и плодится велосипедостроение со всеми сопутствующими проблемами, выливающимися в "(Windows|Linux|MacOs|SomeSoftwareName) - глюкало|тормозило|отстой!"

динозавра 30-01-2021 22:09 2948074

iglezz,
XY-проблема. Читал углубленно.
Напишу как было.
При неком разговоре один грамотный человек мне сказал следующее: "Для инсталлятора с высокими правами, который будет применяться в системах с включенным UAC не существует железного способа автоматической отмены установки, если пользователь оказался с малыми правами. Это закончилось в эпоху ХР".
Объяснять он не стал, господь не дал ему такой способности. Я насобирал в инете примеров авто отмены по привилегиям и решил доказать обратное. Но, увы все оказалось истинной. Потом я задал вопрос здесь, в надежде, что тут уже чего то придумали. Но тут началось обсуждение проблемы Y вместо X, на основе Z, почти не касаясь X.
Подтянутся знатоки с регалиями, и не прочитав или не поняв фразы, которую сказал мне один грамотный человек подытожат XY на основе Z. Проще говоря весь смысл сведется к "сам дурак".
Так что вопрос исчерпан.
ЗЫ. Если у меня с вами проблема XY происходит по недоразумению из-за моей глупости, то в мировой политике сплошь и рядом и преднамеренно. Это шутка. Общие Правила конференции не нарушены.

iglezz 31-01-2021 00:57 2948113

динозавра,
Цитата:

При неком разговоре один грамотный человек мне сказал следующее: "Для инсталлятора с высокими правами, который будет применяться в системах с включенным UAC не существует железного способа автоматической отмены установки, если пользователь оказался с малыми правами. Это закончилось в эпоху ХР". »
Вот плохо, что человек объяснять не стал, ибо неточные формулировки могут допускать разночтения, ведущие к потерям времени на ненужные дискуссии и ковырялово в поисках информации/доказательной базы.
Конкретно эта формулировка не имеет смысла, т.к. в случае установщика, требующего админских прав, будет запрос UAC на старте. Прошёл - теперь права точно есть, установщик запускается и спокойно отрабатывает. А нестандартные сценарии должны быть головной болью админа системы, не сборщика установщика.
А в случае установщика, которому где-то внутри нужны админские права, проверка прав ведёт к всё тому-же UAC, т.к. до него о наличии прав у пользователя достоверно неизвестно.

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

Цитата:

Цитата динозавра
Потом я задал вопрос здесь, в надежде, что тут уже чего то придумали. »

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

Цитата динозавра
Но тут началось обсуждение проблемы Y вместо X, на основе Z, почти не касаясь X. »

Так часто случается в условиях недостатка конкретики...

динозавра 31-01-2021 12:04 2948135

iglezz,
Цитата:

Так часто случается в условиях недостатка конкретики...
Я же написал, что вопрос исчерпан, а вы все философствуете. Не смогли услышать и понять, ну и ладно.
У вас не XY-проблема, а проблема начальника
Философствуйте дальше.

K.A.V. 01-02-2021 20:55 2948383

Вложений: 1
Ну вы даёте, ребята :o
Не в обиду будет сказано, но всё то, что выше описал динозавра о якобы некорректном коде с IsUserAdmin и RequestExecutionLevel прямо говорит о небольшом непонимании, как это всё работает.
Может, вся проблема в том, что человек просто не понимает, для чего нужно RequestExecutionLevel/манифест и что происходит, когда он "повышает" права через UAC (Запуск от имени)?

Простой пример:
Цитата:

Цитата динозавра
Но его просто можно запустить от имени и никакой Quit уже не сработает. »

Конечно, "От имени" - это означает, что вы вышли из системы с ограниченными правами (Вы уже не Вася) и залогинились под другой учетной записью с правами админа (Вы уже Антон)
Цитата:

Цитата динозавра
В нашей справке. Не указано, что тот код, что там, и мои в том числе работают только в ХР, ну еще на других с полностью отключенным UAC. С включенным UAC по рекомендованному умолчанию любой бесправный пользователь от имени установит прогу или чего там. Нужно только паролить. »

Всё работает правильно, просто вы не понимаете, как это работает ;)

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

Вы просто неправильно понимаете смысла запуска приложения через UAC (Запуск от имени администратора) и как это отразится на уровне скрипта и работе пакета установки
Вся соль в том, что когда вы повышаете права через UAC (или прописываете в скрипте RequestExecutionLevel admin), то вы можете забыть про своего "оригинального" пользователя в скрипте, под которым работаете (его имени пользователе и типе учетной записи), по-крайней мере голыми средствами NSIS вы не узнаете правды о запустившем инсталлятор (но есть но (в конце ;)))

На пальцах:
1. Вася (не админ) => RequestExecutionLevel user => В скрипте: Вася (IsUserAdmin == 0)
2. Вася (не админ) => RequestExecutionLevel admin => В скрипте: Антон (IsUserAdmin == 1)

Не понимаю, зачем такое (опять же) извращение с определением типа учетной записи/закрытие инсталлера и т.д. (вы точно установщик пишите?)
Т.к. нормальные установщики "без задних мыслей" никогда не стесняются попросить ОС дать ей чуточку привилегий, чтобы избавить всех от лишних проблем и правильной установки ПО

Можно, конечно, попробовать пойти другим путём и повышать права самостоятельно через ShellExecEx, запоминать от имени какой учетной записи был изначально запущен процесс установки.
Но выглядит это довольно странно :)

1. RequestExecutionLevel user
2.
Код:

!include ".\ShellExecEx.nsh"
3. Распаковть ShellExecEx.nsh в папку со своим скриптом установщика
4. При запуске установщика определяем тип учетной записи и имя пользователя, если нужно для дальнейших извращений - где-нибудь сохраняем
5. В нужном месте запускаем сами себя с просьбой о повышении прав
Код:

${ShellExecEx} $0 'runas' '"$EXEPATH"' '' '' '' 2
Дальше делайте что хотите...Закрывайте оригинальный процесс под Васей не админом, проверяйте статус процесса и т.д.

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

Или я тут жути нагнал и не понял, о чем вы? :dont-know

Iska 01-02-2021 22:25 2948396

Цитата:

Цитата K.A.V.
…то вы можете забыть про своего "оригинального" пользователя в скрипте, под которым работаете (его имени пользователе и типе учетной записи), »

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


3. Антон (админ) => RequestExecutionLevel admin => В скрипте: Антон (IsUserAdmin == 1) — так должно работать?

K.A.V. 01-02-2021 22:41 2948398

Цитата:

Цитата Iska
3. Антон (админ) => RequestExecutionLevel admin => В скрипте: Антон (IsUserAdmin == 1) — так должно работать? »

Да, я просто описывал ситуацию при работе в ограниченной учетной записи :)

Iska 01-02-2021 22:54 2948403

K.A.V., спасибо, ясно.

Kopejkin 02-02-2021 17:16 2948500

Не могу сообразить! Подскажите, пожалуйста.
Нужно найти строку, например, 127.0.0.1 www.somesite.net в файле hosts и если строка существует, выполнить действие не связанное ни с найденной строкой, ни с самим файлом.

Begin2Fly 02-02-2021 17:41 2948502

Цитата:

Цитата Kopejkin
Не могу сообразить! Подскажите, пожалуйста.
Нужно найти строку, например, 127.0.0.1 www.somesite.net в файле hosts и если строка существует, выполнить действие не связанное ни с найденной строкой, ни с самим файлом. »

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

MKN 04-02-2021 12:00 2948762

Цитата:

Цитата Begin2Fly
Можно, конечно, попроще переписать »

Да уж, там портянка из кода ещё та... :)
Лучше использовать NewTextreplace плагин (поддерживает utf-8, utf-16LE / BE и все ANSI) :
Код:

OutFile "NewTextReplaceTest.exe"
!include "NewTextReplace.nsh"

Section
${textreplace::FindInFile} "$EXEDIR\my_file.txt" "слово" "/S=1" $0  ; /S=1 С учетом регистра (быстрее)
MessageBox MB_OK "$0" ; если 1 - слово найдено
${textreplace::Unload}
SectionEnd

В плагине ещё много полезных функций и ключей.

MKN 05-02-2021 13:35 2948902

Подскажите пожалуйста, как лучше (и попроще) реализовать такую задачу ? :

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

ps Попутно вопрос - в ToolTip плагинах (ToolTips.dll или nsTips от kotkovets ) всплывающее сообщение через некоторое время закрывается-исчезает. Можно ли этого избежать ? (Т.е., пока курсор или указатель мыши находятся на элементе, сообщение "удерживается" на месте.)

динозавра 05-02-2021 15:37 2948931

K.A.V., здравствуйте. Спасибо за разложенный по полочкам ответ. Все просто и в доступной форме.
Я сумел связаться с человеком из-за фразы, которого произошел весь этот сыр - бор. Напомню ее:
"Для инсталлятора с высокими правами, который будет применяться в системах с включенным UAC не существует железного способа автоматической отмены установки, если пользователь оказался с малыми правами. Это закончилось в эпоху ХР".
Я дал ссылку на мои попытки объяснить.

Вот его ответ. В начале были смайлы смеха:

"Настаиваю! Невозможно сделать установщик с высокими правами с предоставленными примерами кодов , чтобы запустил его бесправный пользователь при включенном UAC и всплыло инф. сообщение "Нет прав администратора. До свидания !", после которого последовала бы команда quit и произошло завершение. Такое с включенным UAC сделать не возможно. Система переберет права на себя и чихать она хотела на ваше написанное MessageBox MB_OK "Нет прав администратора. До свидания !" и следующее за ним quit. Такой фокус закончился в ХР. Ты в теме не верно задал вопрос, следовательно получил множество толкований не по сути. А суть я выше описал. Тебе должны были кратко ответить, что никакого сообщения и завершения с включенным UAC не будет. Точка. А тебе начали рассказывать о принципах работы контроля учетных записей.
Я сейчас "на пальцах" тебе докажу, что те коды не рабочие и рабочие. В зависимости, что подразумевать под термином "рабочие".
И так.
Первый пример. Если ты в код пишешь проверку на "бесправного" с сообщением и завершением, а "бесправный" с включенным UAC сообщение не увидит, и завершение не произойдет значит код не исполнил записанные в нем действия. Код не рабочий. Точка.
Второй пример. Если ты в код пишешь проверку на "бесправного" с сообщением и завершением и система правильно определила "бесправного", но проигнорировала заложенное в коде сообщение и завершение, тем самым дав возможность продолжить установку от админа, с условием, что запись админа не под паролем. Система предусмотрела, что админ с отсутствием пароля может доверять "бесправному". Код рабочий. Точка.
Умная система игнорирует примитивный код."


Лично я все понял. Действительно доступно и без высоких материй. А я считал, что этот человек совсем не умеет объяснять. Вопрос закрыт.

K.A.V. 06-02-2021 09:34 2948995

Цитата:

Цитата MKN
На кастомной странице есть созданное новое окно или область ListBox + разные элементы (чекбоксы, кнопки...).
Необходимо, при наведении указателя мыши или курсора на какой либо элемент(например на чекбокс) послать в это окно или ListBox(отобразить в нём) некую информацию (из переменной) на время "наведения" (если указатель перемещён с элемента, инфа исчезает).
Нечто по аналогии с выводом ToolTips, только не во всплывающем окне, а в имеющемся. »

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

Цитата:

Цитата MKN
ps Попутно вопрос - в ToolTip плагинах (ToolTips.dll или nsTips от kotkovets ) всплывающее сообщение через некоторое время закрывается-исчезает. Можно ли этого избежать ? (Т.е., пока курсор или указатель мыши находятся на элементе, сообщение "удерживается" на месте.) »

Насчет плагинов не скажу, но можно напрямую в NSIS запихнуть (один фиг ты будешь курсор отслеживать на элементах ;))

о, готовый код
Код:

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

Name nsDialogs
OutFile nsDialogs.exe
RequestExecutionLevel user
ShowInstDetails show

Var Dialog

Var hwnd_Text # хэндл текстового поля
var hwnd_Button # хэндл кнопки, над которой отслеживаем курсор
var onMouseOverFuncAddr # адрес функции, которая будет выполняться при отслеживании курсора
var ttip

Page custom pgPageCreate pgPageLeave
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"


##########################################
# ToolTip
##########################################
!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

Function ShowToolTip
StrCpy $2 $ttip
 System::Call 'USER32::IsWindowVisible(ir2)i.r0'
 ${If} $0 == 0
 pop $1
 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}
    FindWindow $3 "#32770" "" $HWNDPARENT
    System::Call '*(i40,i${TTF_SUBCLASS},i$3,i0x408,i,i,i,i,i0,tr1)i.r1'
    SendMessage $ttip ${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
 ${EndIf}
FunctionEnd
##########################################
# ToolTip
##########################################
       

Function my_onMouseOver # функция с выполнением по таймеру, здесь можно отслеживать курсор на всех элекемнтах диалога
; получаем координаты курсора
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
; в переменной $1 теперь хэндл элемента, над которым курсор

 ${If} $1 = $hwnd_Button
    ${NSD_SetText} $hwnd_Text "Курсор над кнопкой"
    push "мой текст в tooltip"
    call ShowToolTip
 ${Else}
    ${NSD_SetText} $hwnd_Text "Курсор вне кнопки"
    SendMessage $ttip ${TTM_ACTIVATE} 0 0
 ${EndIf}

FunctionEnd


Function .onInit
 GetFunctionAddress $onMouseOverFuncAddr my_onMouseOver ; получаем адрес функции, которая будет выполняться по таймеру для отслеживания курсора
FunctionEnd


Function pgPageCreate
    nsDialogs::Create 1018
    Pop $Dialog

    ${If} $Dialog == error
        Abort
    ${EndIf}
   
    ${NSD_CreateText} 30% 10u 40% 15u "..."
    Pop $hwnd_Text
   
    ${NSD_CreateButton} 30% 50u 40% 12u "Кнопочка"
    Pop $hwnd_Button

    nsDialogs::CreateTimer $onMouseOverFuncAddr 100 ; создаём таймер для отслеживания курсора

    nsDialogs::Show
FunctionEnd

Function pgPageLeave
FunctionEnd

Section
SectionEnd



ps
Красоту и качество кода не гарантирую, уж простите, давно этим не занимался

Vasyutin 07-02-2021 10:15 2949097

Добрый денечек. Много лет читаю эту замечательную темку. Образования в этом деле не имею. Но с темы по мелочам все понятненько. Несколько раз делал шутки в виде сообщений в несколько ходов с вопросами и подсовывал их жене вместо ее браузера. Во смеху было. А сейчас совсем я в непонятках с этими RequestExecutionLevel. Такой вопросик. Какая получается разница если установщик позначен RequestExecutionLevel highest или RequestExecutionLevel admin. Интересует чтобы мой файлик смог сделать то что делает администратор. Для этого нужно только обязательно RequestExecutionLevel admin? Или подойдет RequestExecutionLevel highest? Как я понял в установщика с RequestExecutionLevel admin самые высокие права. Тогда какие функции теряет установщик с RequestExecutionLevel highest в сравнении с RequestExecutionLevel admin? Совсем не понятно. Если не тяжело, пожалуйста объясните простенько. Спасибочки.

MKN 04-03-2021 15:22 2951761

Простая (казалось бы...) задача : Нужно определить наличие ключей в реестре.
ОС Windows 10 (20h2) x64, ключи :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsSelfHost\UI\Visibility
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender\Spynet

Не тут то было... Права доступа похоже не при чём (да и вроде как не нужны для этого...).

Пример, который нормально работает (проверял в W7) с "крутым" владельцем другого ключа ( с TrustedInstaller) :
Код:

!addplugindir .
!include "LogicLib.nsh"
!include "Registry.nsh"
OutFile "IfKeyExists-test.exe"
RequestExecutionLevel admin
Var NameKey

Section
StrCpy $NameKey "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\AGP" 
ClearErrors
${registry::KeyExists} "$NameKey" $R0
${If} $R0 = -1
MessageBox MB_OK "NO Key"
${ElseIf} $R0 = 0
MessageBox MB_OK "OK!"
${EndIf}
${registry::unload}
SectionEnd

Этот же пример (и с EnumRegKey тоже) не работает в W10 с вышеназванными ключами...
В чём дело ? Кто "охраняет" конкретно эти ключи ? У кого какие соображения ?

ps к слову сказать, эти ключи не находятся при получении ACL, и при использовании команд PowerShell, и при работе с subinacl.exe...

iglezz 04-03-2021 16:24 2951765

Цитата:

Цитата MKN
В чём дело ? »

Элементарно, Ватсон! Ключи эти существуют только для 64бит приложений :)

Примерно таким макросом можно оформить проверку:
Код:

# macro + def
!define RegKeyExists '!insertmacro RegKeyExists'
!macro RegKeyExists RETURN ROOTKEY SUBKEY
    Push $0
   
    ClearErrors
    EnumRegValue $0 ${ROOTKEY} "${SUBKEY}" 0
    IfErrors 0 +5
    EnumRegKey $0 ${ROOTKEY} "${SUBKEY}" 0
    IfErrors 0 +3
    StrCpy ${RETURN} 0
    Goto +2
    StrCpy ${RETURN} 1
   
    Pop $0
!macroend

# Example
${RegKeyExists} $R0  HKLM64 "SOFTWARE\Microsoft\WindowsSelfHost\UI\Visibility"


MKN 04-03-2021 17:08 2951767

Цитата:

Цитата iglezz
Ключи эти существуют только для 64бит приложений »

А в 32 битных их разве нет ?
И я вроде как "выудил" эти ключи из реестра, в том же виде, какими они и были в x64... Или в рег-плагине необходимо конкретно указывать на разрядность ОС ? (в доке этого не видел...) Вероятно забыл про SetRegView 64...
и как быть с репликой из ps ?

iglezz 04-03-2021 17:43 2951769

MKN,
Да, в 32 битных их нет. Это легко увидеть, если открыть 32-битный %WINDIR%\SysWOW64\regedit.exe
Ключей WindowsSelfHost и Windows Defender там не будет.

Что до плагина, то он староват и не в курсе про реестр в x64.
"В крации", реестр в x64 состоит из трёх загончиков (общий, 32бит, 64 бит), и для доступа во чужой загончик надо использовать волшебное слово при использовании функций WinAPI. Плагин таким фокусам не обучен, add: но на него действует SetRegView 64

Цитата:

Цитата MKN
и как быть с репликой из ps ? »

это про что?

MKN 04-03-2021 17:49 2951770

Цитата:

Цитата iglezz
Что до плагина, то он староват и не в курсе про реестр в x64. »

Как же всё-таки определять подобные ключи в x64 ? Что то я туплю под вечер...
Цитата:

Цитата iglezz
это про что? »

Это я про работу subinacl. Собственно от неё у меня всё и пляшет... Но закрадывается смутное сомнение , что и эта утилитка тоже устарела и с x64 ключами не дружит...

iglezz 04-03-2021 18:15 2951772

Цитата:

Цитата MKN
Как же всё-таки определять подобные ключи в x64 ? »

Часть ключей задокументирована - Redirected, Shared, and Reflected Keys Under WOW
Для остального можно дёрнуть ключ отдельно в 32 и 64 бит режиме и сравнить выхлоп. Даже батничком на `reg query %REGPATH% /ve` можно реализовать.
Цитата:

Цитата MKN
Это я про работу subinacl. »

На замену subinacl вроде должен setacl подойти.

MKN 04-03-2021 18:23 2951773

Цитата:

Цитата iglezz
даже батничком на `reg query %REGPATH% /ve` можно реализовать »

Как то не эстетично для NSIS... А по иному разве нельзя ? (или хотя бы на "командной базе" сделать .nsh, для короткой строки детекта в скрипте... )
Цитата:

Цитата iglezz
На замену subinacl вроде должен setacl подойти. »

Нужно получить данные о правах ключей... setacl не умеет, а subinacl похоже не умеет работать с x64 ключами... Засада...
Хотя AccessControl plug-in с большим трудом всё же упросил доработать, но нужный инфо-вывод в SDDL формате... Надо как то парсить-расшифровывать. Одна морока...

iglezz 04-03-2021 20:53 2951776

MKN, Вот такой макрос получился
nsis RegKeyExists
Код:

# RETURN value:
#  0 : not exists
# >0 : exists
!define RegKeyExists '!insertmacro RegKeyExists'
!macro RegKeyExists RETURN ROOTKEY SUBKEY
    Push $0
    Push $1
   
    StrCpy $0 0
   
    SetRegView 32
   
    ClearErrors
    EnumRegKey $1 ${ROOTKEY} "${SUBKEY}" 0
    IfErrors +2
    IntOp $0 $0 + 1
   
    SetRegView lastused
   
    ${If} ${RunningX64}
    SetRegView 64
   
    ClearErrors
    EnumRegKey $1 ${ROOTKEY} "${SUBKEY}" 0
    IfErrors +2
    IntOp $0 $0 + 1
   
    SetRegView lastused
    ${EndIf}
   
    Pop $1
    Exch $0
    Pop ${RETURN}
!macroend


Если есть необходимость знать точно, существует ключ для 32 или 64 бит процесса, то чуть сложнее будет

Внезапно оказалось, что SetRegView 64 благотворно влияет на плагин registry.
Код:

${registry::KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender\Scan" $1
возвращает 0, т.е. ключ найден

Цитата:

Цитата MKN
но нужный инфо-вывод в SDDL формате... Надо как то парсить-расшифровывать. »

С виду парсится должно без хлопот даже в nsis...

MKN 05-03-2021 10:05 2951799

Цитата:

Цитата iglezz
Внезапно оказалось, что SetRegView 64 благотворно влияет на плагин registry. »

Я это тоже осознал :).
Цитата:

Цитата iglezz
С виду парсится должно без хлопот »

Не подскажешь соотв. утилитку ком строки (если существует...) ?

ps А что делает SetRegView lastused, если популярно разъяснить ? Возвращает в исходное состояние чтение\запись из\в реестре ? Т.е. всё равно это эквивалентно записи SetRegView32(64) в нужном месте кода ?

iglezz 05-03-2021 11:47 2951808

Цитата:

Цитата MKN
Не подскажешь соотв. утилитку ком строки (если существует...) ? »

не встречал, но возможно проще будет парсить выхлоп SetACL, т.к. там есть возможность вывода в виде таблицы с табами в качестве разделителей:
Скрытый текст
для команды
Код:

setacl -on "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender\Scan" -ot reg -actn list -lst "f:tab;w:d;i:y;s:y"
выхлоп:
Код:

machine\SOFTWARE\Microsoft\Windows Defender\Scan

  DACL(not_protected+auto_inherited):
  S-1-15-2-1  read  allow  inherited
  S-1-15-2-1  read  allow  container_inherit+object_inherit+inherit_only+inherited
  S-1-15-3-1024-3153509613-960666767-3724611135-2725662640-12138253-543910227-1950414635-4190290187  read  allow  inherited
  S-1-15-3-1024-3153509613-960666767-3724611135-2725662640-12138253-543910227-1950414635-4190290187  read  allow  container_inherit+object_inherit+inherit_only+inherited
  S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464  full  allow  inherited
  S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464  full  allow  container_inherit+object_inherit+inherit_only+inherited
  S-1-5-80-1913148863-3492339771-4165695881-2087618961-4109116736  full  allow  inherited
  S-1-5-80-1913148863-3492339771-4165695881-2087618961-4109116736  full  allow  container_inherit+object_inherit+inherit_only+inherited
  S-1-5-18  full  allow  inherited
  S-1-5-18  full  allow  container_inherit+object_inherit+inherit_only+inherited
  S-1-5-32-544  read+KEY_CREATE_LINK  allow  inherited
  S-1-5-32-544  read+KEY_CREATE_LINK  allow  container_inherit+object_inherit+inherit_only+inherited
  S-1-1-0  read+KEY_CREATE_LINK  allow  inherited
  S-1-1-0  read+KEY_CREATE_LINK  allow  container_inherit+object_inherit+inherit_only+inherited


По SetRegView:
При выполнении SetRegView 32|64 предыдущее состояние (32/64) сохраняется и с помощью SetRegView lastused его можно восстановить обратно.

MKN 04-05-2021 10:10 2956988

Появилась UNICODE версия NSIS Simple Service Plugin
https://nsis.sourceforge.io/mediawik...icode_1.30.zip

Serg866 05-06-2021 02:58 2959530

Здравствуйте
При установке обновлений для моего приложения, проверяется хеш-сумма файла (использую плагин md5). Возникла необходимость этот файл изменить, но при этом сохранить возможность установки уже выпущенных дополнений. Соответственно нужно изменить проверяющийся файл, сохранив его хеш сумму. По байтам размер останется прежним.
Можно ли реализовать такую задачу и что вообще можно сделать в данной ситуации?
Заранее спасибо!
---
Сохранить хеш-сумму файла, скорее всего, не получится. Может как-то повлиять на проверку хеш-суммы в уже выпущенных инсталляторах, чтобы она в них не срабатывала на этом файле после того как будет установлена новая версия основной программы с обновлённым файлом. То есть в новую версию проги надо что-то включить, что могло бы запретить предыдущим инсталлерам выполнять проверку md5 конкретного файла.

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

Использовался MD5 plugin, код проверки:

md5dll::GetMD5File "$INSTDIR\upd0.vers"
Pop $0
${If} $0 != "B30912CF87B0AC002A350AB8BD2314CE"
MessageBox MB_OK|MB_ICONSTOP "Ошибка!" IDOK
Quit

MKN 05-06-2021 11:12 2959538

Serg866,
Почитай про https://nsis.sourceforge.io/Docs/VPatch/Readme.html и https://nsis.sourceforge.io/WPatch_plug-in.
Может подойдёт для твоих целей...
Ну, и теоретически хэш можно изменять...
https://xakep.ru/2012/11/22/light-fake-checksum/#toc05.

Serg866 05-06-2021 17:38 2959549

MKN, патчи для инсталлов - не вариант. Если я правильно понял функции этих плагинов.

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

MKN 06-06-2021 16:55 2959590

Serg866,
Я предположил, что инсталлятор "базовой" твоей проги тобой и написан. Патч входит в обновление и запускается первым изменняя базовой инсталлятор так, чтобы в нём отключилась проверка хэша. После чего запускается базовая установка и обновление. Или всё не так ? :)

Kopejkin 06-06-2021 20:30 2959605

Непонятна логика обновления. Зачем "обновлять" новую версию старыми обновлениями? Или это не обновления, а какие - то файлы, сопутствующие основному исполняемому файлу?

Serg866 06-06-2021 23:09 2959611

MKN, Kopejkin, есть основная программа, есть дополнения для неё (и то, и другое сделано мной). В инсталлерах дополнений встроена проверка хеша. Но так как в новой версии основной программы проверочный файл изменится, то ранее выпущенные дополнения не смогут установиться поверх новой версии. А надо сделать так, чтобы устанавливались. При этом нужно обойтись без какой-либо правки инсталлеров дополнений, так как они давно выпущены и скачаны большим количеством пользователей.

iglezz 07-06-2021 09:22 2959621

Serg866,
Если файл "$INSTDIR\upd0.vers" не сильно большого размера, то можно обойтись костылём в виде сервисной программы типа "Установка дополнений от х.хх на новую версию х.хх", которая подменит новый upd0.vers на старый на время установки дополнений.

Serg866 07-06-2021 20:12 2959662

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

Begin2Fly 07-06-2021 20:39 2959669

Serg866, как вариант: оставьте старый файл для совместимости и введите с последним обновлением ещё один, внеся соответствующие изменения в программу.

iglezz 07-06-2021 21:00 2959670

Цитата:

Цитата Serg866
как файл после подмены вновь заменится на новый? Это надо пояснять юзерам. С таким костылем может получиться так, что будет старый файл, а версия программы - новая. И наоборот »

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

Serg866 07-06-2021 22:24 2959672

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

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

Serg866 08-06-2021 20:52 2959749

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

Kopejkin 09-06-2021 10:02 2959784

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

Function .onVerifyInstDir
      IfFileExists "$INSTDIR\имя-моей-программы.exe" PathGood
      Abort
      PathGood:
FunctionEnd

Или ваши дополнения могут работать с любым исполняемым файлом? Уверен, что нет! Я просто не могу въехать, зачем проверять контрольную сумму главного исполняемого файла, если все выпущенные до этого дополнения работают с любой версией этого файла?

Serg866 10-06-2021 05:06 2959885

Kopejkin, главный исполняемый файл (ехе инсталлятора) никак не проверяется. Речь о проверочном файле, с которого считывают хеш-сумму инсталлятоы дополнений. В новой версии программы проверочный файл заменяется, соответственно дополнения не установятся поверх новой версии программы, ибо файл будет с другой хеш-суммой. Ищу вариант как сделать так, чтобы устанавливались, так как технически и с новым файлом дополнения совместимы.

Kopejkin 10-06-2021 21:53 2959991

Так я ж предложил...
Цитата:

Цитата Kopejkin
Объявляете своим преданным пользователям о глобальном апдейте, все (или не все, если нужно) актуальные дополнения пихаете в один новый инсталлятор без проверок контрольной суммы ... файла. »

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

Adjective 18-07-2021 01:32 2962357

Всем привет!
Подскажите пожалуйста, что не так с кодом удаления ранее установленной версии программы в оригинальном файле "makensis.nsi" находящемся по пути: (..\NSIS\Examples\makensis.nsi)?
Судя по коду предоставленном на официальном сайте данный код "как я понял" он работает по поиску идентификатора, а в "makensis.nsi" он работает по версии записанной в реестре. Здесь на форуме нашел ещё один вариант (по поиску указанного файла) с функцией .onInit:
Код:

Exec $INSTDIR\uninst-nsis.exe
Но это не то, хоть и работает ЕСЛИ файл ИМЕННО с таким именем существует и расположен ИМЕННО по пути по умолчанию. В "makensis.nsi" более правильный вариант определения установленной программы (на мой взгляд), но не работает.
Сам "makensis.nsi" наверное нет смысла выкладывать, так как он идет по умолчанию в директории nsis.

iglezz 18-07-2021 23:25 2962400

Adjective,
Цитата:

Подскажите пожалуйста, что не так с кодом удаления ранее установленной версии программы в оригинальном файле "makensis.nsi"
А что именно с ним не так и что именно там не работает?

И в makensis.nsi, и в вышеуказанном "Auto-uninstall old before installing new" используется абсолютно одинаковый метод обнаружения установленной программы (считывание ключа UninstallString в ..\CurrentVersion\Uninstall\..). Вариант в makensis.nsi не стоит считать более правильным, т.к. во втором случае (auto-uninstall) считывание версии просто не требуется (хотя это можно применить, например, при записи журнала установки).

В makensis.nsi, как и в вышеуказанном "Auto-uninstall old before installing new" используется похожий метод обнаружения установленной программы -- считывание ключа UninstallString в ..\CurrentVersion\Uninstall\... Только что дополнительно читается HKLM\Software\NSIS\@, а затем проверяется версия для реализации разных сценариев (Add/Reinstall - Uninstall - Do not uninstall)

Вариант в makensis.nsi не стоит считать более правильным, т.к. во втором случае (auto-uninstall) считывание версии просто не требуется (хотя это можно применить, например, при записи журнала установки).

Вариант с Exec $INSTDIR\uninst-nsis.exe, очевидно, рассчитан на использование атрибута InstallDirRegKey или установку по жёстко заданному пути.

Adjective 19-07-2021 06:22 2962407

Цитата:

Цитата iglezz
А что именно с ним не так и что именно там не работает? »

Спасибо за отзыв iglezz.
Не работает код определения ранее установленной версии (программы).
Ссылка

iglezz 19-07-2021 21:50 2962477

Adjective,
Работает, если правильно собрать. Для текущего релиза это будет команда (текущий путь - ${__FILEDIR__}):
Код:

..\makensis.exe /DVERSION=3.06.1 /DVER_MAJOR=3 /DVER_MINOR=6 /DVER_REVISION=1 /DVER_BUILD=0 makensis.nsi
По умолчанию всё это добро не определено и кастомная страница с определением версии просто не включается в установщик:
Код:

!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD
Page custom PageReinstall PageLeaveReinstall
!endif


Adjective 20-07-2021 10:45 2962505

iglezz,
Спасибо, получилось выполнить сборку через командную строку:
Код:

..\makensis.exe /DVERSION=3.06.1 /DVER_MAJOR=3 /DVER_MINOR=6 /DVER_REVISION=1 /DVER_BUILD=0 makensis.nsi
выполнив её непосредственно из папки ..\NSIS\Examples\ и окно деинсталляции отобразилось.

MKN 02-10-2021 09:46 2967914

Обновил NSIS до 3.08.
Сразу же появилась ошибка при компиляции, связанная с DelRegKey.nsh :

!include: error in script: "C:\Program Files\NSIS\Include\DelRegKey.nsh" on line 4
(на 4 строке : !verbose 3)

а также ругань на соотв. строку в скрипте, где - !include "DelRegKey.nsh"

Как бы это исправить ?

ps откатился на v 3.06.1 - всё ок

iglezz 03-10-2021 17:33 2968013

MKN, возможно дело в неверно распознанной компилятором кодировки DelRegKey.nsh
По крайней мере у меня 3.08 и 3.06.1 считали этот файл как UTF8
Скрытый текст
Код:

!include: "C:\PortableApps\NSIS308\Include\DelRegKey.nsh" (UTF8)
Bad text encoding: C:\PortableApps\NSIS308\Include\DelRegKey.nsh:4
!include: error in script: "C:\PortableApps\NSIS308\Include\DelRegKey.nsh" on line 4
Error in script "C:\PortableApps\NSIS308\Examples\example1DRK.nsi" on line 27 -- aborting creation process


Это лечится явным указанием кодировки включаемого файла
Код:

!include /charset=cp1251 delregkey.nsh

Сырок Дружба 18-01-2022 16:21 2978002

Вложений: 3
Доброго времени суток, товарищи знатоки. Есть вопрос. При переходе с кастомной страницы nsDialog-а на стандартную страницу MUI выбора директории футер ломается в шрифтах и масштабировании. При возврате к предыдущей странице ломается и она. Собственно вопрос - в чем косяк? Что, где, когда искать и чего почитать? Код и скриншоты прилагаю.

Код:

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

!define INSTALL_TYPE "SetShellVarContext all"

Name "Тестовая программа"
OutFile SoftSetup.exe
RequestExecutionLevel admin
ShowInstDetails show
InstallDir "$PROGRAMFILES\Soft"

Var Dialog
Var CheckSoft
Var CheckServer
Var CheckClient
Var CheckSoftSelect
Var CheckServerSelect
Var CheckClientSelect
Var BoxIP
Var EnterServerIP
Var ServerIP


!insertmacro MUI_PAGE_WELCOME
Page custom alPageCreate alPageLeave
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "Russian"

Function alPageCreate
        !insertmacro MUI_HEADER_TEXT "Настройки установки " "Выберете необходимые компоненты для установки"
       
        nsDialogs::Create 1018
        Pop $Dialog
       
        ${If} $Dialog == error
                Abort
        ${EndIf}
       
        ${NSD_CreateGroupBox} 10% 5u 80% 65u "Компоненты для установки "
        Pop $0
       
                ${NSD_CreateCheckBox} 15% 20u 40% 10u "Установка компонента 1"
                Pop $CheckSoft
               
                ${NSD_CreateCheckBox} 15% 35u 40% 10u "Установка компонента 2"
                Pop $CheckServer
               
                ${NSD_CreateCheckBox} 15% 50u 40% 10u "Установка компонента 3"
                Pop $CheckClient
                ${NSD_OnClick} $CheckClient ServerIpDialog
       
        ${NSD_CreateGroupBox} 10% 75u 80% 40u "IP адрес базы данных"
                Pop $BoxIP
                ShowWindow $BoxIP ${SW_HIDE}
                ${NSD_CreateIPAddress} 15% 90u 55% 14u $EnterServerIP
                Pop $EnterServerIP
                ShowWindow $EnterServerIP ${SW_HIDE}
       
        nsDialogs::Show
FunctionEnd

Function ServerIpDialog
                Pop $CheckClient
                Pop $BoxIP
                ${NSD_GetState} $CheckClient $0
                ${If} $0 == 1
                        ShowWindow $EnterServerIP ${SW_SHOW}
                        ShowWindow $BoxIP ${SW_SHOW}
                ${Else}
                        ShowWindow $EnterServerIP ${SW_HIDE}
                        ShowWindow $BoxIP ${SW_HIDE}
                ${EndIf}
FunctionEnd

Section ""
        DetailPrint "Hello, World!"
SectionEnd


iglezz 18-01-2022 17:59 2978017

Сырок Дружба,
Косяк, в самом проблемном контроле SysIPAddress32.

Обходное решение (которое почему то не вошло в состав nsDialogs.nsh): https://nsis.sourceforge.io/NsDialogs_CreateIPaddress

В nsDialogs_createIPaddress.nsh необходимо будет закомментировать или удалить строки
Код:

        !define __NSD_IPaddress_CLASS SysIPAddress32
        !define __NSD_IPaddress_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}
        !define __NSD_IPaddress_EXSTYLE 0

        !insertmacro __NSD_DefineControl IPaddress


Сырок Дружба 19-01-2022 10:33 2978075

iglezz, понял, принял, пощупал, работает. Благодарю за помощь.
Можно вопрос в образовательных целях.
Смысл удаления/комментирования указанных вами строк?
Я так полагаю просто для того что бы не было обращения к багнутому контролу; или там повторное использование переменных?
Буду признателен за разъяснение.

iglezz 19-01-2022 15:38 2978114

Сырок Дружба,
Комментировать/удалять те строчки надо из-за конфликта с этими же дефайнами в nsDialogs.nsh.

Сырок Дружба 20-01-2022 10:36 2978237

iglezz, понял, принял. Ещё раз благодарю за помощь.

S60Team 03-02-2022 11:12 2979221

Доброго времени суток! Недавно задался вопросом, как определить Windows 11 в NSIS:
Начиная с ранней сборки "утекшей в сеть", в C:\Windows\System32 появился файл ntkrla57.exe.
Так что сначала определяю, есть ли ключ в реестре только для 10ки,
А потом проверяю, внимание! Не присутствие файла ntkrla57.exe, а его версию:
Скрытый текст
Код:

ClearErrors
ReadRegDWORD $R9 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentMajorVersionNumber"
IfErrors 0 Win_X
  StrCpy $R8 "8.1 or Server 2012 R2"
  Goto Win_End
Win_X:
  ClearErrors
  GetDLLVersion "C:\Windows\System32\ntkrla57.exe" $R0 $R1
  IfErrors 0 Win_11
    StrCpy $R8 "10 or Server 2016 - 2019"
    Goto Win_End
    Win_11:
      StrCpy $R8 "11 or Server 2022"
Win_End:
ClearErrors


Скрытый текст
Код:

ClearErrors
ReadRegDWORD $R9 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentMajorVersionNumber"
; Если записи в реестре нет, то это 8.1:
${If} ${Errors}
  StrCpy $R8 "8.1 or Server 2012 R2"
; А Если есть (10), то это 10 или 11:
${Else}
  ClearErrors
  GetDLLVersion "C:\Windows\System32\ntkrla57.exe" $R0 $R1
  ${If} ${Errors}
    StrCpy $R8 "10 or Server 2016 - 2019"
  ${Else}
    StrCpy $R8 "11 or Server 2022"
  ${EndIf}
${EndIf}
ClearErrors


Всё работает отлично!
ЗЫ: Пробовал проверять присутствие файла - не работает. Через WMI - нужно получить строку, потом определить, есть ли в строке "11"...
В общем, простыня кода.

iglezz 03-02-2022 12:36 2979228

S60Team, А не достаточно просто номер сборки глянуть? Вроде десятка до 22000 не поднимается.

В целом для проверки версий есть GetWinVer и WinVer.nsh (текущая версия на гитхабе)

S60Team 03-02-2022 15:25 2979237

iglezz, благодарю!
1. У 11ки номера сборок: 21996 и 22000. А вдруг билд 10ки 22H1 будет 22100?
2. Просто не хотелось подключать лишние библиотеки. Об этой версии не знал.
ЗЫ: если интересно, исходный код: https://gist.github.com/S60Team/36a48718640205e14b8a068b2b809c1f

динозавра 05-02-2022 23:40 2979375

Всем доброго вечера. Нужна помощь. Никак не могу сообразить, как удалить строчку с файла .xml.
Имеется файл
Код:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
        <Other Code="Некое значение">               
                <Data key="Некое значение">Некое значение</Data>
        </Other>
        <Paday Code="Некое значение">               
              <Data key="DelayPuk">999</Data>               
        </Paday>
</Configuration>

Как удалить из этого файла строчку
Код:

<Data key="DelayPuk">999</Data>
Примеров почти нету. А с удалением строчки вообще примера не нашел.

iglezz 06-02-2022 01:10 2979379

динозавра,
Пример почти такой же как и 2.5 года назад - тыц

nsisXML::select с почти идентичным селектором
nsisXML::parentNode вернёт в нужный регистр ссылку на родителя
nsisXML::removeChild удалит найденное в ::select

динозавра 06-02-2022 01:25 2979380

Спасибо. Буду дерзать. Совсем запутался.
.

динозавра 06-02-2022 09:55 2979386

iglezz,
Ура, получилось. Удаляет эту строчку. Но не совсем ура. Удаляет только в том случае, если эта строчка имеется в файле .xml. Если ее нет, то экзешник крошится.
Как прикрутить сюда проверку этой самой строчки, чтобы типа, если ее нет, то ничего не делать, а если есть, то удалить?

iglezz 06-02-2022 10:38 2979388

динозавра, Ну это же в документации есть:
Цитата:

nsisXML::select <XPath expression>
find the first node matching the given XPath expression and return its
reference in $1 and $2
if not found, reference will be 0
Если select вернёт 0 в вышеуказанных регистрах, то искомого выражения в файле нет и следующий за select`ом parentNode вызовет сбой.

динозавра 06-02-2022 11:16 2979390

iglezz,
Спасибо.
Все понятно.
Работает.

динозавра 06-02-2022 21:35 2979432

Всем доброго вечера. Опять нуждаюсь в помощи. Такая ситуация. На компе две или более учёток. Одна админ, остальные челядь. Установщик работает из под админа и устанавливает много чего в разные папки, реестр, драйвера. Но нужно установить обязательно всем пользователям папки с файлом по такому пути SetShellVarContext current $APPDATA\Папка\файл или $LOCALAPPDATA\Папка\файл. На всех компах учетки с разными именами. Абсолютный путь не катит. При такой прописке переменных, как я показал, кто бы не устанавливал, а достается одному админу. Остальным никак. Как это можно прописать, чтобы и остальным устанавливались папки?

iglezz 08-02-2022 02:34 2979497

динозавра,
Пример обхода учёток на локальном компе - EnumUsersRegEx.nsh + Example.

inco1 08-02-2022 02:48 2979498

Вложений: 1
динозавра,
Это можно сделать с помощью макроса от kotkovets.
Код:

!include "MUI2.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile GetUserSID.exe
Caption "GetUserSID"

!define GetUserSID "!insertmacro CallGetUserSID"

!macro CallGetUserSID USERNAME SID
      System::Store S
      StrCpy '$0' '${USERNAME}'
      StrCmp '$0' '' 0 +2
      ExpandEnvStrings '$0' "%USERNAME%"
      System::Call "*(&t1024)i.r1"
      System::Call "advapi32::LookupAccountName(tn,tr0,ir1,*i1024,tn,*i1024,*in)i.r0"
      IntCmp $0 1 0 +2 +2
      System::Call "advapi32::ConvertSidToStringSid(ir1,*t.s)"
      IntCmp $0 1 +2 0 0
      Push error
      System::Free $1
      System::Store L
      Pop "${SID}"
!macroend

!ifdef NSIS_UNICODE
  !define STR %s
!else
  !define STR %S
!endif

Section
  System::Call "netapi32::NetQueryDisplayInformation(wn,i1,i0,i-1,i${NSIS_MAX_STRLEN},*i.R0,*i.R1)i.R4"
  ${If} $R4 = 0
      ${For} $R4 1 $R0
        System::Call "*$R1(i.R2,i.R3,i,w,i,i)"
        IntFmt '$R2' ${STR} $R2
        IntFmt '$R3' ${STR} $R3
        ${GetUserSID} '$R2' '$R5'
        IntOp $R1 $R1 + 24

        SetOutPath "C:\Users\$R2\AppData\Roaming\test"
        File "test.txt"

      ${Next}
      System::Call "netapi32::NetApiBufferFree(iR1)"
  ${EndIf}
SectionEnd

Установит всем пользователям файл "test.txt" в директорию "C:\Users\%UserName%\AppData\Roaming\test"
Будет установлено всем найденным пользователям и активным и не активированным. Незадача в том, что в директории "Пользователи" могут появятся папки не активированных пользователей таких, как "Гость", "Администратор".
Как привинтить сюда фильтр, чтобы не устанавливалось не активированным пользователям понятия не имею.

динозавра 08-02-2022 13:02 2979540

iglezz,
Спасибо, но там без чекушки ничего не понятно, а после чекушки вообще.
inco1,
Это правильно работает, но на семерке в папку SetShellVarContext current $APPDATA добавились 2 профиля встроенных пользователей Гость и Администратор. А на одиннадцатой к ним присоединились интернетовский и еще какой то. Все эти учетки не активны. Не могу прикрутить логику, чтобы их отсеять. Может знатоки помогут в этом деле. Пробовал вот так, но не отсеиваются. Видимо нужен подход не моего уровня.

Код:

!include "MUI2.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile GetUserSID.exe
Caption "GetUserSID"

!define GetUserSID "!insertmacro CallGetUserSID"

!macro CallGetUserSID USERNAME SID
      System::Store S
      StrCpy '$0' '${USERNAME}'
      StrCmp '$0' '' 0 +2
      ExpandEnvStrings '$0' "%USERNAME%"
      System::Call "*(&t1024)i.r1"
      System::Call "advapi32::LookupAccountName(tn,tr0,ir1,*i1024,tn,*i1024,*in)i.r0"
      IntCmp $0 1 0 +2 +2
      System::Call "advapi32::ConvertSidToStringSid(ir1,*t.s)"
      IntCmp $0 1 +2 0 0
      Push error
      System::Free $1
      System::Store L
      Pop "${SID}"
!macroend

!ifdef NSIS_UNICODE
  !define STR %s
!else
  !define STR %S
!endif

Section
  System::Call "netapi32::NetQueryDisplayInformation(wn,i1,i0,i-1,i${NSIS_MAX_STRLEN},*i.R0,*i.R1)i.R4"
  ${If} $R4 = 0
      ${For} $R4 1 $R0
        System::Call "*$R1(i.R2,i.R3,i,w,i,i)"
        IntFmt '$R2' ${STR} $R2
        IntFmt '$R3' ${STR} $R3
        ${GetUserSID} '$R2' '$R5'
        IntOp $R1 $R1 + 24

        StrCpy $R6 "$R2"
        StrCpy $R7 "C:\Users\$R6"

        StrCmp $R7 0 Not
     
        SetOutPath "C:\Users\$R2\AppData\Roaming\test"
        File "test.txt"

        Not:

      ${Next}
      System::Call "netapi32::NetApiBufferFree(iR1)"
  ${EndIf}
SectionEnd


Kopejkin 14-02-2022 14:53 2980013

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

Код:

Name "Sample WPatch"
OutFile Sample.exe
ShowInstDetails show
InstallDir "$PROGRAMFILES\MOBILedit Enterprise"
Page directory
Page instfiles

 Section  "-Backup"
    SetOutPath $INSTDIR
      CreateDirectory "$INSTDIR\Backup"
      CopyFiles /SILENT $INSTDIR\Czech $INSTDIR\Backup 22000
          Sleep 500
 SectionEnd

Section
        InitPluginsDir
SectionEnd

!include WGenPatDir.nsh

Section
        IfErrors 0 +2
                MessageBox MB_OK "There has been some errors !"
SectionEnd


iglezz 14-02-2022 16:09 2980020

Kopejkin,
Самое важное находится в WGenPatDir.nsh. Его содержимое вопросов не вызывает?

Kopejkin 14-02-2022 17:58 2980025

Не вызывал, потому как и пример и мой сценарий работают с одним и тем же файлом WGenPatDir.nsh. Да и не знаю, что может в нем вызывать сомнения. Он создается автоматически при создании файла различий.
Если нужен:
WGenPatDir.nsh
Код:

!ifndef ADDEDSOURCE
!define ADDEDSOURCE 'changes\'
!endif

Function Patch
        DetailPrint 'Patch: $0'
        StrCpy $0 '$INSTDIR\$0'
retry:
        WPatch::PatchFile /NOUNLOAD        ; expects $0:file path, $1:options, $2:patch path
        IntCmp $1 0 continue can_skip 0
                SetErrors
can_skip:
                SetDetailsPrint listonly
                DetailPrint '=> Error $1'
                SetDetailsPrint both
                IntCmp $1 1 0 continue continue
                        MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION $(^FileError_NoIgnore) /SD IDCANCEL IDRETRY retry
                        Abort
continue:
FunctionEnd

Section 'ApplyPatch'
ClearErrors
SetOutPath '$PLUGINSDIR'
File WGenPatDir.pat
StrCpy $2 '$PLUGINSDIR\WGenPatDir.pat'
DetailPrint 'Checking before patch...'

StrCpy $0  'Czech\AppRoot.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 12'
Call Patch
StrCpy $0  'Czech\Archive.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 5915'
Call Patch
StrCpy $0  'Czech\Backup.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 7380'
Call Patch
StrCpy $0  'Czech\DataSource.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 9288'
Call Patch
StrCpy $0  'Czech\Error.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 10335'
Call Patch
StrCpy $0  'Czech\Exports.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 11501'
Call Patch
StrCpy $0  'Czech\FormatGUI.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 19057'
Call Patch
StrCpy $0  'Czech\Internet.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 36154'
Call Patch
StrCpy $0  'Czech\ItunesBackup.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 39281'
Call Patch
StrCpy $0  'Czech\Main.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 41655'
Call Patch
StrCpy $0  'Czech\mewconad.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 957752'
Call Patch
StrCpy $0  'Czech\mewconad.xml'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 961083'
Call Patch
StrCpy $0  'Czech\mewconap.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 963777'
Call Patch
StrCpy $0  'Czech\mewconap.xml'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 966308'
Call Patch
StrCpy $0  'Czech\mewconts.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 968220'
Call Patch
StrCpy $0  'Czech\mewconts.xml'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 970789'
Call Patch
StrCpy $0  'Czech\NewsTemplate.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 972759'
Call Patch
StrCpy $0  'Czech\Offline.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 973148'
Call Patch
StrCpy $0  'Czech\Online.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 975493'
Call Patch
StrCpy $0  'Czech\Outlook.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 978946'
Call Patch
StrCpy $0  'Czech\PlugBook.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 979935'
Call Patch
StrCpy $0  'Czech\PlugCopy.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1023434'
Call Patch
StrCpy $0  'Czech\PlugData.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1063175'
Call Patch
StrCpy $0  'Czech\PlugEmail.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1137068'
Call Patch
StrCpy $0  'Czech\PlugFS.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1138337'
Call Patch
StrCpy $0  'Czech\PlugHex.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1169032'
Call Patch
StrCpy $0  'Czech\PlugNetworks.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1171900'
Call Patch
StrCpy $0  'Czech\PlugOrgan.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1172654'
Call Patch
StrCpy $0  'Czech\PlugPhoto.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1189998'
Call Patch
StrCpy $0  'Czech\PlugRing.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1205611'
Call Patch
StrCpy $0  'Czech\PlugSMS.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1232991'
Call Patch
StrCpy $0  'Czech\PlugTools.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1261257'
Call Patch
StrCpy $0  'Czech\PlugWipe.lang'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1264069'
Call Patch
StrCpy $0  'Czech\ReplugPort.htm'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1273139'
Call Patch
StrCpy $0  'Czech\rootinfo.dat'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1274227'
Call Patch
StrCpy $0  'Czech\ToolkitPro.Resource.dll'        ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1277377'
Call Patch

IfErrors 0 +3
        SetErrors
        Goto end_of_patch
DetailPrint 'Beginning real patch...'

StrCpy $0  'Czech\AppRoot.htm'        ; Modified file
StrCpy $1 '/PRECISE 12'
Call Patch
StrCpy $0  'Czech\Archive.htm'        ; Modified file
StrCpy $1 '/PRECISE 5915'
Call Patch
StrCpy $0  'Czech\Backup.htm'        ; Modified file
StrCpy $1 '/PRECISE 7380'
Call Patch
StrCpy $0  'Czech\DataSource.htm'        ; Modified file
StrCpy $1 '/PRECISE 9288'
Call Patch
StrCpy $0  'Czech\Error.htm'        ; Modified file
StrCpy $1 '/PRECISE 10335'
Call Patch
StrCpy $0  'Czech\Exports.lang'        ; Modified file
StrCpy $1 '/PRECISE 11501'
Call Patch
StrCpy $0  'Czech\FormatGUI.lang'        ; Modified file
StrCpy $1 '/PRECISE 19057'
Call Patch
StrCpy $0  'Czech\Internet.htm'        ; Modified file
StrCpy $1 '/PRECISE 36154'
Call Patch
StrCpy $0  'Czech\ItunesBackup.htm'        ; Modified file
StrCpy $1 '/PRECISE 39281'
Call Patch
StrCpy $0  'Czech\Main.lang'        ; Modified file
StrCpy $1 '/PRECISE 41655'
Call Patch
StrCpy $0  'Czech\mewconad.htm'        ; Modified file
StrCpy $1 '/PRECISE 957752'
Call Patch
StrCpy $0  'Czech\mewconad.xml'        ; Modified file
StrCpy $1 '/PRECISE 961083'
Call Patch
StrCpy $0  'Czech\mewconap.htm'        ; Modified file
StrCpy $1 '/PRECISE 963777'
Call Patch
StrCpy $0  'Czech\mewconap.xml'        ; Modified file
StrCpy $1 '/PRECISE 966308'
Call Patch
StrCpy $0  'Czech\mewconts.htm'        ; Modified file
StrCpy $1 '/PRECISE 968220'
Call Patch
StrCpy $0  'Czech\mewconts.xml'        ; Modified file
StrCpy $1 '/PRECISE 970789'
Call Patch
StrCpy $0  'Czech\NewsTemplate.htm'        ; Modified file
StrCpy $1 '/PRECISE 972759'
Call Patch
StrCpy $0  'Czech\Offline.htm'        ; Modified file
StrCpy $1 '/PRECISE 973148'
Call Patch
StrCpy $0  'Czech\Online.htm'        ; Modified file
StrCpy $1 '/PRECISE 975493'
Call Patch
StrCpy $0  'Czech\Outlook.htm'        ; Modified file
StrCpy $1 '/PRECISE 978946'
Call Patch
StrCpy $0  'Czech\PlugBook.lang'        ; Modified file
StrCpy $1 '/PRECISE 979935'
Call Patch
StrCpy $0  'Czech\PlugCopy.lang'        ; Modified file
StrCpy $1 '/PRECISE 1023434'
Call Patch
StrCpy $0  'Czech\PlugData.lang'        ; Modified file
StrCpy $1 '/PRECISE 1063175'
Call Patch
StrCpy $0  'Czech\PlugEmail.lang'        ; Modified file
StrCpy $1 '/PRECISE 1137068'
Call Patch
StrCpy $0  'Czech\PlugFS.lang'        ; Modified file
StrCpy $1 '/PRECISE 1138337'
Call Patch
StrCpy $0  'Czech\PlugHex.lang'        ; Modified file
StrCpy $1 '/PRECISE 1169032'
Call Patch
StrCpy $0  'Czech\PlugNetworks.lang'        ; Modified file
StrCpy $1 '/PRECISE 1171900'
Call Patch
StrCpy $0  'Czech\PlugOrgan.lang'        ; Modified file
StrCpy $1 '/PRECISE 1172654'
Call Patch
StrCpy $0  'Czech\PlugPhoto.lang'        ; Modified file
StrCpy $1 '/PRECISE 1189998'
Call Patch
StrCpy $0  'Czech\PlugRing.lang'        ; Modified file
StrCpy $1 '/PRECISE 1205611'
Call Patch
StrCpy $0  'Czech\PlugSMS.lang'        ; Modified file
StrCpy $1 '/PRECISE 1232991'
Call Patch
StrCpy $0  'Czech\PlugTools.lang'        ; Modified file
StrCpy $1 '/PRECISE 1261257'
Call Patch
StrCpy $0  'Czech\PlugWipe.lang'        ; Modified file
StrCpy $1 '/PRECISE 1264069'
Call Patch
StrCpy $0  'Czech\ReplugPort.htm'        ; Modified file
StrCpy $1 '/PRECISE 1273139'
Call Patch
StrCpy $0  'Czech\rootinfo.dat'        ; Modified file
StrCpy $1 '/PRECISE 1274227'
Call Patch
StrCpy $0  'Czech\ToolkitPro.Resource.dll'        ; Modified file
StrCpy $1 '/PRECISE 1277377'
Call Patch

end_of_patch:
StrCpy $1 '/UNLOAD'
WPatch::PatchFile
Delete $2
; Now you should check for IfErrors ...
SectionEnd


iglezz 14-02-2022 19:21 2980030

Kopejkin, Не имея набора файлов (оба каталога для WGenPatDir.exe и каталог с файлами установленной программы), достаточного для сборки скрипта и теста результата, трудно сказать определённо.
Проблема только с пропатчиванием или также с секциями -Backup и -Main? Во втором случае стоит внимательно посмотреть на функцию CheckFile, она несколько путано написана.
Можно поискать проблемное место методом отключения ненужных для проверки частей скрипта и выводом отладочной информации через DetailPrint или в файл через FileWrite.

ЗЫ
Блок
Код:

Section
      InitPluginsDir
 SectionEnd

можно удалить, т.к. InitPluginsDir уже исполняется в .onInit

Kopejkin 14-02-2022 19:53 2980032

Запускается все из одной папки, и "пример" и "мой". В "моем" все работает (проверяется, меняется, копируется), кроме пропатчивания. Смотрел DetailPrint на оба варианта. В "примере" пишет:
"Extract: WGenPatDir.pat...100%"
В "моем":
"Extract: WGenPatDir.pat"
Может файл не извлекается? Почему?
От безысходности пытался посмотреть, извлекается ли этот файл во временную папку. Но не увидел ни в первом, ни во втором варианте. Даже пытался тупо скопировать его во временную папку до начала процесса пропатчивания. Не помогло.

iglezz 14-02-2022 22:32 2980038

Kopejkin, Небольшая модификация функции Patch в примере показала, что плагин ничерта не пропатчил
nsis 3.08, ansi/unicode, проверено на Win10 x64 21h2, Win7 x86

Тут к автору плагина стучаться надо, если это ещё возможно.
Function Patch (modified)
Код:

Function Patch
SetDetailsPrint listonly
        StrCpy $0 '$INSTDIR\$0'
       
    StrCpy $R1 $1 8
    StrCmp $R1 '/PRECISE' 0 +4
        DetailPrint 'f: $0'
        md5dll::GetMD5File "$0"
        Pop $R2
retry:
        WPatch::PatchFile /NOUNLOAD        ; expects $0:file path, $1:options, $2:patch path
   
    StrCmp $R1 '/PRECISE' 0 +7
        md5dll::GetMD5File "$0"
        Pop $R3
        StrCmp $R2 $R3 +4 0
            DetailPrint "MD5 original $R2"
            DetailPrint "MD5 patched $R3"
            DetailPrint " "
           
        IntCmp $1 0 continue can_skip 0
                SetErrors
can_skip:
                SetDetailsPrint listonly
                DetailPrint '=> Error $1'
                SetDetailsPrint both
                IntCmp $1 1 0 continue continue
                        MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION $(^FileError_NoIgnore) /SD IDCANCEL IDRETRY retry
                        Abort
continue:
SetDetailsPrint none
FunctionEnd


Kopejkin 14-02-2022 23:11 2980041

Спасибо, что заморочились. Для меня это сложновато. Накарябал кучу текста для штатного плагина VPatch. Все работает. Еще раз, спасибо!

динозавра 15-02-2022 19:03 2980109

Приветствую всех. Перелопатил всю справку, но не нашел переименования папки. Ткните носом, если это есть в нашей справке.
Нужно следующее: если по такому то пути найдена папка "Вася", то переименовать ее на "Вова".

Begin2Fly 15-02-2022 19:08 2980110

Цитата:

Цитата динозавра
переименования папки »

Перевод справки NSIS - Rename

динозавра 15-02-2022 19:19 2980111

Begin2Fly, Спасиба, но вы дали переименование файла. Это в справке аж в двух местах указано. А мне нужно "если по такому то пути найдена папка "Вася", то переименовать ее на "Вова". Папка, не файл.

Begin2Fly 15-02-2022 19:25 2980112

динозавра, не спорьте, а используйте Rename для переименования файлов и папок.

динозавра 15-02-2022 19:34 2980113

Begin2Fly, Хорошо, попробую. Но как тогда написать "если по такому то пути найдена папка". Я знаю только для файла
Код:

IfFileExists
и
Код:

${If} ${FileExists}
Нужно для папки.

Begin2Fly 15-02-2022 19:37 2980114

динозавра, и то, и то сработает. Используйте на своё усмотрение.

ZVSRus 11-06-2022 14:20 2986486

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

iglezz 11-06-2022 14:26 2986487

ZVSRus,
Создание файлов - FileOpen/FileClose
Проверка на существование - IfFileExists
Примеры есть в справке

ZVSRus 11-06-2022 14:49 2986493

iglezz
Может не внятно задал вопрос. Есть такой скрипт для создания портативной программы. При компиляции портативной версии нужно чтобы рядом с лаунчером создался пустой текстовый документ. В него ничего писаться не будет. При удалении данного документа лаунчер не запускался и выводил сообщение что текстовый документ удалён.

PS: В скриптах NSIS полный 0.

iglezz 11-06-2022 15:49 2986499

В процессе компиляции файл можно создать командой !appendfile
пример
Код:

!define MYLOCKFILE "CreateFileAtCompileTime.txt"
!appendfile "${MYLOCKFILE}" ""

Name "CreateFileAtCompileTime"
ShowInstDetails show
AutoCloseWindow false
RequestExecutionLevel user

Page instfiles


Section
SectionEnd


Function .onInit
IfFileExists "$EXEDIR\${MYLOCKFILE}" +3 0
    MessageBox MB_OK|MB_ICONSTOP "Верни мой файл! $\n $EXEDIR${MYLOCKFILE}"
    Quit
FunctionEnd



ЗЫ. В шапке есть русскоязычный справочник - он несколько устарел и неструктурирован, но как базовый подойдёт.
Язык NSIS по объёму небольшой, за пару вечеров основы усвоить можно.

ZVSRus 11-06-2022 17:12 2986503

iglezz,
Спасибо за пример, Буду пробовать.
Но решение нашел методом тыка
Создал рядом с лаунчером текстовый документ (Readme.txt)
Переделал функцию:
Function CheckDirExe
IfFileExists "$EXEDIR\${APPDIR}\${APPEXE}" +3
MessageBox MB_OK|MB_ICONEXCLAMATION `${APPEXE} was not found in $EXEDIR\${APPDIR}`
Abort
FunctionEnd

на

Function CheckDirTxt
IfFileExists "$EXEDIR\Readme.txt" +3
MessageBox MB_OK|MB_ICONEXCLAMATION `Файл Readme.txt был удалён. Запуск не возможен!`
Abort
FunctionEnd

Заработало как и хотел.

AlekseyPopovv 11-06-2022 19:24 2986507

Цитата:

Цитата ZVSRus
Function CheckDirTxt »

Рекомендую функцию .onInit
Цитата: "Функция .onInit выполняется после инициализации инсталлятора. Это самая первая функция, которая выполняется при запуске вашего инсталлятора."
Не понятно зачем нужно создание файла "Readme.txt" при компиляции...
Может нужно при запуске "портативной версии" создать файл "Readme.txt"?
Не могу понять...

ZVSRus 11-06-2022 19:59 2986509

Цитата:

Цитата AlekseyPopovv
Может нужно при запуске "портативной версии" создать файл "Readme.txt"?

Вот именно, изначальный вопрос и заключался в этом. Есть текстовый файл лаунчер запускает программу, нет программа не зпускается.
"Readme.txt" название образное.

Цитата:

Не понятно зачем нужно создание файла "Readme.txt" при компиляции...
Под словом компиляция имелось ввиду сборка портативной программы

AlekseyPopovv 11-06-2022 20:25 2986510

ZVSRus, Ну тут вообще просто.
Как уже и писал "iglezz", только подробнее...
Создаём переменную, что бы при смене имени файла не искать её по всему скрипту.
+3 значит если файл есть, то переходим на три строки вниз, то есть "IfFileExists "$EXEDIR\${README}" +3 0" это первая строка.
0 значит файла нет и переходит на следующую строку.
Код:

!define README "Readme.txt"
Function .onInit
IfFileExists "$EXEDIR\${README}" +3 0
    MessageBox MB_OK|MB_ICONSTOP 'Файл ${README} был удалён. Запуск не возможен!'
    Quit
FunctionEnd


ZVSRus 11-06-2022 21:01 2986513

AlekseyPopovv,

Думаю что вы поняли для чего вся эта возня.

Пример работает прекрасно. Благодарен!

AlekseyPopovv 13-06-2022 10:54 2986559

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

!define APPEXE86 "Prog86.exe"
!define APPEXE64 "Prog64.exe"
!include "macros.nsh"

Макрос:
Код:

!define CacheAppExeJump "!insertmacro DeleteCacheAppExeJump"
!define APPEXEJUMP1 "$EXEDIR\${APPDIR}\${APPEXE}"
!macro DeleteCacheAppExeJump AppExeJump
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Search\JumplistData" "${AppExeJump}"
!macroend

!define CacheAppExe86Jump "!insertmacro DeleteCacheAppExe86Jump"
!define APPEXE86JUMP1 "$EXEDIR\${APPDIR}\${APPEXE86}"
!macro DeleteCacheAppExe86Jump AppExe86Jump
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Search\JumplistData" "${AppExe86Jump}"
!macroend

!define CacheAppExe64Jump "!insertmacro DeleteCacheAppExe64Jump"
!define APPEXE64JUMP1 "$EXEDIR\${APPDIR}\${APPEXE64}"
!macro DeleteCacheAppExe64Jump AppExe64Jump
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Search\JumplistData" "${AppExe64Jump}"
!macroend

Если нет
Код:

!define APPEXE "Prog.exe"
то переходит на поиск
Код:

!define APPEXE86 "Prog86.exe"

iglezz 13-06-2022 11:17 2986560

AlekseyPopovv,
команды !ifdef или !ifndef

AlekseyPopovv 24-08-2022 15:48 2991037

Как задать переменную для папки LocalLow?

iglezz 24-08-2022 16:26 2991041

Цитата:

Цитата AlekseyPopovv
Как задать переменную для папки LocalLow? »

Объявить константу (в соответствии WinCore.nsh и KNOWNFOLDERID):
Код:

!define FOLDERID_LocalAppDataLow {A520A1A4-1780-4FF6-BD18-167343C5AF16}
В секции/функции получить значение инструкцией GetKnownFolderPath:
Код:

GetKnownFolderPath $0 ${FOLDERID_LocalAppDataLow}

Lou Paloma 28-08-2022 23:10 2991240

Всем Привет!Этот установщик использует temp?нужна установка программы с запуском в конце скрипта или exe из конечной папки назначения(не из temp),конечный путь заранее не определён вообще без использования temp желательно(распаковкой туда,а потом копированием в конечный пункт)
Sfx конструкторы такого не могут.

iglezz 29-08-2022 17:20 2991289

Lou Paloma,
Этот установщик использует %temp% для распаковки плагинов, графики и прочих временных файлов установщика.
Остальное по желанию скриптописателя.

Lou Paloma 11-09-2022 01:50 2992194

iglezz, Это то что нужно.А может ли он распаковать архивы (7zip) напрямую в место назначения минуя %temp%?

iglezz 11-09-2022 12:25 2992206

Lou Paloma,
Первый архив, включённый в установщик, можно распаковать непосредственно из файла установщика -- 7-zip (и построенный на его основе плагин nsis7z) это умеет делать изначально. Для этого достаточно, чтобы заголовок архива был найден в первых 8Mb файла.
Если архивов несколько, то простых решений нет.

kiff86 07-10-2022 18:23 2993757

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

MKN 12-10-2022 19:29 2994069

kiff86,
Помести эту строку в, скажем, INI файл, рядом с установщиком, откуда будет считываться изменяемая информация.

kuzulis 02-11-2022 13:55 2995395

Всем привет.

Я заиспользовал NSIS версии 3.x совместно с CMake/CPack для генерации простого инсталлятора. Я оставил в конфигурации только поддержку русского языка.

Но при запуске установщика я вижу, что перенос слов в заголовке и содержимом (в общем - везде) некорректный. Оно переносит не по `словам` - а по `любым` местам.

https://media.discordapp.net/attachm...399&height=310

Есть ли какой-либо вариант это поправить, чтобы перенос был именно по словам?

iglezz 02-11-2022 18:12 2995411

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

kuzulis 03-11-2022 10:23 2995484

> Примеры непосредственно из каталога NSIS компилируются нормально?

Не пробовал, да и зачем.

> текст так не переносится.

Если использовать
Цитата:

!insertmacro MUI_LANGUAGE "English"
вместо
Цитата:

!insertmacro MUI_LANGUAGE "Russian"
то переносится нормально.

Но мне то нужен именно русский язык.

MKN 02-12-2022 11:17 2997814

Что то тема заглохла...
Из последнего, достойного внимания :
NSIS версия 3.08
_https://sourceforge.net/projects/nsis/files/NSIS 3/3.08/

SysInfo Plugin
https://pawelporwisz.pl/nsis/plugins...fo/SysInfo.php

Также интересно, кто и как "минимальным кодом" детектит Windows 11 (до последней циферки build_а ! :) )
и открепляет ярлыки из тулбара (UnPin application shortcuts to taskbar). Может есть какой приличный плагин для этого ?
(Жаль kotkovets нас бросил, а то бы помог, наколдовал бы давно... :) )

iglezz 03-12-2022 01:51 2997879

Цитата:

Цитата MKN
Также интересно, кто и как "минимальным кодом" детектит Windows 11 (до последней циферки build_а ! ) »

Достаточно проверить номер сборки, у Win11 он равен или выше c 22000
Код:

GetWinVer $0 Build
...

Комплектный WinVer.nsh содержит логику для LogicLib.nsh. (Более свежий WinVer.nsh нужно брать с гитхаба или sf.net)
Код:

${If} ${AtLeastBuild} 22000
    MessageBox MB_OK "Win11"
${Else}
    MessageBox MB_OK "Win10"
${EndIf}

Цитата:

Цитата MKN
открепляет ярлыки из тулбара (UnPin application shortcuts to taskbar). Может есть какой приличный плагин для этого ? »

Есть в комплекте
Код:

!include "Integration.nsh"
...
${UnpinShortcut} "путь к ярлыку"


MKN 03-12-2022 09:17 2997882

Цитата:

Цитата iglezz
Достаточно проверить номер сборки, у Win11 он равен или выше c 22000 »

Этого маловато будет... Хотелось бы знать полный build...

iglezz 03-12-2022 11:36 2997891

Вторую часть билда можно выдернуть из:
реестра:
Код:

ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "UBR"
а лучше так:
Код:

!define GetWinVerBuild2 '!insertmacro GetWinVerBuild2'
!macro GetWinVerBuild2 out
        ReadRegDWORD ${out} HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "UBR"
!macroend

cmd-команды ver :)
Код:

    nsExec::ExecToStack `"$SYSDIR\cmd.exe" /c for /f "tokens=4 delims=.]" %B in ('ver') do @echo %B`
    Pop $0


AlekseyPopovv 03-12-2022 11:55 2997892

Цитата:

Цитата MKN
Жаль kotkovets нас бросил, а то бы помог, наколдовал бы давно... »

А что случилось?

MKN 03-12-2022 13:01 2997894

Цитата:

Цитата AlekseyPopovv
А что случилось? »

С ним, надеюсь, ничего. А вот NSIS ему давно не интересен... Соответственно и тема...

VSS 07-02-2023 12:18 3002599

Добрый день.

Кто, как говорится, "съел собаку в NSIS" и может объяснить, дать совет по возникшей проблеме с ExecWait?
Поскольку описание проблемы занимает много места, отправлю в PM.
Заранее благодарен.

MKN 23-02-2023 12:31 3003954

Столкнулся с загадочным явлением:
В Windows 7x64 решил посмотреть даныые о сервис-паке и пр. Это значения, которые находятся в:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"CSDVersion"="Service Pack 1"
и т.д.

Значения "и т.д." извлекаются без проблем, к примеру:
ReadRegStr $0 "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "ProductName"

а вот для "CSDVersion" извлекается пустое значение...
ReadRegStr $1 "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CSDVersion"

В то же время
Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V CSDVersion

извлекает, что положено, т.е. "Service Pack 1"

Как это понимать ? (пробовал на двух разных машинах и с разными версиями NSIS)


ps. к слову, вышеприведённый в теме, код просмотра verbuild в Windows 11 - у меня не работает...

iglezz 23-02-2023 15:03 3003961

MKN,
Не ли тут опечатки или разницы в поведении из-за разной разрядности (nsis x86, win x64) ?
Для мини-проверки:
Код:

!define REGROOT HKLM
!define REGKEY "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
!define REGVALUE "CSDVersion"

ReadRegStr $0 ${REGROOT} "${REGKEY}" "${REGVALUE}"

nsExec::ExecToStack `"$SYSDIR\reg.exe" query "${REGROOT}\${REGKEY}" /v "${REGVALUE}"`
Pop $1
Pop $1

MessageBox MB_OK "ReadReg: $0$\nReg Query: $1"


MKN 23-02-2023 16:16 3003965

iglezz,
кракозябры в результате(первый Pop $0 наверное ? если нет, то ReadReg - без значения...) :

Что за кодировка не понял... Пытался преобразовать через OemToChar - вообще ничего...

Кстати, подобные кракозябры в результате и при использовании wmic в Windows 11. Причём в первом слове (Microsoft вроде...)
При использовании OemToChar - выводится только слово Microsoft, остальное куда то пропадает...
В W7 всё ок.

iglezz 23-02-2023 16:54 3003969

MKN,
Код:

nsExec::ExecToStack /OEM `"$SYSDIR\reg.exe" query "${REGROOT}\${REGKEY}" /v "${REGVALUE}"`
Похоже там сообщение об ошибке.

Хз как ведёт себя Win7x64

Стои попробовать установить SetRegView 64 перед ReadRegStr ...
и
Код:

nsExec::ExecToStack /OEM `"$WINDIR\Sysnative\reg.exe" query "${REGROOT}\${REGKEY}" /v "${REGVALUE}"`
ЗЫ
Содержимое меседжбоксов (вместо снятия скриншота) можно копировать как текст (Ctrl+C), это очень старая и полезная штука

MKN 23-02-2023 17:03 3003972

Цитата:

Цитата iglezz
Стои попробовать установить SetRegView 64 перед ReadRegStr ... »

Ура ! Только почему это касается только CSDVersion ?

Цитата:

очень старая и полезная штука
(привык к скриншотам, как к подтверждению увиденного... :) )
Ошибка: Не удается найти указанный раздел или параметр в реестре.
Кодировка там была OEM866. /OEM помог(а как быть для ExecDos::exec ? ). И почему не сработал OemToChar ?

iglezz 23-02-2023 18:29 3003983

Цитата:

Цитата MKN
Только почему это касается только CSDVersion ? »

Не факт что и мелкомягкие программисты это могут объяснить.
Это очередное подтверждение, что 32-бит программе в 64-бит системе для доступа к ресурсам (реестру, файлам) стоит использовать соответствующие мехнизмы, а не надеятся, что сработает и так.

Цитата:

Цитата MKN
И почему не сработал OemToChar »

Навскидку потому что OemToChar преобразует OEM в ANSI строку с завершающим нулём, а скрипт юникодный и каждый второй байт у нас нулевой. ответ ниже

iglezz 27-02-2023 02:53 3004239

Цитата:

Цитата MKN
почему не сработал OemToChar ? »

У плагина System параметр t означает ANSI (однобайтную) кодировку в ANSI-сборке и юникод в юникод-сборке.
Ввод-Вывод плагина ExecDos однобайтный (в основном), поэтому нужно использовать параметр m на входе OemToChar или выходе CharToOem:
Код:

System::Call 'user32::OemToChar(mr0, t.r0)'
Этот вариант будет работать и в Unicode и в ANSI сборках.

Проверка на многострочном тексте показала, что этот способ портит символы \r, \n и, наверняка, другие спецсимволы.

Более корректный универсальный ansi/unicode способ в виде макроса:
Код:

!define OemToChar `!insertmacro OemToChar`
!macro OemToChar STR
!ifdef NSIS_UNICODE
    Push $0
    System::Call 'kernel32::MultiByteToWideChar(i 1, i 0, m "${STR}", i -1, i 0, i 0) i.s'
    System::Call 'kernel32::MultiByteToWideChar(i 1, i 0, m "${STR}", i -1, t.r0, i s)'
    Exch $0
!else
    System::Call 'user32::OemToChar(m"${STR}", t.s)'
!endif
    Pop ${STR}
!macroend

Пример использования:
Код:

    SetOutPath "$DOCUMENTS"
    nsExec::ExecToStack  `"$SYSDIR\cmd.exe" /c "" dir /b `
    Pop $0
    Pop $0
    StrCpy $0 $0 -2
    ${OemToChar} $0
    MessageBox MB_OK "$0"


MKN 27-02-2023 15:33 3004249

iglezz, благодарю за разъяснение и пример.

Обнаружил интересный многофункциональный плагин - NSutils
https://github.com/negrutiu/nsis-nsutils

В частности интересны его StartReceivingClicks и StopReceiveClicks - функции обратного вызова NSIS для пользовательских кнопок. Помнится в ряде случаев были сложности именно с "калбаками" для собственных кнопок в разных местах окон инсталлятора...
Хорошо бы на базе этого плагина(если он умеет) примеры увидеть...

iglezz 27-02-2023 17:15 3004251

MKN,
Кнопки для этого плагина нужно добавлять так-же как и для плагина ButtonEvent, через редактор ресурсов.
Проблем с колбеками не должно было быть и раньше - нужно всего лишь один раз понять их логику. В WinAPI вобще везде так - надо понять как это всё работает, иначе постоянно будут какие-то непонятки.

Вот примерчик для кнопки с NSutils:
Скрытый текст
Код:

RequestExecutionLevel user
!include "LogicLib.nsh"
!include "nsDialogs.nsh"

Page components "" OnComponentsShow OnComponentsLeave

Function .onInit

FunctionEnd

Section
SectionEnd

Var hComponentsButton

Function OnComponentsShow
    System::Call 'user32::GetClientRect(i $HWNDPARENT,@r1)i.r2'
    System::Call '*$1(i,i,i.r1,i.r2)'
    IntOp $2 $2 - 80

    System::Call 'user32::CreateWindowEx(i0,t"Button",\
        t"ClickMe!",\
        i${BS_PUSHBUTTON}|${WS_CHILD}|${WS_VISIBLE}|${WS_TABSTOP},\
        i0,ir2,ir1,i80,\
        i$HWNDPARENT,i0,ir0,i0)i.s'
    Pop $hComponentsButton
    CreateFont $0 '$(^Font)' '$(^FontSize)'
    SendMessage $hComponentsButton ${WM_SETFONT} $0 0

    System::Call 'user32::SetWindowPos(i $hComponentsButton,i0, i0,i0,i0,i0, i3)'

    GetFunctionAddress $0 OnComponentsButtonClicked
    NSutils::StartReceivingClicks $HWNDPARENT $0
FunctionEnd

Function OnComponentsButtonClicked
    Pop $1
    Pop $2
    ${If} $1 = $hComponentsButton
        MessageBox MB_OK "Clicked$\nHWND $1$\nID $2"
    ${EndIf}

FunctionEnd

Function OnComponentsLeave
        NSutils::StopReceivingClicks $HWNDPARENT
FunctionEnd


Кнопка создаётся в рантайме, посему криво (про это я объяснял с соседней теме по AutoIt)
Лучше кнопки добавлять в редакторе ресурсов. Их можно сделать изначально невидимыми (без атрибута WS_VISIBLE) и делать видимыми (и даже перемещать/менять размер) по мере необходимости.
Если хочется без проблем добавлять всякие штуки налету то придётся предварительно подправить диалоги (их порядок и свойства).

inco1 02-03-2023 14:43 3004457

Приветствую всех.
Тут такое дело. Имеется батник, который имеет две функции:
1. Создает текстовый файл расширения .ics с добавлением в него нужных строк.
2. Если этот файл со своими строками уже имеется, то батник добавляет в готовый файл только нужные строки не трогая имеющихся и не дублирует те, которые нужно добавить, если таковы имеются
Вот его код:

Скрытый текст
Код:

@echo off
set "File=hosts.ics"
set "Folder=%windir%\system32\drivers\etc"
pushd "%Folder%"||(pause &exit /B 2)
set "@Add001=0.0.0.0 martau.com"
set "@Add002=0.0.0.0 www.martau.com"
set "@Add003=0.0.0.0 total-uninstall.com"
set "@Add004=0.0.0.0 www.total-uninstall.com"
set "@Add005=0.0.0.0 64.91.254.118"
attrib -R -S -H "%File%"
set /A NOld=1000
for /F "usebackq delims=" %%s in ("%File%") do (set /A NOld+=1 &call set "@Old%%NOld%%=%%s")
for /F "usebackq tokens=1* delims==" %%i in (`2^>nul set "@Add"`) do (set /A NOld+=1 &Call set "@Old%%NOld%%=%%j")
for /F "usebackq tokens=1* delims==" %%i in (`2^>nul set "@Old"`) do (set "SS=%%j" &Call set "@%%i=%%SS: =%%")
>"%File%" (for /L %%i in (1001,1,%NOld%) do call :AnalizHosts %%i)
attrib +R "%File%"
popd
exit
:AnalizHosts
call set "A=%%@@Old%1%%"
if /I "%A%"=="" exit /B 1
if "%A:~0,1%"=="#" (call echo %%@Old%1%%&exit /B 0)
(call echo %%@Old%1%%)
for /F "usebackq tokens=1* delims==" %%i in (`2^>nul set "@@Old"`) do if /I "%%j"=="%A%" call set "%%i="
exit /B 0


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

Скрытый текст
Код:

Function DelLine
        StrCpy $0 SkipWrite
        Push $0
FunctionEnd

Section

Var /global Text
Var /global Text1
Var /global Text2
Var /global Text3
Var /global Text4

StrCpy $Text "0.0.0.0 martau.com"
StrCpy $Text1 "0.0.0.0 www.martau.com"
StrCpy $Text2 "0.0.0.0 total-uninstall.com"
StrCpy $Text3 "0.0.0.0 www.total-uninstall.com"
StrCpy $Text4 "0.0.0.0 64.91.254.118"

    ${If} ${FileExists} "$SYSDIR\drivers\etc\hosts.ics"

    SetFileAttributes "$SYSDIR\drivers\etc\hosts.ics" NORMAL

${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
StrCpy $R1 0
read:
 IntOp $R1 $R1 + 1
 IntCmp $R1 $R0 0 0 end
 readnow:
 ${LineRead} "$SYSDIR\drivers\etc\hosts.ics" "$R1" $R3
 ${WordFind} "$R3" "$Text" "E+1{" $R2
  IfErrors read 0
 ${LineFind} "$SYSDIR\drivers\etc\hosts.ics" "" "$R1" "DelLine"
 ${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
 goto readnow
end:

${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
StrCpy $R1 0
read1:
 IntOp $R1 $R1 + 1
 IntCmp $R1 $R0 0 0 end1
 readnow1:
 ${LineRead} "$SYSDIR\drivers\etc\hosts.ics" "$R1" $R3
 ${WordFind} "$R3" "$Text1" "E+1{" $R2
  IfErrors read1 0
 ${LineFind} "$SYSDIR\drivers\etc\hosts.ics" "" "$R1" "DelLine"
 ${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
 goto readnow1
end1:

${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
StrCpy $R1 0
read2:
 IntOp $R1 $R1 + 1
 IntCmp $R1 $R0 0 0 end2
 readnow2:
 ${LineRead} "$SYSDIR\drivers\etc\hosts.ics" "$R1" $R3
 ${WordFind} "$R3" "$Text2" "E+1{" $R2
  IfErrors read2 0
 ${LineFind} "$SYSDIR\drivers\etc\hosts.ics" "" "$R1" "DelLine"
 ${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
 goto readnow2
end2:

${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
StrCpy $R1 0
read3:
 IntOp $R1 $R1 + 1
 IntCmp $R1 $R0 0 0 end3
 readnow3:
 ${LineRead} "$SYSDIR\drivers\etc\hosts.ics" "$R1" $R3
 ${WordFind} "$R3" "$Text3" "E+1{" $R2
  IfErrors read3 0
 ${LineFind} "$SYSDIR\drivers\etc\hosts.ics" "" "$R1" "DelLine"
 ${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
 goto readnow3
end3:

${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
StrCpy $R1 0
read4:
 IntOp $R1 $R1 + 1
 IntCmp $R1 $R0 0 0 end4
 readnow4:
 ${LineRead} "$SYSDIR\drivers\etc\hosts.ics" "$R1" $R3
 ${WordFind} "$R3" "$Text4" "E+1{" $R2
  IfErrors read4 0
 ${LineFind} "$SYSDIR\drivers\etc\hosts.ics" "" "$R1" "DelLine"
 ${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
 goto readnow4
end4:

    ${EndIf}

    FileOpen $0 "$SYSDIR\drivers\etc\hosts.log" w
    FileWrite $0 "0.0.0.0 martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 64.91.254.118 $\r$\n"
    FileClose $0

    ${If} ${FileExists} "$SYSDIR\drivers\etc\hosts.ics"
    ${FileJoin} "$SYSDIR\drivers\etc\hosts.log" "$SYSDIR\drivers\etc\hosts.ics" "$SYSDIR\drivers\etc\hosts.ics"
    Delete "$SYSDIR\drivers\etc\hosts.log"
    ${Else}
    Rename "$SYSDIR\drivers\etc\hosts.log" "$SYSDIR\drivers\etc\hosts.ics"
    ${EndIf}

    SetFileAttributes "$SYSDIR\drivers\etc\hosts.ics" READONLY

SectionEnd


MKN 04-03-2023 09:47 3004550

Цитата:

Цитата inco1
упростить или усовершенствовать »

Поместить работу с строками и пр. - в цикл.

inco1 04-03-2023 15:22 3004571

Цитата:

Цитата MKN
Поместить работу с строками и пр. - в цикл. »

Можно пример этого цикла?

iglezz 05-03-2023 05:51 3004612

inco1, Код нужно усовершенствовать, ибо он дико неоптимален (сам язык в основе скуден, а комплектные библиотеки (nsh) по этой части страшны). Громоздкость хорошо заметается под макросы и прячется в отдельные библиотечки.

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

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

Основных проблем тут две.

Первая - простая техническая.
Добыть данные из файла. Обработать. Запихнуть обратно. В процессе ничего не сломать.
И чтобы код можно было понимать и поддерживать спустя полгода.

Правильная работа начинается с правильной обработки строк, а каждая строка-запись в максимуме может содержать IP-адрес, энное количество хостов и комментарий с пробелами или табуляциями в качестве разделителей. Обычные прелести минимально структурированного простого текста. Разбор всего этого в NSIS растянется на сотни строк, это не питон какой-нибудь, где строку можно распарсить одной регуляркой.
Строки могут записаны
так
Код:

0.0.0.0 martau.com #site1
      0.0.0.0  www.martau.com  #site2
0.0.0.0            total-uninstall.com

или так
Код:

0.0.0.0 martau.com  www.martau.com total-uninstall.com
или даже так
Код:

                0.0.0.0  martau.com www.martau.com www.total-uninstall.com # block total-uninstall.com


По хорошему надо вытаскивать все данные в некую структуру (список/массив), анализировать и потом записывать обратно.
И помнить про обработку ошибок - мало дать команду на запись, надо ещё убедится, что изменения реально записаны.

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

Рабочий пример с в меру гибкой обработкой hosts file есть по ссылке. То, что под капотом (hostsblock.nsh), местами корявое, местами страшное, но рабочее с большего. Со стороны основного скрипта одна команда с всего двымя параметрами - имя файла и хост.
В примере присутствует !define DEBUG - это нужно только для отладки, если что-то вдруг пойдёт не так.

inco1 05-03-2023 16:45 3004644

iglezz, это наилучшее решение, имеющееся сегодня в NSIS для HOSTS.
Проверил практически на всех системах, и с UAC и без, и с пробелами в строках и без. Работает без сучка и задоринки. Мне прекрасно подходит.
Чтобы работало для моего файла "hosts.ics" я поменял в hostsblock.nsh все 54 "hosts" на "hosts.ics" и переименовал на "hostsicsblock.nsh".
Результат простейшего экзешника без Errors получился таким:

Скрытый текст
Код:

Unicode true
SetOverwrite on
RequestExecutionLevel admin
!include "x64.nsh"
!include "LogicLib.nsh"
!include "hostsicsblock.nsh"
Section
Var /global hostsics
    StrCpy $hostsics "$SYSDIR\drivers\etc"
${IfThen} ${RunningX64} ${|} ${DisableX64FSRedirection} ${|}
${If} ${FileExists} "$hostsics\hosts.ics"
    SetFileAttributes "$hostsics\hosts.ics" NORMAL
    StrCpy $0 '$hostsics\hosts.ics'
    StrCpy $1 '$hostsics\1.txt'
    StrCpy $2 '$hostsics\2.txt'
    CopyFiles /SILENT $0 $1
    FileOpen  $3 $1 A
    FileSeek  $3 0 END
    FileClose $3
    CopyFiles /SILENT $1 $2
    FileOpen $3 $2 A
    FileClose $3
    ${hosts.icsfile_BlockHost} $2 'martau.com'
    ${hosts.icsfile_BlockHost} $2 'www.martau.com'
    ${hosts.icsfile_BlockHost} $2 'www.total-uninstall.com'
    ${hosts.icsfile_BlockHost} $2 'total-uninstall.com'
    ${hosts.icsfile_BlockHost} $2 '64.91.254.118'
    CopyFiles /SILENT $2 $0
    Delete "$hostsics\1.txt"
    Delete "$hostsics\2.txt"
${Else}
    FileOpen $0 "$hostsics\hosts.ics" w
    FileWrite $0 "0.0.0.0 martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 64.91.254.118 $\r$\n"
    FileClose $0
${EndIf}
    SetFileAttributes "$hostsics\hosts.ics" READONLY
SectionEnd


Я так думаю, что для моей задачи с файлом "hosts.ics" код можно использовать и без вставки обработки ошибок.
Огромнейшая благодарность за проделанную работу над hostsblock.nsh.

MKN 05-03-2023 17:41 3004652

Цитата:

Цитата iglezz
Рабочий пример »

Вот это помогли товарищу уменьшить код... :lol: Но всё равно здорово. Спасибо.
Цитата:

Цитата iglezz
местами корявое, местами страшное »

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

outfile host-test.exe
;unicode true

!include "LogicLib.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"
!include "StrFunc.nsh"

Var Str
Var Word_a1
Var Word_a2
Var Word_a3
Var Word_a4
Var Word_a5
Var Word_b2
Var Word_c2
Var Word_d2
Var Word_e2
Var Word_f2

!define a "0.0.0.0"
!define b2 "martau.com"
!define c2 "www.martau.com"
!define d2 "total-uninstall.com"
!define e2 "www.total-uninstall.com"
!define f2 "64.91.254.118"

Section
FileOpen $R4 "$EXEDIR\hosts.ics" r
FileOpen $R5 "$EXEDIR\hosts2.ics" w
IfErrors done
ClearErrors
${LineSum} "$EXEDIR\hosts.ics" $8
StrCpy $3 0
${Do}
IntOp $3 $3 + 1
${LineRead} "$EXEDIR\hosts.ics" "$3" $Str

${If} $3 = 1
${WordReplace} '$Str' "${a}" "${a}" "E+" $Word_a1 ; outvarerror =1 ,если слово для замены не найдено
${WordReplace} '$Str' "${b2}" "${b2}" "E+" $Word_b2
${ElseIf} $3 = 2
${WordReplace} '$Str' "${a}" "${a}" "E+" $Word_a2
${WordReplace} '$Str' "${c2}" "${c2}" "E+" $Word_c2
${ElseIf} $3 = 3
${WordReplace} '$Str' "${a}" "${a}" "E+" $Word_a3
${WordReplace} '$Str' "${d2}" "${d2}" "E+" $Word_d2
${ElseIf} $3 = 4
${WordReplace} '$Str' "${a}" "${a}" "E+" $Word_a4
${WordReplace} '$Str' "${e2}" "${e2}" "E+" $Word_e2
${ElseIf} $3 = 5
${WordReplace} '$Str' "${a}" "${a}" "E+" $Word_a5
${WordReplace} '$Str' "${f2}" "${f2}" "E+" $Word_f2
${EndIf}

${If} $5 = 1
Goto next1
${ElseIf} $5 = 2
Goto next2
${ElseIf} $5 = 3
Goto next3
${ElseIf} $5 = 4
Goto next4
${ElseIf} $5 = 5
Goto next5
${EndIf}

${If} $Word_a1 = 1
${OrIf} $Word_b2 = 1
FileWrite $R5 "${a} ${b2}$\r$\n"
StrCpy $5 1
${EndIf}
next1:
${If} $Word_a2 = 1
${OrIf} $Word_c2 = 1
FileWrite $R5 "${a} ${c2}$\r$\n"
StrCpy $5 2
${EndIf}
next2:
${If} $Word_a3 = 1
${OrIf} $Word_d2 = 1
FileWrite $R5 "${a} ${d2}$\r$\n"
StrCpy $5 3
${EndIf}
next3:
${If} $Word_a4 = 1
${OrIf} $Word_e2 = 1
FileWrite $R5 "${a} ${e2}$\r$\n"
StrCpy $5 4
${EndIf}
next4:
${If} $Word_a5 = 1
${OrIf} $Word_f2 = 1
FileWrite $R5 "${a} ${f2}$\r$\n"
StrCpy $5 5
${EndIf}
next5:
${If} $3 > $8
${ExitDo}
${EndIf}
${Loop}
done:
FileClose $R4
FileClose $R5
SectionEnd
Замена части однотипных действий макросами уменьшит код на треть... Пути хоста ессно выбраны для наглядности примера. Окончательные и очевидные действия в код не включены.

iglezz 05-03-2023 17:43 3004653

inco1,
1. Менять в hostsblock.nsh ничего не надо. Кроме случаев изменения функционала / правки ошибок.
2. В секции примера много лишнего. Её содержімое можно записать компактнее
Скрытый текст
Код:

Section
    ${IfThen} ${RunningX64} ${|} ${DisableX64FSRedirection} ${|}
   
    Var /global hostsfile
    StrCpy $hostsfile "$SYSDIR\drivers\etc\hosts.ics"

    ${IfNot} ${FileExists} $hostsfile
        FileOpen  $0 $hostsfile W
        FileClose $0
    ${EndIf}

    SetFileAttributes $hostsfile NORMAL

    ${hostsfile_BlockHost} $hostsfile 'martau.com'
    ${hostsfile_BlockHost} $hostsfile 'www.martau.com'
    ${hostsfile_BlockHost} $hostsfile 'www.total-uninstall.com'
    ${hostsfile_BlockHost} $hostsfile 'total-uninstall.com'
    ${hostsfile_BlockHost} $hostsfile '64.91.254.118'

    SetFileAttributes $hostsfile READONLY
SectionEnd



MKN,
Цитата:

Цитата MKN
Вот это помогли товарищу уменьшить код... »

А он так и уменьшается - вся сложность загоняется под коврик и наружу торчит простой интерфейс. На голом ассемблере нынче писать не особо стремятся :)

MKN 05-03-2023 17:57 3004655

Цитата:

Цитата iglezz
вся сложность загоняется под коврик »

Это я понимаю. И это не только в программировании... И это наверное не есть хорошо... Хотя потребителю пофиг...

inco1 05-03-2023 18:37 3004658

iglezz,
Цитата:

Менять в hostsblock.nsh ничего не надо.
Я сразу даже не понял, что это для любых расширений и полез изменять.
Даже адреса с 127.0.0.1 не пропускаются, а бекапятся и записываются как 0.0.0.0
Отступы и пробелы так же четко отрабатываются и не дублируются.
Дааа..., код в несколько строчек для качественной правки HOSTS это нечто.
Теперь понятно, сколько вложено труда в hostsblock.nsh.

MKN, Так же огромная благодарность за отклик и проделанную работу. Но работа iglezz - шедевр.

iglezz 05-03-2023 18:59 3004660

MKN, inco1,
В качестве замечания, на будущее и для лучшего понимания.

${LineRead} В подобных циклах - штука дико неэффективная. Алгоритм маляра Шлемиеля, как шутят.
Для N-ой по номеру строки будет сделана куча работы - FileOpen, N FileRead'ов, FileClose, счётчики и проверки

Простейший цикл последовательного чтения файла:
Код:

    FileOpen $handle $filename R
    ${Do}
        FileRead $handle $fileread
        ${IfThen} ${Errors} ${|} ${ExitDo} ${|}

        DetailPrint '[$fileread]'
    ${Loop}
    FileClose $handle


inco1 06-03-2023 01:59 3004669

iglezz,
Проверил множество раз. Ваш предложенный компактный вариант не работает, если файла hosts.ics не существует. Точнее сказать работает, но добавляет только четыре строки без первой.
Если же файл hosts.ics уже существует, то работает правильно. как и задумано. Проверял самым простым экзешником:

Скрытый текст
Код:

Unicode true
SetOverwrite on
RequestExecutionLevel admin

!include "x64.nsh"
!include "LogicLib.nsh"
!include "hostsblock.nsh"

Section
    ${IfThen} ${RunningX64} ${|} ${DisableX64FSRedirection} ${|}
   
    Var /global hostsfile
    StrCpy $hostsfile "$SYSDIR\drivers\etc\hosts.ics"

    ${IfNot} ${FileExists} $hostsfile
        FileOpen  $0 $hostsfile W
        FileClose $0
    ${EndIf}

    SetFileAttributes $hostsfile NORMAL

    ${hostsfile_BlockHost} $hostsfile 'martau.com'
    ${hostsfile_BlockHost} $hostsfile 'www.martau.com'
    ${hostsfile_BlockHost} $hostsfile 'www.total-uninstall.com'
    ${hostsfile_BlockHost} $hostsfile 'total-uninstall.com'
    ${hostsfile_BlockHost} $hostsfile '64.91.254.118'

    SetFileAttributes $hostsfile READONLY
SectionEnd


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

Скрытый текст
Код:

Unicode true
SetOverwrite on
RequestExecutionLevel admin

!include "x64.nsh"
!include "LogicLib.nsh"
!include "hostsblock.nsh"

Section
Var /global hostsics
    StrCpy $hostsics "$SYSDIR\drivers\etc"
${IfThen} ${RunningX64} ${|} ${DisableX64FSRedirection} ${|}
${If} ${FileExists} "$hostsics\hosts.ics"
    SetFileAttributes "$hostsics\hosts.ics" NORMAL
    StrCpy $0 '$hostsics\hosts.ics'
    StrCpy $1 '$hostsics\1.txt'
    StrCpy $2 '$hostsics\2.txt'
    CopyFiles /SILENT $0 $1
    FileOpen  $3 $1 A
    FileSeek  $3 0 END
    FileClose $3
    CopyFiles /SILENT $1 $2
    FileOpen $3 $2 A
    FileClose $3
    ${hostsfile_BlockHost} $2 'martau.com'
    ${hostsfile_BlockHost} $2 'www.martau.com'
    ${hostsfile_BlockHost} $2 'www.total-uninstall.com'
    ${hostsfile_BlockHost} $2 'total-uninstall.com'
    ${hostsfile_BlockHost} $2 '64.91.254.118'
    CopyFiles /SILENT $2 $0
    Delete "$hostsics\1.txt"
    Delete "$hostsics\2.txt"
${Else}
    FileOpen $0 "$hostsics\hosts.ics" w
    FileWrite $0 "0.0.0.0 martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 64.91.254.118 $\r$\n"
    FileClose $0
${EndIf}
    SetFileAttributes "$hostsics\hosts.ics" READONLY
SectionEnd


Так же правильно работает, как с уже созданным файлом "hosts.ics", так и без него такой вариант:

Скрытый текст
Код:

Unicode true
SetOverwrite on
RequestExecutionLevel admin
!include "x64.nsh"
!include "LogicLib.nsh"
!include "hostsblock.nsh"
Section
Var /global hostsfile
    StrCpy $hostsfile "$SYSDIR\drivers\etc\hosts.ics"
${IfThen} ${RunningX64} ${|} ${DisableX64FSRedirection} ${|}
${If} ${FileExists} "$hostsfile"
    SetFileAttributes "$hostsfile" NORMAL
    ${hostsfile_BlockHost} "$hostsfile" 'martau.com'
    ${hostsfile_BlockHost} "$hostsfile" 'www.martau.com'
    ${hostsfile_BlockHost} "$hostsfile" 'www.total-uninstall.com'
    ${hostsfile_BlockHost} "$hostsfile" 'total-uninstall.com'
    ${hostsfile_BlockHost} "$hostsfile" '64.91.254.118'
${Else}
    FileOpen $0 "$hostsfile" w
    FileWrite $0 "0.0.0.0 martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 64.91.254.118 $\r$\n"
    FileClose $0
${EndIf}
    SetFileAttributes "$hostsfile" READONLY
SectionEnd


iglezz 06-03-2023 22:28 3004781

inco1, Файл исправлен по старой ссылке.
Косяков там на самом деле там было больше..

inco1 07-03-2023 12:28 3004828

iglezz, Огромнейшая благодарность.
Теперь код, практически в семь строчек работает четко,красиво и правильно, и лучше, чем код в семьдесят строк из "справки", которую всем в свое время навязывал K.A.V. Ему было пытались объяснить, что его код с hosts не корректно работает, но в ответ было, типа "сам дурак, учи справку".

MKN 19-03-2023 11:57 3005691

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

Список с чекбоксами позволяет сделать плагин ListView. Но возможно ли сделать несколько раскрывающихся списков на кастомной странице ?

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

iglezz 19-03-2023 18:56 3005715

Цитата:

Цитата MKN
Задача: нужна кастомная страница, на которой, к примеру, вверху страницы помещаются несколько кликабельных либо кнопок, либо ...»

В простейшем случае по событию от кнопки или другого контрола показываются нужные вещи и прячутся ненужные. Фактически это имитация (с кучей ручной работы) отсутствующего в nsDialogs Tab Control.
А дальше зависит от потребностей и фантазии..
пример
Код:

RequestExecutionLevel user
!include "LogicLib.nsh"
!include "nsDialogs.nsh"

Page custom NSD

Section
SectionEnd

Var Dialog
Var hButtonOpt1
Var hButtonOpt11
Var hButtonOpt12
Var hButtonOpt13
Var hButtonOpt2
Var hButtonOpt21
Var hButtonOpt22
Var hButtonOpt3
Var hButtonOpt31
Var hButtonOpt32

Function NSD
        nsDialogs::Create 1018
        Pop $Dialog
   
   
    ${NSD_CreateFirstRadioButton} 0u 0u 30% 16u "Options 1"
    Pop $hButtonOpt1
    ${NSD_OnClick} $hButtonOpt1 SwitchOptions

    ${NSD_CreateAdditionalRadioButton} 33% 0u 30% 16u "Options 2"
    Pop $hButtonOpt2
    ${NSD_OnClick} $hButtonOpt2 SwitchOptions

    ${NSD_CreateAdditionalRadioButton} 66% 0u 30% 16u "Options 3"
    Pop $hButtonOpt3
    ${NSD_OnClick} $hButtonOpt3 SwitchOptions


    ${NSD_CreateCheckBox} 10u 30u 80u 20u "111"
    Pop $hButtonOpt11
    ${NSD_AddStyle} $hButtonOpt11 ${WS_GROUP}
    ${NSD_CreateCheckBox} 10u 50u 80u 20u "222"
    Pop $hButtonOpt12
    ${NSD_CreateCheckBox} 10u 70u -20u 20u "333"
    Pop $hButtonOpt13

    ${NSD_CreateCheckBox} 10u 30u -20u 20u "2x111"
    Pop $hButtonOpt21
    ${NSD_CreateCheckBox} 10u 50u -20u 20u "2x222"
    Pop $hButtonOpt22

    ${NSD_CreateCheckBox} 10u 30u -20u 20u "3x111"
    Pop $hButtonOpt31
    ${NSD_CreateCheckBox} 10u 50u -20u 20u "3x222"
    Pop $hButtonOpt32

    SendMessage $hButtonOpt1 ${BM_CLICK} 0 0

    nsDialogs::Show
FunctionEnd


Function SwitchOptions
    Pop $0

    ${Select} $0
        ${Case} $hButtonOpt1
            StrCpy $1 ${SW_SHOW}
            StrCpy $2 ${SW_HIDE}
            StrCpy $3 ${SW_HIDE}
        ${Case} $hButtonOpt2
            StrCpy $1 ${SW_HIDE}
            StrCpy $2 ${SW_SHOW}
            StrCpy $3 ${SW_HIDE}
        ${Case} $hButtonOpt3
            StrCpy $1 ${SW_HIDE}
            StrCpy $2 ${SW_HIDE}
            StrCpy $3 ${SW_SHOW}
    ${EndSelect}

    ShowWindow $hButtonOpt11 $1
    ShowWindow $hButtonOpt12 $1
    ShowWindow $hButtonOpt13 $1

    ShowWindow $hButtonOpt21 $2
    ShowWindow $hButtonOpt22 $2

    ShowWindow $hButtonOpt31 $3
    ShowWindow $hButtonOpt32 $3
FunctionEnd


MKN 19-03-2023 19:12 3005716

iglezz,
Такой способ понятен, но списки хотелось бы выпадающие, а не пропадающие...
Если всё же использовать несколько ListView размером во всю страницу, их получится переключать(скрывать) без проблем ? Они ведь будут друг на друге... И запомниться ли состояние выбранных элементов в LV при переключении ?

iglezz 19-03-2023 19:23 3005717

MKN, А тут всё равно какой контент будет. Хоть Listview, хоть RichText, хоть видео...
На состояние контролов это не повлияет- они просто прячутся/показываются.

MKN 20-03-2023 11:55 3005762

iglezz, подскажи пожалуйста, как поместить в собственное окно (CreateWindowEx) чекбоксы и кнопки ?
Про размещение текста инфа есть, про прочее - не нашёл... Вероятно нужен какой то спец стиль ?

iglezz 20-03-2023 13:22 3005770

MKN, Все стандартные контролы создаются одинаково через CreateWindowEx/CreateWindow, только у простого текста будет ClassName STATIC, у кнопки - BUTTON и т.д.

MKN 20-03-2023 13:52 3005775

iglezz, т.е. в собственном окне, созданным с помощью CreateWindowEx, можно создать ещё 10 чекбоксов и кнопок ?
Хмм... Никак не получается...

iglezz 20-03-2023 17:16 3005793

MKN, для вновь создаваемых окон-детей (в терминологии WinAPI) нужно в функции CreateWindowEx указать дескриптор окна-родителя.
В качестве микро-дополнения к моему примеру на прошлой странице:
Код:

    ${NSD_CreateCheckBox} 40u 5u 40u 20u "111.1"
    Pop $hChildButton1
    System::Call 'user32::SetParent(i$hChildButton1,i$hButtonOpt11)i.R0'

SetParent поменяет родителя с окна nsDialogs на кнопку $hButtonOpt11, координаты x,y будут задавать положение относительно нового родителя.
Тоже самое можно сделать и через System::Call 'user32::CreateWindowEx... + SendMessage ... ${WM_SETFONT}

Такие детки будут прятаться/показываться/перемещатся вместе с родителем.
Сразу проблема - навешивание функций-обработчиков через ${NSD_OnClick} и т.п. не работает для таких деток. Так как события получает родитель, который должен иметь обработчик этих событий. Обработчик написать не проблема, а вот как в nsis получить дескриптор функции-обработчика (необходим для установки функции обработчиком) - хз
Доступное костыльное решение (больше костылей богу костылей!) -- менять родителя туда-сюда (окно nsDialogs <--> своё окно)


Минимальный пример не помешал бы для более конструктивного обсуждения и во избежание путаницы в терминах. А ещё лучше - короткий рассказ, зачем городить такую жесть на столь ограниченной платформе как nsis :)

MKN 23-03-2023 16:19 3005970

Подскажите, в чём проблема ? - не подключается !include "CommCtrl.nsh"
При компиляции ошибка :

!include: "CommCtrl.nsh" (UTF8)
Bad text encoding: CommCtrl.nsh:2
!include: error in script: "CommCtrl.nsh" on line 2

(на второй строке хедера всего лишь - !define COMMCTRL_INCLUDED )

Пробовал штук пять вариантов CommCtrl.nsh. Без результата.
NSIS 3.8.0.0 WINDOWS 7 X64

C NSIS 3.0 всё нормально

iglezz 23-03-2023 16:57 3005972

Цитата:

Цитата MKN
!include: "CommCtrl.nsh" (UTF8)
Bad text encoding: CommCtrl.nsh »

Неверно распознало кодировку как UTF-8 и файл в итоге содержит некорректные для UTF-8 символы. Например в !define COMMCTRL_INCLUDED будет буква O,E,.. из кириллицы.
Архив с nsis.sourceforge.io/Header_file_for_Listview такой проблемы не имеет, CommCtrl.nsh там в кодировке ANSI/ACP (только пришлось самому дописать отсутствующий !define _COMMCTRL_NSH_VERBOSE 1)

Этот тип ошибок лечится принудительным указанием кодировки: !include /charset=кодировка файл

MKN 23-03-2023 17:21 3005974

Цитата:

Цитата iglezz
там в кодировке ANSI/ACP (только пришлось самому дописать отсутствующий !define _COMMCTRL_NSH_VERBOSE 1) »

Так я оттуда и использую... Может дело в отсутствующем !define _COMMCTRL_NSH_VERBOSE 1 ?
Куда его правильно конкретно дописать ? (или просто 3 заменить на 1...)

iglezz 23-03-2023 17:39 3005976

MKN, После скачивания и распаковки попытка компиляции примерок ведёт к ошибке
Цитата:

!verbose: Invalid verbose level
Error in macro __NSD_LV_InsertColumn_Call on macroline 2
А вторая строка в этом макросе - !verbose ${_COMMCTRL_NSH_VERBOSE}.
Т.е. ошибка в том что _COMMCTRL_NSH_VERBOSE не задан.

Сейчас уже вижу, что мой быстрый фикс с добавлением !define _COMMCTRL_NSH_VERBOSE 1 был слишком быстрый, а правильный способ - замена _COMMCTRL_NSH_VERBOSE на _COMMCTRL_VERBOSE.
Это явно было последнее изменение перед запаковкой, т.к. даже отступ изменён с двух пробелов на табуляцию в строках с _COMMCTRL_NSH_VERBOSE

После исправления примеры компилируются без ошибок.

MKN 23-03-2023 17:47 3005977

iglezz,
У меня __NSD_LV_InsertColumn_Call on macroline 2 на 1292 строке...
Изменил в макросе на !verbose ${_COMMCTRL_VERBOSE}. Ошибка...

Может скинешь мне свой рабочий CommCtrl.nsh ? И с какой версией NSIS проверяешь ? С 3.0 ведь работает безо всяких правок...

А !verbose ${_COMMCTRL_NSH_VERBOSE} у мня в хедере 14 штук... Все изменять ?
- Изменил - ошибка та же...
Преобразовал хедер в UTF-8 - та же ошибка...

iglezz 23-03-2023 18:16 3005979

Вложений: 1
MKN, использую страндартную 3.08

MKN 23-03-2023 18:40 3005981

Цитата:

Цитата iglezz
использую страндартную 3.08 »

Удалил 3.08, переустановил(с https://sourceforge.net/projects/nsi...test/download), скопировал твой CommCtrl.nsh, компилю - не работает, та же ошибка...
Удалил, установил 3.0.6.1 и т.д. - всё работает...
(Скрипт для теста - ранее всегда рабочий и даже пробовал пустой, только с CommCtrl.nsh)
И что это такое ? :cool: Позже попробую на др. компе...

ps Если в 3.08 заменить файл Program Files (x86)\NSIS\Bin\makensis.exe файлом из 3.06 - всё работает.
Прочие файлы на работу вроде как не влияют...

iglezz 24-03-2023 11:34 3006011

MKN, Есть у меня виртуалка с Win7x32 чистая 6.1.7601 без обновлений и модификаций - работает корректно. Проблема, видимо, зависит от каких-то специфичных вещей в конкретных сборках винды.
Такое лечить правильнее указанием кодировки !include /charset=...
В порядке предположения, судя по исходникам, 3.07 у тебя должна так же сбоить.

Сверху ещё можно накатить обнову с https://github.com/kichik/nsis/.
Как минимум забрать папку Include\ - исправлен баг в LogicLib.nsh и обновление WinVer.nsh (определение вин 11 и билдов вин10 после 2021 года)

MKN 24-03-2023 12:15 3006015

Цитата:

Цитата iglezz
Как минимум забрать папку Include\ - исправлен баг в LogicLib.nsh и обновление WinVer.nsh »

Я туда периодически заглядываю, забираю обновы. Хотя WinVer.nsh там уже устаревший... (Сам принцип определения W11 в нём наверное не совсем удачный... Обновлять всё время каждый чих MS... не есть хорошо.)
Также видел у китайцев версии(ими названные) 3.0.8.1 - и x86 и даже x64. Причём с защитой от взлома, (вероятно имеется ввиду защита от декомпилляции), там почти все файлы другие и фейс китайский. (Но CommCtrl.nsh и с ними у меня не работает... :( )

Flix 25-03-2023 02:28 3006135

Цитата:

Цитата MKN
Также видел у китайцев версии(ими названные) 3.0.8.1 - и x86 »

Это компиляция с последними изменениями из официального хаба, с момента релиза 3.0.8, плюс свои фишки и плюшки.

Цитата:

Цитата MKN
и даже x64 »

Это компиляция на базе неофициальной NSIS 64-bit (https://github.com/negrutiu/nsis), плюс все то же что и у х86.

Цитата:

Цитата MKN
Причём с защитой от взлома, (вероятно имеется ввиду защита от декомпилляции) »

Измените в исходниках exeheader (fileform.cpp, fileform.c, fileform.h) и любой декомпилятор (автораспаковщик) обломается.
Вот как раз это и наблюдается в хидере инсталляторов, собранных китайской версией. :yes:

inco1 01-04-2023 07:12 3006486

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

Код:

    ${If} ${IsWin2003}
    ${orIf} ${IsWin2003R2}
    ${orIf} ${IsWin2008}
    ${orIf} ${IsWin2008R2}
    ${orIf} ${IsWin2012}
    ${orIf} ${IsWin2012R2}
    ${orIf} ${IsWin2016}
    ${orIf} ${IsWin2019}
    ${orIf} ${IsWin2022}
  DetailPrint "Running on Windows Server"
    ${EndIf}

Не на чем проверить.

iglezz 01-04-2023 11:06 3006491

Должно быть достаточно ${If} ${IsServerOS} ...

inco1 01-04-2023 11:57 3006494

Компилируется, но не уверен, что определит 2019 и 2022. Ведь мой вариант с ${IsWin2019} и ${IsWin2022} даже не компилируется, а только компилируется без них. Использую последнюю WinVer.nsh с хитхаба.

Нашел выход через реестр. Да и в этом варианте WinVer.nsh применять не нужно. Думаю, что в реестре для всех же серверных версий прописано

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"InstallationType"="Server"

Код:

Function .onInit
Var /GLOBAL Server
    ReadRegStr $Server HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "InstallationType"
FunctionEnd

Section
    ${If} $Server == Server
; ====Running on Windows Server"
    ${EndIf}
SectionEnd


iglezz 01-04-2023 14:44 3006507

Цитата:

Цитата inco1
Компилируется, но не уверен, что определит 2019 и 2022 »

Информация по системе собирается при запуске nsis-инсталлятора (используя GetVersionEx).
Так что будет определять, пока сами мелкомягкие не сломают.

Цитата:

Цитата inco1
Ведь мой вариант с ${IsWin2019} и ${IsWin2022} даже не компилируется »

Логично, т.к. такие определения ещё не добавлены в WinVer.nsh

Цитата:

Цитата inco1
Нашел выход через реестр. Да и в этом варианте WinVer.nsh применять не нужно. Думаю, что в реестре для всех же серверных версий прописано »

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

Те же ${IsWin2019} и ${IsWin2022} (как и любые другие проверки) можно легко добавить.
И даже в основной пакет исправления/дополнения можно добавить -- патчи/пулреквесты принимаюся на github/sourceforge

inco1 02-04-2023 10:00 3006556

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

Begin2Fly 02-04-2023 13:15 3006561

Цитата:

Цитата inco1
Можно как то прописать, чтобы екзешник не запускал себя повторно , если найден процесс с его именем? »

В справочнике NSIS есть раздел "Предотвращение множественности запуска" и "Работа с процессами с помощью NSIS", оба подойдут.

iglezz 02-04-2023 18:39 3006587

Пример из справочника плох тем, что он немного неправильный по части реализации и устаревший (${NSIS_VERSION} < 3 && ANSI).

Базовый пример для проверки на запуск копии приложения есть в базовой справке.
Более правильный пример с автопереключеніем на уже запущенную копию есть на сайте - Allow only one installer instance.

inco1 07-04-2023 03:22 3006934

iglezz, приветствую.
Цитата:

Простейший цикл последовательного чтения файла:
Код

FileOpen $handle $filename R
${Do}
FileRead $handle $fileread
${IfThen} ${Errors} ${|} ${ExitDo} ${|}

DetailPrint '[$fileread]'
${Loop}
FileClose $handle
Ничего не получается. Можете показать пример поиска конкретной записи, вот как в этом цикле:

FileOpen $0 "test.txt" R
${LineSum} "test.txt" $R0
StrCpy $R1 0
readnext:
IntOp $R1 $R1 + 1
IntCmp $R1 $R0 0 0 end
${LineRead} "test.txt" "$R1" $R3
${WordFind} "$R3" "test-test" "E+1{" $R2
IfErrors readnext 0
MessageBox MB_OK "Найдена фраза ( test-test )"
end:
FileClose $0

iglezz 07-04-2023 13:09 3006970

Пример под спойлером годится для извлечения/поиска информации, для [пере]записи будет несколько по другому.

пример
Код:

ShowInstDetails show
RequestExecutionLevel user


!include Util.nsh
!include LogicLib.nsh
!include StrFunc.nsh
${Using:StrFunc} StrLoc


!define FileReadAuto `!insertmacro FileReadAuto`
!macro FileReadAuto ISUTF16LE HANDLE READLINE
    StrCmp ${ISUTF16LE} 0 0 +3
    FileRead ${HANDLE} ${READLINE}
    Goto +2
    FileReadUTF16LE ${HANDLE} ${READLINE}
!macroend

!define FileFindStrStruct `(i, i, &t${NSIS_MAX_STRLEN}) p`
/*  {
    номер строки (начинается с 1),
    позиция искомого в строке (начинается с 0),
    строка, содержащая искомую строку
    }
*/
!define FileFindStr `!insertmacro FileFindStr`
!macro FileFindStr OUTPUT FILENAME STRTOFIND
    Push '${STRTOFIND}'
    Push '${FILENAME}'
    ${CallArtificialFunction} FileFindStr_macro
    Pop ${OUTPUT}
!macroend
!macro FileFindStr_macro
    Exch $0 ; [in] FileName / [out] ReturnStructAddr
    Exch
    Exch $1 ; StrToFind
    Push $2 ; FileHandle
    Push $3 ; ISUTF16LEFlag
    Push $4 ; ReadData
    Push $5 ; StrToFindLine
    Push $6 ; StrToFindPosInLine
    Push $7 ; ReturnStructAddr

    ; инициализация переменных
    StrCpy $5 0 ; Reset Line counter
    StrCpy $7 0 ; Reset ReturnStructAddr

    FileOpen $2 $0 R
    IfErrors FileFindStr_macro_end

    ; определение читающей инструкции (FileRead | FileReadUTF16LE)
    FileReadWord $2 $4
    ${If} $4 = 0xFEFF
        StrCpy $3 1
    ${Else}
        StrCpy $3 0
    ${EndIf}
    FileSeek $2 0 SET

    ; основной цикл построчного чтения файла
    ${Do}
        ${FileReadAuto} $3 $2 $4
        ${IfThen} ${Errors} ${|} ${ExitDo} ${|}

        IntOp $5 $5 + 1

        ${StrLoc} $6 $4 $1 >
        ${If} $6 != ''
            ; если строка найдена -> пишем результат в структуру ..
            System::Call '*${FileFindStrStruct} (r5, r6, r4) .r7'
            ; .. и выходим
            ${ExitDo}
        ${EndIf}
    ${Loop}
    FileClose $2

    FileFindStr_macro_end:
    StrCpy $0 $7

    Pop $7
    Pop $6
    Pop $5
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Exch $0
!macroend


Section
    ${FileFindStr} $0 '${NSISDIR}\Include\StrFunc.nsh' 'macro '
    ${If} $0 <> 0
        ; распаковка структуры
        System::Call '*$0${FileFindStrStruct} (.r1, .r2, .r3)'
       
        DetailPrint 'Line: $1'
        DetailPrint 'Pos: $2'
        DetailPrint 'Str: $3'
    ${EndIf}
SectionEnd


inco1 07-04-2023 16:42 3007027

iglezz, Спасибо за пример, но я так вообще и не понял, как к этому примеру прикрутить мой файл "test.txt" и искомую фразу "test-test", как в моём примере выше.

iglezz 07-04-2023 17:09 3007029

inco1,
В этом примере
Код:

${FileFindStr} результат файл строка
если строка найдена, то результат будет отличен от нуля

inco1 07-04-2023 17:37 3007032

iglezz, еще раз благодарю. Долго же до меня доходят очевидные вещи. Видать возраст.

inco1 07-04-2023 20:10 3007061

Еще такой интересный вопрос. Как правильно сравнить две переменные?
Например, есть переменные $R5 и $R6. В обеих есть некое значение из цифр и английских букв. Это неизвестное значение может быть, как одинаковым, так и разным.
Код, что ниже не работает, хотя я для теста специально ставил в переменные одинаковые значения - "0x03e700ff" , а показывало $R5 != "0x03e700ff", а когда менял местами $R5 и $R6, то показывало $R6 != "0x03e700ff". Что подтверждает, что значения в переменных одинаковы.

Код:

StrCmp $R5 "$R6" 0 +3
DetailPrint '$$R5 == "$R6"'
Goto +2
DetailPrint '$$R5 != "$R6"'

Что еще можно использовать для данной ситуации?

iglezz 07-04-2023 21:58 3007073

Цитата:

Цитата inco1
Код, что ниже не работает, хотя ..»

Должен работать. Если не работает, значит есть малозаметная ошибка/опечатка.

Цитата:

Цитата inco1
Как правильно сравнить две переменные? »

В NSIS любая переменная хранится как строка, для для манипуляций с числами эта строка преобразуется в число.
StrCmp для чисел подходит только в случае, когда гарантированно совпадёт система счисления. Число 16 (десятичное) может быть записано как 0x10 (шестнадцатеричная) или 020 (восьмеричная) и для IntCmp все эти формы одинаковы.

inco1 07-04-2023 22:54 3007078

iglezz,

Ну да, должен работать, но не работает. Вот с этого кода скомпилите экзешник и сами убедитесь:


Код:

                RequestExecutionLevel user
                OutFile "test.exe"

                !include "LogicLib.nsh"
                !include "WordFunc.nsh"
                !include "TextFunc.nsh"

Function .onInit

    StrCpy $R6 "c:\"
    System::Call 'Kernel32::GetVolumeInformation(t "$R6",t.r3,i ${NSIS_MAX_STRLEN},*i,*i,*i.r1,t.r2,i ${NSIS_MAX_STRLEN})i.r0'
      ${If} $0 <> 0
    IntFmt $1 "%#.8x" $1
    StrCpy $R7 "$1"
      ${EndIf}

      ${LineSum} "Info.txt" $R0
    StrCpy $R1 0
    IntOp $R1 $R1 + 1
    IntCmp $R1 $R0 0 0 end
      ${LineRead} "Info.txt" "$R1" $R3
    end:

    StrCpy $R8 "$R3"

FunctionEnd


Section Message

          MessageBox MB_OK "    1значение  $R7  -  2значение  $R8  "

StrCmp $R7 "$R8" Well Unequal
Well:
  MessageBox MB_OK "Значения равны"
  Goto Next
Unequal:
  MessageBox MB_OK "Значения не равны"
Next:

    StrCmp $R7 '$R8' 0 +3
DetailPrint '$$R7 == "$R8"'
    Goto +2
DetailPrint '$$R7 != "$R8"'

SectionEnd

Section File

    FileOpen $0 "Info.txt" w
    FileWrite $0 "$R7$\r$\n"
    FileClose $0

SectionEnd

Первый запуск не считается, потому что еще не будет файла Info.txt. А вот второй запуск в сообщении визуально покажет, что переменные бы равны, но по двум кодам сравнения через StrCmp $R7 '$R8' покажет, что совсем не равны.

iglezz 07-04-2023 23:10 3007080

inco1, Достаточно заменить MessageBox на такой
Код:

MessageBox MB_OK "[$R7]$\n[$R8]"
и сразу станет видна причина - строка считывается с файла вместе с символами окончания строки (\r\n)
Прочитанную из файла строку надо чистить от них (TrimNewLines в TextFunc.nsh)

inco1 07-04-2023 23:28 3007081

Вот спасибо. Пол дня пытался понять, что не так. Я и подозревал, что что то считывается невидимое, потому что, если напрямую присваивал любые одинаковые значения, то было всё правильно.
Начну знакомство с очисткой.

P.S. Я так понял, что нельзя в моём конкретном примере обойтись как нибудь без $\n и неизвестной для меня очистки? Ведь будет только одна строка.

iglezz 07-04-2023 23:35 3007082

Самый простой способ хранения значений в файле - использовать ini-файл (ReadINIStr/WriteINIStr)

inco1 07-04-2023 23:39 3007083

Попробую.

Добавлено:

Всё получилось и работает как надо. Это я так хочу использовать "уникальную метку" системы. Но не уверен, что данные, те что я использую будут уникальными для всех систем:

Код:

    StrCpy $R6 "c:\"
    System::Call 'Kernel32::GetVolumeInformation(t "$R6",t.r3,i ${NSIS_MAX_STRLEN},*i,*i,*i.r1,t.r2,i ${NSIS_MAX_STRLEN})i.r0'

В связи с этим еще один вопрос, откуда в системе виндовс можно взять "метку", чтобы на 100 процентов или почти на 100 процентов эти данные были "уникальными" для каждой системы?

MKN 08-04-2023 09:24 3007090

Цитата:

Цитата inco1
откуда в системе виндовс можно взять "метку", чтобы на 100 процентов или почти на 100 процентов эти данные были "уникальными" для каждой системы? »

Кроме ID винта, используют MAC сетевухи, время создания системных каталогов или всё это в совокупности + иногда математика с этими данными...

inco1 08-04-2023 09:37 3007091

MKN, приветствую.
Как записать ID винта? Или ID винта это его серийный номер?

MKN 08-04-2023 12:04 3007100

Вложений: 1
inco1,

есть миниатюрный плагин для определения инфы о HDD (см. прикреплённый файл)

или

Цитата:

OutFile "GetVolumeInformation.exe"
; под серийным номером подразумевается "Volume ID"
var ser
var ser1
var disk

!define GetVolumeInformation "Kernel32::GetVolumeInformation(t,t,i,*i,*i,*i,t,i) i"

Section
; определяем системный диск
StrCpy $disk $windir
StrCpy $disk $windir 3
MessageBox MB_OK $disk

System::Call '${GetVolumeInformation} ("$disk",,${NSIS_MAX_STRLEN},.r0,,,,${NSIS_MAX_STRLEN})'
IntFmt $ser "%08X" $0 ; из цифрового - HEX

; стандартное представление: 4 символа-4символа
StrCpy $ser1 $ser 4 ; берём первые 4 символа
StrCpy $ser $ser "" 4 ; отсекаем первые 4 символа
StrCpy $ser "$ser1-$ser"
MessageBox MB_OK "VolumeID $ser"
SectionEnd

inco1 09-04-2023 14:46 3007129

iglezz, Доброго вам дня и здоровья.

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

Вот экзешник с вашим кодом, который прекрасно находит слово "Word.com" в файле hosts:

Код:

RequestExecutionLevel user
              SilentInstall silent

                !include Util.nsh
                !include LogicLib.nsh
                !include StrFunc.nsh
                ${Using:StrFunc} StrLoc

!define FileReadAuto `!insertmacro FileReadAuto`
!macro FileReadAuto ISUTF16LE HANDLE READLINE
    StrCmp ${ISUTF16LE} 0 0 +3
    FileRead ${HANDLE} ${READLINE}
    Goto +2
    FileReadUTF16LE ${HANDLE} ${READLINE}
!macroend

!define FileFindStrStruct `(i, i, &t${NSIS_MAX_STRLEN}) p`
!define FileFindStr `!insertmacro FileFindStr`
!macro FileFindStr OUTPUT FILENAME STRTOFIND
    Push '${STRTOFIND}'
    Push '${FILENAME}'
    ${CallArtificialFunction} FileFindStr_macro
    Pop ${OUTPUT}
!macroend
!macro FileFindStr_macro
    Exch $0
    Exch
    Exch $1
    Push $2
    Push $3
    Push $4
    Push $5
    Push $6
    Push $7

    StrCpy $5 0
    StrCpy $7 0

    FileOpen $2 $0 R
    IfErrors FileFindStr_macro_end

    FileReadWord $2 $4
    ${If} $4 = 0xFEFF
        StrCpy $3 1
    ${Else}
        StrCpy $3 0
    ${EndIf}
    FileSeek $2 0 SET

    ${Do}
        ${FileReadAuto} $3 $2 $4
        ${IfThen} ${Errors} ${|} ${ExitDo} ${|}

        IntOp $5 $5 + 1

        ${StrLoc} $6 $4 $1 >
        ${If} $6 != ''
            System::Call '*${FileFindStrStruct} (r5, r6, r4) .r7'
            ${ExitDo}
        ${EndIf}
    ${Loop}
    FileClose $2

    FileFindStr_macro_end:
    StrCpy $0 $7

    Pop $7
    Pop $6
    Pop $5
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Exch $0
!macroend


Section

    ${FileFindStr} $0 '$SYSDIR\drivers\etc\hosts' 'Word.com'
    ${If} $0 <> 0
          MessageBox MB_OK "        Нужное слово найдено "
    ${Else}
          MessageBox MB_OK "      Нужное слово НЕ найдено "
    ${EndIf}

SectionEnd

А вот в код добавлена функция с двумя строчками и он перестал искать.

Код:

RequestExecutionLevel user
              SilentInstall silent

                !include Util.nsh
                !include LogicLib.nsh
                !include StrFunc.nsh
                ${Using:StrFunc} StrLoc

!define FileReadAuto `!insertmacro FileReadAuto`
!macro FileReadAuto ISUTF16LE HANDLE READLINE
    StrCmp ${ISUTF16LE} 0 0 +3
    FileRead ${HANDLE} ${READLINE}
    Goto +2
    FileReadUTF16LE ${HANDLE} ${READLINE}
!macroend

!define FileFindStrStruct `(i, i, &t${NSIS_MAX_STRLEN}) p`
!define FileFindStr `!insertmacro FileFindStr`
!macro FileFindStr OUTPUT FILENAME STRTOFIND
    Push '${STRTOFIND}'
    Push '${FILENAME}'
    ${CallArtificialFunction} FileFindStr_macro
    Pop ${OUTPUT}
!macroend
!macro FileFindStr_macro
    Exch $0
    Exch
    Exch $1
    Push $2
    Push $3
    Push $4
    Push $5
    Push $6
    Push $7

    StrCpy $5 0
    StrCpy $7 0

    FileOpen $2 $0 R
    IfErrors FileFindStr_macro_end

    FileReadWord $2 $4
    ${If} $4 = 0xFEFF
        StrCpy $3 1
    ${Else}
        StrCpy $3 0
    ${EndIf}
    FileSeek $2 0 SET

    ${Do}
        ${FileReadAuto} $3 $2 $4
        ${IfThen} ${Errors} ${|} ${ExitDo} ${|}

        IntOp $5 $5 + 1

        ${StrLoc} $6 $4 $1 >
        ${If} $6 != ''
            System::Call '*${FileFindStrStruct} (r5, r6, r4) .r7'
            ${ExitDo}
        ${EndIf}
    ${Loop}
    FileClose $2

    FileFindStr_macro_end:
    StrCpy $0 $7

    Pop $7
    Pop $6
    Pop $5
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Exch $0
!macroend


Section

    ${FileFindStr} $0 '$SYSDIR\drivers\etc\hosts' 'Word.com'
    ${If} $0 <> 0
          MessageBox MB_OK "        Нужное слово найдено "
    ${Else}
          MessageBox MB_OK "      Нужное слово НЕ найдено "
    ${EndIf}

SectionEnd


Function .onInit

Var /GLOBAL Proga

        ReadRegStr $Proga HKLM "SOFTWARE\Test" "Test"

FunctionEnd


iglezz 09-04-2023 15:22 3007131

inco1, да, в nsis вечно забываю сбрасывать error флаг
в макросе FileFindStr_macro перед
Код:

FileOpen $2 $0 R
надо добавить
Код:

ClearErrors

inco1 09-04-2023 15:44 3007133

iglezz,

Теперь заработало, как надо. Спасибо за оперативный отклик.

P.S. Сравнивал скорость поиска по ${LineRead} и вашим кодом. Брал 400 строк и нужная вконце, одна строка - одно слово. Ваш код находит мгновенно, а через ${LineRead} около 8-10 секунд.

inco1 25-04-2023 19:30 3008128

Всем доброго дня.
Помогите, пожалуйста с такой проблемой. В одной из папок имеются одна папка с известным названием и несколько неизвестных папок ("Test kkkkkk", "Test ххх", "Test yyyyyyyy", "Test zzzz", ....). Во всех папок первое слово одинаковое. Нужно удалить неизвестные папки, у которых значения k, x, Y, z, ... непостоянные (неизвестные).
Как вариант подойдет что нибудь типа "удалить все папки, кроме одной с известным названием".

iglezz 26-04-2023 03:13 3008136

Для поиска файлов можно применить Locate из FileFunc.nsh
Для сопоставления имён файлов - WinAPI-функции PathMatchSpec/PathMatchSpecEx
PathMatchSpecEx может сопоставлять строку с множеством шаблонов, разделяемых точкой с запятой (из-за чего ";" в шаблонах использовать нельзя).

пример
Код:

!appendfile 'test ccc' ''
!appendfile 'test1234' ''
!system 'md "test"'
!system 'md " test2"'
!system 'md "test aaa"'
!system 'md "test bbb"'
!system 'md "test xxx"'
!system 'md "test yyy"'
!system 'md "test_xyz"'

ShowInstDetails show
RequestExecutionLevel user
SetFont 'Fira Code Retina' 9
InstallColors /windows

!include LogicLib.nsh
!include FileFunc.nsh

Section UseLocate
  ${Locate} $EXEDIR '/M=test *' DeleteFilesByMask
SectionEnd

Function DeleteFilesByMask
  SetDetailsPrint both

  System::Call 'shlwapi.dll::PathMatchSpecEx(tR7, ts, i1)p.R0' 'test xxx;test yyy'
  ${If} $R0 == 1
    ${If} $R6 == ''
      DetailPrint 'RMDir  $R7'
      ; RMDir /r '$R9'
    ${Else}
      DetailPrint 'Delete $R7'
      ; Delete '$R9'
    ${EndIf}
  ${Else}
    DetailPrint 'Skip  $R7'
  ${EndIf}

  Push ''

  SetDetailsPrint textonly
FunctionEnd


AlekseyPopovv 26-04-2023 05:20 3008137

Всем привет. Столкнулся недавно с файлами *.json.
Нашёл плагин NsJSON.
Как создать файл с данными я понял:
Код:

nsJSON::Set /file "$APPDATA\Prog\config.json"
nsJSON::Set /Value `{}`
nsJSON::Set `license_file` /value `"$APPDATA\\Prog\\license.lic",`
nsJSON::Serialize /format /file "$APPDATA\Prog\config.json"

а как потом из этого файла удалить строки не понял. Может кто знает?

iglezz 26-04-2023 13:34 3008150

Цитата:

Цитата AlekseyPopovv
а как потом из этого файла удалить строки не понял. »

Код:

nsJSON::Delete [NodePath] /end
У меня этот плагин работает некорректно на удаление и имеет проблемы с чтением некоторых файлов (например, при наличи пустого массива с них).
Автор плагина давно пропал, так что надеятся на исправление ошибок особо не стоит.

Лучше использовать более проверенный временем инструмент вроде jq

inco1 06-05-2023 07:40 3008612

Всем хорошего дня и здоровья.
Помогите разобраться. Не могу разобраться с условиями, когда все последующие условия привязаны к первому условию, а в этих последующих условиях есть свои условия.... Правильно ли расставил ${EndIf} с такими условиями. По предварительным тестам работает, но не уверен в правильности кода. Последовательность действий изменять нельзя:

Скрытый текст
Код:

Section Run64
      ;  если запущено на х64

      ${If} ${RunningX64}
        ;  (здесь некое действие)        ;; ==  произойдет некое действие

      ${If} ${FileExists} "$R1\A.exe"
        ;  (здесь некое действие)            ;; ==  если найден файл A.exe, то произойдет некое действие
      ${EndIf}

      ${IfNot} ${FileExists} "$R2\A.txt"
      ${AndIfNot} ${FileExists} "$R2\B.txt"              ;; ==  если не найден файл  A.txt и B.txt , то произойдет некое действие
        ;  (здесь некое действие)
      ${EndIf}

      ${IfNot} ${FileExists} "$R3\B.exe"                    ;; ==  если не найден файл B.exe, то произойдет некое действие
        ;  (здесь некое действие)
      ${EndIf}

      ${If} $R4 != 1234567890                                    ;; == если значение переменной $R4 не равно 1234567890, то произойдет некое действие
        ;  (здесь некое действие)
      ${If} ${FileExists} "$R5\C.exe"                          ;; == если значение переменной $R4 не равно 1234567890, и найдены файлы C.exe и D.exe, то произойдет некое действие
      ${AndIf} ${FileExists} "$R5\D.exe"
        ;  (здесь некое действие)
      ${EndIf}
        ;  (здесь некое действие)                            ;; == если значение переменной $R4 не равно 1234567890, то произойдет некое действие
      ${EndIf}
          ;  (здесь некое действие)                          ;; == если значение переменной $R4 не равно 1234567890, то произойдет некое действие
      ${EndIf}

SectionEnd


iglezz 06-05-2023 13:25 3008628

Цитата:

Цитата inco1
Правильно ли расставил ${EndIf} с такими условиями. »

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

Section Run64
    ;  если запущено на х64

    ${If} ${RunningX64}
        ;  (здесь некое действие)        ;; ==  произойдет некое действие

        ${If} ${FileExists} "$R1\A.exe"
            ;  (здесь некое действие)            ;; ==  если найден файл A.exe, то произойдет некое действие
        ${EndIf}

        ${IfNot} ${FileExists} "$R2\A.txt"
        ${AndIfNot} ${FileExists} "$R2\B.txt"              ;; ==  если не найден файл  A.txt и B.txt , то произойдет некое действие
            ;  (здесь некое действие)
        ${EndIf}

        ${IfNot} ${FileExists} "$R3\B.exe"                    ;; ==  если не найден файл B.exe, то произойдет некое действие
            ;  (здесь некое действие)
        ${EndIf}

        ${If} $R4 != 1234567890                                    ;; == если значение переменной $R4 не равно 1234567890, то произойдет некое действие
            ;  (здесь некое действие)

            ${If} ${FileExists} "$R5\C.exe"                          ;; == если значение переменной $R4 не равно 1234567890, и найдены файлы C.exe и D.exe, то произойдет некое действие
            ${AndIf} ${FileExists} "$R5\D.exe"
                ;  (здесь некое действие)
            ${EndIf}
           
            ;  (здесь некое действие)                            ;; == если значение переменной $R4 не равно 1234567890, то произойдет некое действие
        ${EndIf}

        ;  (здесь некое действие)                          ;; == если значение переменной $R4 не равно 1234567890, то произойдет некое действие
    ${EndIf}

SectionEnd


Далее нужно избавляться от избыточной вложенности и/или сложности, порой с изменением структуры проекта.

inco1 07-05-2023 07:37 3008653

iglezz,
Цитата:

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

Скрытый текст
Код:

Section Run64
    ;  если запущено на х64

    ${If} ${RunningX64}
        ;  (здесь некое действие)        ;; ==  произойдет некое действие

        ${If} ${FileExists} "$R1\A.exe"
            ;  (здесь некое действие)            ;; ==  если найден файл A.exe, то произойдет некое действие
        ${EndIf}

        ${IfNot} ${FileExists} "$R2\A.txt"
        ${AndIfNot} ${FileExists} "$R2\B.txt"              ;; ==  если не найден файл  A.txt и B.txt , то произойдет некое действие
            ;  (здесь некое действие)
        ${EndIf}

        ${IfNot} ${FileExists} "$R3\B.exe"                    ;; ==  если не найден файл B.exe, то произойдет некое действие
            ;  (здесь некое действие)
        ${EndIf}

        ${If} $R4 != 1234567890                                    ;; == если значение переменной $R4 не равно 1234567890, то произойдет некое действие
            ;  (здесь некое действие)

            ${If} ${FileExists} "$R5\C.exe"                          ;; == если значение переменной $R4 не равно 1234567890, и найдены файлы C.exe и D.exe, то произойдет некое действие
            ${AndIf} ${FileExists} "$R5\D.exe"
                ;  (здесь некое действие)
            ${EndIf}
           
            ;  (здесь некое действие)                            ;; == если значение переменной $R4 не равно 1234567890, то произойдет некое действие
        ${EndIf}

        ;  (здесь некое действие)                          ;; == если значение переменной $R4 не равно 1234567890, то произойдет некое действие
    ${EndIf}                                                          ;; == если запущено на х64, то произойдет некое действие

SectionEnd



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

iglezz 08-05-2023 00:28 3008698

Цитата:

Цитата inco1
И еще вопрос, обязательно ли прописывать к примеру условие: "если файл найден" если следует команда на удаление этого самого файла или что то похожее в этом роде? Это будет "легче" для кода или нейтрально? »

Проверять наличие файла перед удалением не обязательно, но имеет смысл результат, если файл существует, но не может быть удалён
Скрытый текст
Код:

ClearErrors
Delete FILESPEC
${If} ${Errors}
    MessageBox MB_OK "Хьюстон, у нас проблема"
    Quit
${EndIf}


inco1 08-05-2023 06:52 3008700

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

iglezz 09-05-2023 07:22 3008732

VM обнаруживается по записям с аппаратной конфигурации/драйверов, специфическим записям в реестре, файлам, процессам, сервисам.
В случае универсального детектора требуется проверить множество позиций как минимум для HyperV, VirtualBox, VMWare.

AlekseyPopovv 01-06-2023 15:08 3009858

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

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\bam\State\UserSettings\S-1-5-21-1528902807-2110943787-476340328-1000


iglezz 01-06-2023 18:41 3009872

AlekseyPopovv,
В первом случае сложностей не вижу
Во втором случае вижу пару особенностей в виде необходимости получения SID и преобразования буквы диска в имя устройства

Для получения SID текущено пользователя можно применить макрос GetCurrentUserSID
GetCurrentUserSID
Код:

!define GetCurrentUserSID `!insertmacro GetCurrentUserSID `
!macro GetCurrentUserSID out_SID
  Push $0 ; fn ret / out_SID
  Push $1 ; SID struct
  Push $2 ; tmp
 
  System::Call "advapi32::GetUserName(t.s, *i${NSIS_MAX_STRLEN}) i.r0"
  StrCmp $0 0 +5
  System::Call 'advapi32::LookupAccountName(i0, ts, @r1, *i${NSIS_MAX_STRLEN}, t .r2, *i ${NSIS_MAX_STRLEN}, *i .r2 ) i.r0'
  StrCmp $0 0 +3
  System::Call 'advapi32::ConvertSidToStringSid(pr1, *t.r0 )'
  Goto +2
  StrCpy $0 ''
 
  Pop $2
  Pop $1
  Exch $0

  Pop ${out_SID}
!macroend

Пример использования:
Код:

${GetCurrentUserSID} $0
DetailPrint 'SID = [$0]'



Если надо пройтись по всем пользователям, то можно использовать макрос EnumUsersReg EnumUsersRegEx (пример).

Для преобразования пути в простейшем случае (c:\path -> \Device\HarddiskVolume3\path) можно использовать такой макрос:
Скрытый текст
Код:

!define GetPathWithDeviceName `!insertmacro GetPathWithDeviceName `
!macro GetPathWithDeviceName out_DevPath in_DOSPath
  Push '${in_DOSPath}'
  Exch $0
  Push $1
  Push $2

  StrLen $1 $0
  StrCmp $1 1 0 +3
    StrCpy $1 $0:
    Goto +2

  StrCpy $1 $0 2
  System::Call 'kernel32::QueryDosDevice(tr1, t.r2, i${NSIS_MAX_STRLEN} ) i.r3'
 
  StrCmp $3 0 0 +3
    StrCpy $0 ''
    Goto +3

  StrCpy $0 $0 '' 2
  StrCpy $0 $2$0

  Pop $2
  Pop $1
  Exch $0

  Pop ${out_DevPath}
!macroend

Пример использования:
Код:

${GetPathWithDeviceName} $0 "C:\path\to\file"
DetailPrint 'path = [$0]'


AlekseyPopovv 02-06-2023 18:36 3009925

Вложений: 1
Как покрасить эти места в белый?
Код:

Function MyGUIInit
System::Call "user32::GetWindowLong(i$HWNDPARENT,i-20)i.s"
System::Int64Op "0x80000" |
System::Call "user32::SetWindowLong(i$HWNDPARENT,i-20,is)"
System::Call "user32::SetLayeredWindowAttributes(i$HWNDPARENT,i,i243,i0x00000002)"

GetDlgItem $R0 $HWNDPARENT 1034
GetDlgItem $R1 $HWNDPARENT 1037
GetDlgItem $R2 $HWNDPARENT 1038
SetCtlColors $R0 000000 FFFFFF
SetCtlColors $R1 000000 FFFFFF
SetCtlColors $R2 000000 FFFFFF
FunctionEnd


iglezz 02-06-2023 20:59 3009933

Кроме замены цвета фона окна (в .onGUIInit) надо ещё поменять цвет фона каждой страницы и всех элементов в ней (в show-функции для каждой страницы)
пример
Код:

!include WinMessages.nsh
RequestExecutionLevel user
InstallDir $TEMP

Page components "" cshow
Page directory "" dshow
Page instfiles "" ishow

; define background color
!define BACKGROUNDCOLOR 0xFFFFFF

Section `Dummy Section`
    DetailPrint ...
SectionEnd

Function cshow
    ; repaint page
    FindWindow $1 "#32770" "" $HWNDPARENT
    SetCtlColors $1 '' ${BACKGROUNDCOLOR}
   
    ; repaint page controls
    GetDlgItem $0 $1 1031
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1006
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1017
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1021
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1022
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1023
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1032
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
FunctionEnd

Function dshow
    ; repaint page
    FindWindow $1 "#32770" "" $HWNDPARENT
    SetCtlColors $1 '' ${BACKGROUNDCOLOR}

    ; repaint page controls
    GetDlgItem $0 $1 1031
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1006
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1019
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    ; ...
FunctionEnd

Function ishow
    ; repaint page
    FindWindow $1 "#32770" "" $HWNDPARENT
    SetCtlColors $1 '' ${BACKGROUNDCOLOR}

    ; repaint page controls
    GetDlgItem $0 $1 1031
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1006
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
FunctionEnd

Function .onGUIInit
    ; repaint window
    SetCtlColors $HWNDPARENT '' ${BACKGROUNDCOLOR}

    ; set BrandingText ${BACKGROUNDCOLOR} background
    GetDlgItem $0 $HWNDPARENT 1028
    SetCtlColors $0 '' transparent
FunctionEnd


iglezz 02-06-2023 21:31 3009935

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

!include WinMessages.nsh
RequestExecutionLevel user
InstallDir $TEMP

Page components "" cshow
Page directory "" dshow
Page instfiles "" ishow

!define /ifndef RDW_INVALIDATE 0x0001
!define /ifndef RDW_ERASE      0x0004

; define background color
!define BACKGROUNDCOLOR 0xFFFFFF

Section `Dummy Section`
    DetailPrint ...
SectionEnd


Function cshow
    ; repaint window
    SetCtlColors $HWNDPARENT '' ${BACKGROUNDCOLOR}

    ; repaint page
    FindWindow $1 "#32770" "" $HWNDPARENT
    SetCtlColors $1 '' ${BACKGROUNDCOLOR}
   
    ; repaint page controls
    GetDlgItem $0 $1 1031
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1006
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1017
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1021
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1022
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1023
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1032
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}

    System::Call "user32::RedrawWindow(i,i,i,i)i ($HWNDPARENT, 0, 0,${RDW_INVALIDATE}|${RDW_ERASE})"
FunctionEnd

Function dshow
    ; redefine page background
    !define /redef BACKGROUNDCOLOR 0x88ff88

    ; repaint window
    SetCtlColors $HWNDPARENT '' ${BACKGROUNDCOLOR}

    ; repaint page
    FindWindow $1 "#32770" "" $HWNDPARENT
    SetCtlColors $1 '' ${BACKGROUNDCOLOR}

    ; repaint page controls
    GetDlgItem $0 $1 1031
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1006
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1019
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1020
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1023
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1024
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}

    System::Call "user32::RedrawWindow(i,i,i,i)i ($HWNDPARENT, 0, 0,${RDW_INVALIDATE}|${RDW_ERASE})"
FunctionEnd

Function ishow
    ; redefine page background
    !define /redef BACKGROUNDCOLOR 0xabcdef

    ; repaint window
    SetCtlColors $HWNDPARENT '' ${BACKGROUNDCOLOR}

    ; repaint page
    FindWindow $1 "#32770" "" $HWNDPARENT
    SetCtlColors $1 '' ${BACKGROUNDCOLOR}

    ; repaint page controls
    GetDlgItem $0 $1 1031
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}
    GetDlgItem $0 $1 1006
    SetCtlColors $0 '' ${BACKGROUNDCOLOR}

    System::Call "user32::RedrawWindow(i,i,i,i)i ($HWNDPARENT, 0, 0,${RDW_INVALIDATE}|${RDW_ERASE})"
FunctionEnd


Function .onGUIInit
    ; set BrandingText${BACKGROUNDCOLOR} background
    GetDlgItem $0 $HWNDPARENT 1028
    SetCtlColors $0 '' transparent
FunctionEnd


AlekseyPopovv 03-06-2023 16:20 3009964

Вложений: 1
Как переименовать кнопку отмена на кастомной странице ReadmePage?

iglezz 03-06-2023 19:33 3009976

Пример прямо в справке есть
Код:

GetDlgItem $1 $HWNDPARENT 2
SendMessage $1 ${WM_SETTEXT} 0 "STR:Goodbye"

id кнопок:
1 = next
2 = cancel
3 = back

AlekseyPopovv 04-06-2023 11:41 3010009

Есть у кого ни будь пример кастомной страницы MUI_PAGE_INSTFILES?

AlekseyPopovv 04-06-2023 16:43 3010028

Вложений: 1
Как убрать кнопку закрыть и сделать кнопку отмена активной?

iglezz 05-06-2023 00:45 3010043

Цитата:

Цитата AlekseyPopovv
Как убрать кнопку закрыть и сделать кнопку отмена активной? »

Инструкция ShowWindow с примером в справке, аналогично переименовыванию.
Отмену активной сделать мало, там ещё много чего написать надо для обработки этой отмены - InstFiles Cancel - Allowing a user to cancel installation during InstFiles

AlekseyPopovv 06-06-2023 16:38 3010114

iglezz, как поменять шрифт над прогресс баром?

iglezz 06-06-2023 17:33 3010122

CreateFont + WM_SETFONT

Примеры в ${NSISDIR}\Examples\NSISMenu.nsi и ${NSISDIR}\Contrib\Modern UI\*.nsh

AlekseyPopovv 07-06-2023 11:47 3010153

Вложений: 1
iglezz, как исправить? DetailPrint друг на друга наваливается.

iglezz 07-06-2023 12:12 3010154

AlekseyPopovv, Цвет фона надо поменять с прозрачного на нужное значение цвета.

AlekseyPopovv 14-06-2023 14:05 3010565

iglezz,
Код:

FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1004
System::Call UxTheme::SetWindowTheme(ir0,w"",w"")
SendMessage $0 0x0409 0 0x03C03C
SendMessage $0 0x2001 0 0xFF8C00

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

iglezz 14-06-2023 14:51 3010567

AlekseyPopovv, Цвет здесь нужно подавать в формате BGR
И вместо магических чисел лучше использовать человекочитаемые константы из WinMessages.nsh.
Код:

${RGB2BGR} $1 RGB_цвет_прогресса
SendMessage $0 ${PBM_SETBARCOLOR} 0 $1
${RGB2BGR} $1 RGB_цвет_фона
SendMessage $0 ${PBM_SETBKCOLOR}  0 $1

макрос RGB2BGR у меня такой:
Код:

!define  RGB2BGR `!insertmacro RGB2BGR `
!define  BGR2RGB `!insertmacro RGB2BGR `
!define ABGR2RGB `!insertmacro RGB2BGR `
!macro  RGB2BGR out var
  !ifndef DataConv.nsh.tempvars
  !define DataConv.nsh.tempvars
  Var /Global __convtmp1
  Var /Global __convtmp2
  !endif

  !if ${out} == '-'
  !define RGB2BGR:ret ${var}
  !else
  !define RGB2BGR:ret ${out}
  !endif

  IntOp $__convtmp1    ${var} >> 16
  IntOp $__convtmp2    ${var} & 0xFF00
  IntOp ${RGB2BGR:ret}  ${var} << 16
  IntOp ${RGB2BGR:ret}  ${RGB2BGR:ret} & 0xFFFFFF
  IntOp ${RGB2BGR:ret}  ${RGB2BGR:ret} | $__convtmp1
  IntOp ${RGB2BGR:ret}  ${RGB2BGR:ret} | $__convtmp2

  !undef RGB2BGR:ret
!macroend


AlekseyPopovv 23-06-2023 06:54 3011023

На кастомной странице README имеется Link. Его задача по нажатию загружать разные файлы .rtf. Как сделать что бы при нажатии Link, файлы .rtf сбрасывались на начало документа?

iglezz 23-06-2023 09:58 3011032

Цитата:

Цитата AlekseyPopovv
Как сделать что бы при нажатии Link, файлы .rtf сбрасывались на начало документа? »

Отправить richedit контролу сообщение EM_SETSCROLLPOS
Получится что-то вроде
Код:

!define /ifndef /math EM_SETSCROLLPOS  ${WM_USER} + 222
System::Call '*(i0,i0)p.R0'
SendMessage HWND_RICHEDIT ${EM_SETSCROLLPOS} 0 $R0

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

AlekseyPopovv 02-07-2023 10:34 3011381

Скиньте пожалуйста WinVer2.nsh
У меня ругается на:
Код:

!define VER_PLATFORM_WIN32s        0

iglezz 02-07-2023 11:16 3011383

VER_PLATFORM_WIN32s уже определён в Win\WinNT.nsh

А WinVer2.nsh во избежание конфликтов нужно доводить до соответствия актуальной версии NSIS:
Подключить стандартный !include "Win\WinNT.nsh"
Удалить дублирующий !define VER_PLATFORM....

AlekseyPopovv 02-07-2023 11:20 3011384

Буду пробовать. Кстати вышла версия 3.09.

inco1 07-07-2023 16:02 3011783

Всем доброго дня.
Тут застрял на такой проблеме, существует ли в NSIS команда, чтобы узнать, находится ли компьютер в домене?
Нашел только это https://nsis.sourceforge.io/WmiInspector_plug-in но оно даже не компилится в юникоде. Тест выдает какие то китайские иероглифы.
Нужно что нибудь простое, типа "да или нет". Как, например в батнике "wmic.exe ComputerSystem get PartOfDomain"

iglezz 07-07-2023 21:37 3011812

inco1, А есть под рукой для теста комп в домене, на котором это проверить можно?

Наиболее подходящий вариант, похоже, NetGetJoinInformation
Код:

; https://learn.microsoft.com/en-gb/windows/win32/api/lmjoin/nf-lmjoin-netgetjoininformation
System::Call 'netapi32::NetGetJoinInformation(i 0, *t 0 r0, *i 0 r1)i.r2'
${If} $2 != 0
  DetailPrint 'error!'
${Else}
  ${Select} $1
    ${Case} 0
      StrCpy $2 'NetSetupUnknownStatus'
    ${Case} 1
      StrCpy $2 'NetSetupUnjoined'
    ${Case} 2
      StrCpy $2 'NetSetupWorkgroupName'
    ${Case} 3
      StrCpy $2 'NetSetupDomainName'
  ${EndSelect}
  DetailPrint 'name="$0" joinstatus="$2"'
${EndIf}

Другие варианты:
- GetComputerNameEx и NetWkstaGetInfo из этого поста
GetComputerNameEx для ComputerNameDnsDomain (2) для компа не в домене возвращает пустой результат
NetWkstaGetInfo возвращает имя либо домена либо рабочей группы, посему ненадёжна для данной задачи

- Реестр, пустое значение == комп не в домене (надо проверять на корректность)
ReadRegStr $0 HKLM "System\CurrentControlSet\Services\Tcpip\Parameters" "Domain"
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"

inco1 07-07-2023 23:16 3011819

iglezz, Спасибо. Компа нету чтобы проверить, но буду искать и всё попробую.

inco1 08-07-2023 07:59 3011845

iglezz,
Я правильно понял ваш код?
Код:

RequestExecutionLevel user
outfile test.exe
!include LogicLib.nsh

Section

System::Call 'netapi32::NetGetJoinInformation(i 0, *t 0 r0, *i 0 r1)i.r2'

${If} $2 != 0

MessageBox MB_OK "компьютер в домене"
${Else}
MessageBox MB_OK "компьютер НЕ в домене"
${EndIf}

SectionEnd

Я правильно понял код от MKN?
Код:

RequestExecutionLevel user
outfile test2.exe
!include LogicLib.nsh

Section

System::Call 'kernel32.dll::GetComputerNameExA(i 2, t .r0,*i ${NSIS_MAX_STRLEN} r1)i.r2'

${If} $0 == 0

MessageBox MB_OK "компьютер в домене"
${Else}
MessageBox MB_OK "компьютер НЕ в домене"
${EndIf}

SectionEnd


iglezz 08-07-2023 13:44 3011865

inco1,
Для обеих функций результат будет иметь минимум три значения - да, нет, ошибка/не_знаю

В случае NetGetJoinInformation полноценный вариант в виде макроса будет выглядеть так:
NetGetJoinInformation macro
Код:

/*  NetGetJoinInformation macro
   
      Retrieves join status information for the specified computer

    Usage:

      ${NetGetJoinInformation} in_computerName out_joinToName out_joinStatus
   
    Parameters:

      in_computerName - DNS or NetBIOS name of the computer on which to call the function.
                        If this parameter is '' or -, the local computer is used.

      out_joinToName  - NetBIOS name of the domain or workgroup to which the computer is joined
                        If this parameter is '' or -, the value is not used.

      out_joinStatus  - Join status of the specified computer:
        success:
        0 = NetSetupUnknownStatus
        1 = NetSetupUnjoined
        2 = NetSetupWorkgroupName
        3 = NetSetupDomainName
        failure:
        -SYSTEM_ERROR_CODE, e.g. -53 == ERROR_BAD_NETPATH (53)
        https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-

    https://learn.microsoft.com/en-gb/windows/win32/api/lmjoin/nf-lmjoin-netgetjoininformation
*/
!define NetGetJoinInformation `!insertmacro NetGetJoinInformation `
!macro  NetGetJoinInformation in_computerName out_joinToName out_joinStatus
  !if '${in_computerName}' == '-'
  Push ''
  !else
  Push '${in_computerName}'
  !endif
  Exch $0
  Push $1
  Push $2

  System::Call '*(i)p.r1'
  System::Call 'netapi32::NetGetJoinInformation(t r0, @ r2, p r1)i.r0'

  !if '${out_joinToName}' == ''
  !define /redef out_joinToName -
  !endif
  !if ${out_joinToName} != '-'
  !define NetGetJoinInformation[jmp] +5
  !else
  !define NetGetJoinInformation[jmp] +4
  !endif

  StrCmp $0 0 0 ${NetGetJoinInformation[jmp]}
  ;ok
  System::Call '*$1(i.r0)' ; get status
  System::Free $1
  !if ${out_joinToName} != '-'
  System::Call '*$2(t.r1)' ; get name
  !endif
  Goto +3
  ;not ok
  StrCpy $0 -$0 ; -SYSTEM_ERROR_CODE
  StrCpy $1 ''

  !undef NetGetJoinInformation[jmp]

  StrCmp $2 0 +2
    System::Call "netapi32::NetApiBufferFree(pr2)"

  Pop $2
  !if ${out_joinToName} != '-'
  Exch $1 ; name
  Pop ${out_joinToName}
  !else
  Pop $1
  !endif
  Exch $0
  Pop ${out_joinStatus}
!macroend



Для локальной машины ${NetGetJoinInformation} '' '' $R0 или ${NetGetJoinInformation} - - $R0
запишет в $R0 результат:
- Отрицательный результат = ошибка
- Неотрицательный результат:
3 = однозначно в домене
1,2 = однозначно не в домене
0 = неизвестно

В простейшем случае, когда (однозначно в домене == Да, в остальных случаях == Нет), можно добавить LogicLib-тест
Код:

!define IsInDomain `"" IsInDomain`
!macro _IsInDomain _a _b _t _f
  !insertmacro _LOGICLIB_TEMP
  ${NetGetJoinInformation} `${_b}` - $_LOGICLIB_TEMP
  StrCmp $_LOGICLIB_TEMP 3 `${_t}` `${_f}`
!macroend

Тогда проверочное выражение сократится до
Код:

${If} ${IsInDomain} ''
  DetailPrint 'in domain'
${Else}
  DetailPrint 'not in domain'
${EndIf}


inco1 08-07-2023 14:08 3011871

Чтобы не лезть в дебри дал проверить на компе в домене. Отлично работает поиск через реестр. Работают обе строки. Этого более чем достаточно.

Код:

RequestExecutionLevel user
outfile test3.exe
SilentInstall silent
!include x64.nsh
!include LogicLib.nsh

Function .onInit

Var /GLOBAL Domain
Var /GLOBAL Dom
StrCpy $Dom ""

      ${If} ${RunningX64}
      SetRegView 64
      ReadRegStr $Domain HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"
      SetRegView 32
      ${Else}
      ReadRegStr $Domain HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"
      ${EndIf}       

FunctionEnd

Section

${If} $Domain == $Dom

MessageBox MB_OK "      Компьютер НЕ в домене "
${Else}
MessageBox MB_OK "      Компьютер в домене "
${EndIf}

SectionEnd

Код:

RequestExecutionLevel user
outfile test4.exe
SilentInstall silent
!include LogicLib.nsh

Function .onInit

Var /GLOBAL Domain
Var /GLOBAL Dom
StrCpy $Dom ""

      ReadRegStr $Domain HKLM "System\CurrentControlSet\Services\Tcpip\Parameters" "Domain"

FunctionEnd

Section

${If} $Domain == $Dom

MessageBox MB_OK "      Компьютер НЕ в домене "
${Else}
MessageBox MB_OK "      Компьютер в домене "
${EndIf}

SectionEnd


iglezz 08-07-2023 15:37 3011879

inco1,
В этом фрагменте нет смысла дублировать ReadRegStr:
Код:

${If} ${RunningX64}
SetRegView 64
ReadRegStr $Domain HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"
SetRegView 32
${Else}
ReadRegStr $Domain HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"
${EndIf}

Он сокращается до
Код:

${IfThen} ${RunningX64} ${|} SetRegView 64 ${|}   
ReadRegStr $Domain HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"
SetRegView lastused

и дальше сверять можно с пустым значением
Код:

${If} $Domain == ""
  MessageBox MB_OK "      Компьютер НЕ в домене "
${Else}
  MessageBox MB_OK "      Компьютер в домене "
${EndIf}


inco1 09-07-2023 09:00 3011938

iglezz,

А можно ли сократить, к примеру вот такой фрагмент:
Код:

      SetRegView 64
        DeleteRegKey HKEY_LOCAL_MACHINE "Software\Classes\CLSID\test"
      SetRegView 32
        DeleteRegKey HKEY_LOCAL_MACHINE "Software\Classes\CLSID\test"


iglezz 09-07-2023 12:05 3011948

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

!define DeleteRegKey3264 `!insertmacro DeleteRegKey3264 `
!macro  DeleteRegKey3264 REGROOT REGKEY
  SetRegView 64
  DeleteRegKey ${REGROOT} '${REGKEY}'
  SetRegView 32
  DeleteRegKey ${REGROOT} '${REGKEY}'
!macroend

и далее использовать как ${DeleteRegKey3264} HKEY_LOCAL_MACHINE "Software\Classes\CLSID\test"

Если есть группа ключей, то её можно вынести в макрос и использовать его вместе с SetRegView:
Скрытый текст
Код:

!macro DeleteSomeKeys
  DeleteRegKey HKEY_LOCAL_MACHINE ...
  DeleteRegKey HKEY_LOCAL_MACHINE ...
  ...
!macroend

...

SetRegView 64
!insertmacro DeleteSomeKeys
SetRegView 32
!insertmacro DeleteSomeKeys


AlekseyPopovv 11-07-2023 14:24 3012094

iglezz, как создать xml файл с таким содержимым: :o
Код:

<?xml version="1.0" encoding="UTF-8"?>
<RDLXSettings>
  <LangIDList/>
  <Common CreateBackupCopy="0" ShowSplashScreen="0">
    <AutoSave Enable="0" Interval="1"/>
  </Common>
  <ProjectHistory LoadlastProject="0" NoProject="1"/>
    <Spelling Type="1">
    <HunSpellDictionary Enabled="1">$EXEDIR\${APPDIR}\ru-RU.dic</HunSpellDictionary>
  </Spelling>
</RDLXSettings>

Соответственно потом нужно будет удалять строку:
Код:

<HunSpellDictionary Enabled="1">$EXEDIR\${APPDIR}\ru-RU.dic</HunSpellDictionary>
А потом заново записывать эту строку.

Проблема со строкой:
Код:

<Common CreateBackupCopy="0" ShowSplashScreen="0">
Она записывается так:
Код:

<Common>CreateBackupCopy="0" ShowSplashScreen="0"</Common>
И как туда добавить:
Код:

<AutoSave Enable="0" Interval="1"/>
ума не приложу... :(

iglezz 11-07-2023 17:05 3012105

AlekseyPopovv,
Изначальный xml-файл (до внесения изменений) есть?
Вот это вот похоже на некорректную запись (атрибуты записаны на простой текст):
Код:

<Common>CreateBackupCopy="0" ShowSplashScreen="0"</Common>
должно быть
Код:

<Common CreateBackupCopy="0" ShowSplashScreen="0" />
Если файла изначально нет, то можно его создать просто через FileWrite
Если нужно именно модифицировать существующий, то это делается через плагин (nsisXML by Wizou)

AlekseyPopovv 11-07-2023 19:03 3012114

iglezz,
Именно вот так выглядит оригинал.
Код:

<?xml version="1.0" encoding="UTF-8"?>
<RDLXSettings>
  <LangIDList/>
  <Common CreateBackupCopy="0" ShowSplashScreen="0">
    <AutoSave Enable="0" Interval="1"/>
  </Common>
  <ProjectHistory LoadlastProject="0" NoProject="1"/>
    <Spelling Type="1">
    <HunSpellDictionary Enabled="1">$EXEDIR\${APPDIR}\ru-RU.dic</HunSpellDictionary>
  </Spelling>
</RDLXSettings>

Я могу конечно его создать и положить в инсталлятор.
Но как потом удалить и снова добавить строку именно такую:
Код:

<HunSpellDictionary Enabled="1">$EXEDIR\${APPDIR}\ru-RU.dic</HunSpellDictionary>

iglezz 11-07-2023 19:45 3012115

AlekseyPopovv, Что-то в итоге понятнее не стало.
Лучше сначала и по порядку:
1. какое содержимое файла до запуска инсталлера
2. что нужно изменить
3. какое должно быть содержимое файла в итоге

AlekseyPopovv 11-07-2023 19:55 3012116

iglezz,
1.
Код:

<?xml version="1.0" encoding="UTF-8"?>
<RDLXSettings>
  <LangIDList/>
  <Common CreateBackupCopy="0" ShowSplashScreen="0">
    <AutoSave Enable="0" Interval="1"/>
  </Common>
  <ProjectHistory LoadlastProject="0" NoProject="1"/>
    <Spelling Type="1">
    <HunSpellDictionary Enabled="1"></HunSpellDictionary>
  </Spelling>
</RDLXSettings>

2. Строку:
Код:

<HunSpellDictionary Enabled="1"></HunSpellDictionary>
заменить на:
Код:

<HunSpellDictionary Enabled="1">$EXEDIR\${APPDIR}\ru-RU.dic</HunSpellDictionary>
либо в неё записать значение
3.
Код:

<?xml version="1.0" encoding="UTF-8"?>
<RDLXSettings>
  <LangIDList/>
  <Common CreateBackupCopy="0" ShowSplashScreen="0">
    <AutoSave Enable="0" Interval="1"/>
  </Common>
  <ProjectHistory LoadlastProject="0" NoProject="1"/>
    <Spelling Type="1">
    <HunSpellDictionary Enabled="1">C:\my program\ru-RU.dic</HunSpellDictionary>
  </Spelling>
</RDLXSettings>


iglezz 11-07-2023 20:06 3012117

AlekseyPopovv, это простейшее изменение
Код:

        nsisXML::create
        nsisXML::load "x:\path\to\xml\file"
        nsisXML::select '/RDLXSettings/Spelling/HunSpellDictionary'
        nsisXML::setText 'x:\path\to\dict'
        nsisXML::save "x:\path\to\xml\file"

Это без обработки ошибок, при отсутствии файла при чтении или выбираемого через ::select узла установщик просто упадёт.

AlekseyPopovv 19-07-2023 12:30 3012593

Как записать в ini файл такую строку:
Код:

LanguagesPath=@ByteArray(P:/Folder/Program Portable/Settings/OCR)
Пишу так:
Код:

WriteINIStr "$EXEDIR\${DEFDIR}\${SETINI}" "OCR" "LanguagesPath" "@ByteArray($EXEDIR/${DEFDIR}/OCR)"
И получается так:
Код:

LanguagesPath=@ByteArray(P:\Folder\Program Portable/Settings/OCR)

iglezz 19-07-2023 15:25 3012597

Для начала ту часть строки, в которой нужно преобразовать слеши (в данном случае $EXEDIR) нужно обработать
Например, ${StrRep} $0 $EXEDIR / \
И потом только результат можно использовать в WriteIniStr:
WriteINIStr "$EXEDIR\${DEFDIR}\${SETINI}" "OCR" "LanguagesPath" "@ByteArray($0/${DEFDIR}/OCR)"

Полагаю, что у программы могут возникнуть проблемы, если в записываемом пути будут символы вне ANSI-кодировки.

AlekseyPopovv 21-07-2023 08:57 3012660

Цитата:

Цитата iglezz
Например, ${StrRep} $0 $EXEDIR / \ »

Сработало:
Код:

!include "StrFunc.nsh"
${StrRep}

${StrRep} $0 "$EXEDIR" "\" "/"
WriteINIStr "$EXEDIR\${DEFDIR}\${SETINI}" "OCR" "LanguagesPath" "@ByteArray($0/${DEFDIR}/OCR)"


inco1 10-08-2023 10:35 3013715

Всем хорошего дня.
Есть такой вопрос. Существует ли в NSIS задержка определенной команды на несколько секунд. Чтобы была не задержка всего процесса, а только задержка одной команды. Нужно добавить в реестр запись через 10 секунд после определенной команды, но чтобы весь процесс не останавливался на 10 секунд, как это делает команда "Sleep 10000".

iglezz 10-08-2023 11:05 3013717

inco1, https://nsis.sourceforge.io/ThreadTimer_plug-in

AlekseyPopovv 10-08-2023 11:35 3013719

Нужно что то подобное, без MUI. Есть варианты?
Код:

!include "MUI.nsh"

!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "English"

${If} $Language == 1049
MessageBox MB_USERICON|MB_OK 'Программа "${APP}" уже запущена!'
Abort
${Else}
MessageBox MB_USERICON|MB_OK 'The "${APP}" is already running!'
Abort
${EndIf}


iglezz 10-08-2023 14:12 3013734

AlekseyPopovv,
Разница между с MUI и без MUI в том, что
с MUI пишется
Код:

!insertmacro MUI_LANGUAGE "Russian"
без MUI пишется
Код:

LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
Дальше всё одинаково.

Кроме того локалицацию проще и правильнее прописывать так:
Код:

; Подключение языковый файлов
; English должен быть первый, т.к. если в списке подключённых языков отсутствует язык системы, то грузится первый по списку
LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"

; Объявление многоязычной строки:
LangString AlreadyRunningMessage ${LANG_ENGLISH} "The "${APP}" is already running!"
LangString AlreadyRunningMessage ${LANG_RUSSIAN} "Программа "${APP}" уже запущена!"

...

; Использование многоязычной строки:
MessageBox MB_USERICON|MB_OK $(AlreadyRunningMessage)
Abort

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

!include SingleInstance.nsh

RequestExecutionLevel user
Page instfiles
UninstPage uninstConfirm

Section
DetailPrint A
Sleep 1000
DetailPrint B
Sleep 1000
DetailPrint C
Sleep 1000
DetailPrint D
Sleep 1000
SectionEnd
Section un.
SectionEnd

Function .onInit
    ${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}
    WriteUninstaller $EXEDIR\un1.exe
FunctionEnd

Function un.onInit
    ${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}
FunctionEnd


SingleInstance.nsh
Код:

/*
Based on `Allow only one installer instance` example (https://nsis.sourceforge.io/Allow_only_one_installer_instance)

Usage example:

;  Define unique mutex name (optional)
!define INSTALLERMUTEXNAME "myVeryUniqueInstallerMutexName"
!define UNINSTALLERMUTEXNAME "myVeryUniqueUninstallerMutexName"

${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}

${If} ${AlreadyRunning}
    .. instructions before activate ..
    ${ActivateAlreadyRunning}
    .. instructions after activate ..
    Abort
${EndIf}   
   
*/
!ifndef SingleInstance.nsh
!define SingleInstance.nsh


!include LogicLib.nsh
!include WinMessages.nsh
!include Win\WinError.nsh
!include Win\WinUser.nsh


!define AlreadyRunning `"" AlreadyRunning ""`
!macro _AlreadyRunning _a _b _t _f
    !insertmacro _LOGICLIB_TEMP
    !ifdef __UNINSTALL__
        !define /ifndef UNINSTALLERMUTEXNAME '$(^Name)$(^UninstallCaption) Mutex'
        !define /redef CHECKALREADYEXISTINGMUTEXNAME '${UNINSTALLERMUTEXNAME}'
    !else
        !define /ifndef INSTALLERMUTEXNAME '$(^Name)$(^SetupCaption) Mutex'
        !define /redef CHECKALREADYEXISTINGMUTEXNAME '${INSTALLERMUTEXNAME}'
    !endif
    System::Call 'kernel32::CreateMutex(p 0, i 1, t "${CHECKALREADYEXISTINGMUTEXNAME}") ?e'
    Pop $_LOGICLIB_TEMP
    IntCmpU $_LOGICLIB_TEMP ${ERROR_ALREADY_EXISTS} `${_t}` `${_f}` `${_f}`
!macroend


!define ActivateAlreadyRunning `!insertmacro ActivateAlreadyRunning`
!macro ActivateAlreadyRunning
    Push $0 ; Window handle
    Push $1 ; Caption we are looking for
    Push $2 ; Caption length
    Push $3 ; GetWindowText output
   
    StrCpy $0 '' ; Start FindWindow with NULL
    !ifdef __UNINSTALL__
        StrCpy $1 '$(^UninstallCaption)'
    !else
        StrCpy $1 '$(^SetupCaption)'
    !endif
    StrLen $2 $1
    IntOp $2 $2 + 1 ; GetWindowText count includes \0
   
    ; loop:
    FindWindow $0 '#32770' '' '' $0
    StrCmp $0 0 +5 ; windownotfound: next
    System::Call 'user32::GetWindowText(p r0, t.r3, i r2)'
    StrCmp $3 $1 0 -3 ; windowfound: loop:

    ; windowfound:
    SendMessage $0 ${WM_SYSCOMMAND} ${SC_RESTORE} 0 /TIMEOUT=2000 ; Restore the window if it is minimized
    System::Call 'user32::SetForegroundWindow(p r0)'
   
    ; windownotfound:
   
    Pop $3
    Pop $2
    Pop $1
    Pop $0
!macroend


!define ActivateAlreadyRunningAndAbort `!insertmacro ActivateAlreadyRunningAndAbort`
!macro ActivateAlreadyRunningAndAbort
    ${ActivateAlreadyRunning}
    Abort
!macroend


!endif


inco1 10-08-2023 19:07 3013747

Ещё вопрос:
Можно ли "правильней" или "красивей" или по другому написать следующий код:

Код:

        SetRegView 64
              ClearErrors
              EnumRegKey $0 HKLM "SOFTWARE\test" 0
              ${If} ${Errors}
              Goto none
              ${Else}
                MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Есть нужная запись в реестре"
                Quit
              ${EndIf}
              none:
                MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Нету нужной записи в реестре"
        SetRegView 32


iglezz 10-08-2023 19:40 3013750

inco1,
1. От метки с Goto надо избавляться, раз присутствует конструкция If/Else:
Код:

SetRegView 64
ClearErrors
EnumRegKey $0 HKLM "SOFTWARE\test" 0
${If} ${Errors}
  MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Ключ отсутствует ИЛИ недостаточно привилегий для доступа к ключу ИЛИ какая-то ошибка"
${Else}
  MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Есть нужная запись в реестре"
  Quit
${EndIf}
SetRegView 32

2. Можно применить новый LogicLib-тест - RegKeyExists:
Код:

SetRegView 64
${If} HKLM RegKeyExists "SOFTWARE\test"
  ; Существует
${Else}
  ; Ключ отсутствует ИЛИ недостаточно привилегий для доступа к ключу ИЛИ какая-то ошибка
${EndIf}
SetRegView 32

Код RegKeyExists:
Код:

!ifndef RegKeyExists
!macro _RegKeyExists _a _b _t _f
  !insertmacro _LOGICLIB_TEMP
  ClearErrors
  EnumRegKey $_LOGICLIB_TEMP ${_a} `${_b}` 0
  IfErrors `${_f}` `${_t}`
!macroend
!define RegKeyExists `RegKeyExists`
!endif

!!! Важное примечание:
Отсутствие ошибки EnumRegKey или положительный тест RegKeyExists значит, что ключ существует.
Ошибка после EnumRegKey или отрицательный тест RegKeyExists значит, что ключ отсутствует ИЛИ недостаточно привилегий для доступа к ключу ИЛИ какая-то ошибка

inco1 10-08-2023 20:50 3013765

iglezz,
Для теста создал простой экзешник:

Код:

  OutFile "Test.exe"
  SilentInstall silent
  !include "LogicLib.nsh"

Section

SetRegView 64
${If} HKLM RegKeyIsEmpty "SOFTWARE\test"
    MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Есть нужная запись в реестре"
    Quit
${Else}
    MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Нету нужной записи в реестре"
${EndIf}
SetRegView default

SectionEnd

Пишет, что "Есть нужная запись в реестре", но такой записи в реале нету.

А мой вариант пишет правильно, что "Нету нужной записи в реестре".

Код:

  OutFile "Test1.exe"
  SilentInstall silent
  !include "LogicLib.nsh"

Section

        SetRegView 64
              ClearErrors
              EnumRegKey $0 HKLM "SOFTWARE\test" 0
              ${If} ${Errors}
              Goto none
              ${Else}
                MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Есть нужная запись в реестре"
                Quit
              ${EndIf}
              none:
                MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Нету нужной записи в реестре"
        SetRegView 32

SectionEnd

Что-то не так с вашим кодом.

inco1 10-08-2023 21:24 3013768

iglezz,

Код:

  OutFile "Test.exe"
  SilentInstall silent
  !include "LogicLib.nsh"

Section

SetRegView 64
${If} HKLM RegKeyIsEmpty "SOFTWARE\test"
    MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Нету нужной записи в реестре"
    Quit
${Else}
    MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Есть нужная запись в реестре"
${EndIf}
SetRegView default

SectionEnd

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

inco1 10-08-2023 22:15 3013774

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

Код:

  OutFile "Test1.exe"
  SilentInstall silent
  !include "LogicLib.nsh"

Section

        SetRegView 64
              ClearErrors
              EnumRegKey $0 HKLM "SOFTWARE\test" 0
              ${If} ${Errors}
              Goto none
              ${Else}
                MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Есть нужная запись в реестре"
                Quit
              ${EndIf}
              none:
                MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Нету нужной записи в реестре"
        SetRegView 32

SectionEnd

Все предложенные вами варианты не работают. А последний пример даже не компилится.

iglezz 10-08-2023 22:27 3013775

inco1,
Обновил своё первое сообщение и поудалял некорректные/ненужные
Пример компилируется и работает корректно.

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

inco1 10-08-2023 23:14 3013776

iglezz,

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

Код:

              ClearErrors
              EnumRegKey $0 HKLM "SOFTWARE\test" 0
              ${IfNot} ${Errors}
                  ; Существует
              ${Else}
                  ; Не существует
              ${EndIf}


iglezz 11-08-2023 01:02 3013782

С помощью функций Win API возможна более корректная проверка ключей на не_существует/нет_доступа/другие_ошибки
пример
Код:

ShowInstDetails show
InstallColors /windows
SetFont "Consolas" 10
AutoCloseWindow false
SetOverwrite on
RequestExecutionLevel user

!include LogicLib.nsh
!include RegistryFunc.nsh
!include SystemFunc.nsh

Section
  ${GetRegKeyStatus} $R0 HKLM 'Software\Microsoft' ; exist
  ${GetSystemErrorMessage} $R1 $R0
  DetailPrint "Soft\MS: $R0: $R1"
 
  ${GetRegKeyStatus} $R0 HKLM 'qwertyuiop' ; not exist
  ${GetSystemErrorMessage} $R1 $R0
  DetailPrint "qwertyu: $R0: $R1"
 
  ${GetRegKeyStatus} $R0 HKLM 'SAM\SAM' ; access denied
  ${GetSystemErrorMessage} $R1 $R0
  DetailPrint "SAM\SAM: $R0: $R1"
SectionEnd

Section
  ${If} HKLM RegKeyExists 'Software\Microsoft'
    DetailPrint "Soft\MS: exists"
  ${EndIf}
  ${If} HKLM RegKeyExists 'qwertyuiop'
    DetailPrint "qwertyu: exists"
  ${EndIf}
  ${If} HKLM RegKeyExists 'SAM\SAM'
    DetailPrint "SAM\SAM: exists"
  ${EndIf}

  ${If} HKLM RegKeyNotExists 'Software\Microsoft'
    DetailPrint "Soft\MS: not exists"
  ${EndIf}
  ${If} HKLM RegKeyNotExists 'qwertyuiop'
    DetailPrint "qwertyu: not exists"
  ${EndIf}
  ${If} HKLM RegKeyNotExists 'SAM\SAM'
    DetailPrint "SAM\SAM: not exists"
  ${EndIf}

  ${If} HKLM RegKeyAccessDenied 'Software\Microsoft'
    DetailPrint "Soft\MS: access denied"
  ${EndIf}
  ${If} HKLM RegKeyAccessDenied 'qwertyuiop'
    DetailPrint "qwertyu: access denied"
  ${EndIf}
  ${If} HKLM RegKeyAccessDenied 'SAM\SAM'
    DetailPrint "SAM\SAM: access denied"
  ${EndIf}
SectionEnd


RegistryFunc.nsh
Код:

!ifndef RegistryFunc.nsh
!define RegistryFunc.nsh

!include LogicLib.nsh
!include WinCore.nsh

!define KEY_QUERY_VALUE          0x0001
!define KEY_ENUMERATE_SUB_KEYS  0x0008

!macro Push_root_key root_key
  !if      ${root_key} == HKEY_CLASSES_ROOT
  Push ${HKEY_CLASSES_ROOT}
  !else if ${root_key} == HKCR
  Push ${HKEY_CLASSES_ROOT}
  !else if ${root_key} == HKEY_CURRENT_USER
  Push ${HKEY_CURRENT_USER}
  !else if ${root_key} == HKCU
  Push ${HKEY_CURRENT_USER}
  !else if ${root_key} == HKEY_LOCAL_MACHINE
  Push ${HKEY_LOCAL_MACHINE}
  !else if ${root_key} == HKLM
  Push ${HKEY_LOCAL_MACHINE}
  !else if ${root_key} == HKEY_USERS
  Push ${HKEY_USERS}
  !else if ${root_key} == HKU
  Push ${HKEY_USERS}
  !else if ${root_key} == HKEY_PERFORMANCE_DATA
  Push ${HKEY_PERFORMANCE_DATA}
  !else if ${root_key} == HKEY_CURRENT_CONFIG
  Push ${HKEY_CURRENT_CONFIG}
  !else if ${root_key} == HKCC
  Push ${HKEY_CURRENT_CONFIG}
  !else if ${root_key} == HKEY_DYN_DATA
  Push ${HKEY_DYN_DATA}
  !else
  Push '${root_key}'
  !endif
!macroend

!define GetRegKeyStatus `!insertmacro GetRegKeyStatus `
!macro GetRegKeyStatus result root_key sub_key
  Push $0
  Push '${sub_key}'
  !insertmacro Push_root_key ${root_key}
  System::Call "Advapi32::RegOpenKeyEx(is, ts, i0, i${KEY_QUERY_VALUE}|${KEY_ENUMERATE_SUB_KEYS}, *p.r0) i.s"
  StrCmp $0 0 +2
  System::Call "Advapi32::RegCloseKey(i r0) i"
  Exch
  Pop $0
  Pop ${result}
!macroend

!define RegKeyExists `RegKeyExists`
!macro _RegKeyExists _a _b _t _f
  !insertmacro _LOGICLIB_TEMP
  ClearErrors
  EnumRegKey $_LOGICLIB_TEMP ${_a} `${_b}` 1
  IfErrors `${_f}` `${_t}`
!macroend

!define RegKeyNotExists `RegKeyNotExists`
!macro _RegKeyNotExists _a _b _t _f
  !insertmacro _LOGICLIB_TEMP
  ${GetRegKeyStatus} $_LOGICLIB_TEMP ${_a} '${_b}'
  StrCmp $_LOGICLIB_TEMP 2 `${_t}` `${_f}`
!macroend

!define RegKeyAccessDenied `RegKeyAccessDenied`
!macro _RegKeyAccessDenied _a _b _t _f
  !insertmacro _LOGICLIB_TEMP
  ${GetRegKeyStatus} $_LOGICLIB_TEMP ${_a} '${_b}'
  StrCmp $_LOGICLIB_TEMP 5 `${_t}` `${_f}`
!macroend

!endif


SystemFunc.nsh
Код:

!ifndef SystemFunc.nsh
!define SystemFunc.nsh

!define GetSystemErrorMessage `!insertmacro GetSystemErrorMessage `
!macro GetSystemErrorMessage result error_code
  System::Call 'kernel32::GetSystemDefaultUILanguage()i.s'
  Push ${error_code}
  System::Call "kernel32::FormatMessage(i0x1300, in, is, is, *t.s, i${NSIS_MAX_STRLEN}, in)i"
  Pop ${result}
!macroend

!endif


AlekseyPopovv 14-08-2023 13:26 3013885

Никогда не сталкивался с ограничением в 2 гига и вот опять, есть возможность обойти это без "Nsis7z"?

iglezz 14-08-2023 13:50 3013887

AlekseyPopovv, nsisbi

inco1 17-09-2023 08:42 3016064

iglezz, Доброго дня.
Возникла проблема.
Использую ваш метод добавления записей в реестр для всех имеющихся учетных записей. Всё отлично работает. Но как прописать, если в системе есть только одна активная учетная запись, то чтобы запись в реестр прописывалась только активной учетке?

Подробнее на примере:

Используется код:

Код:

Function SIDFilter_UsersOnly

    System::Store L
    Pop $0   
    StrCpy $1 $0 8
    StrCmp $1 "S-1-5-21" +3 0
    StrCpy $1 ""
    System::Store S
    Push $1
   
FunctionEnd
Function ProcUsers

    System::Store L
    Pop $0
    Pop $1
    ${EnumUsersRegEx_GetProfilePath} $3 $1
    ${If} $3 != ""

        WriteRegDWORD HKU "$0\SOFTWARE\test" "tt" 0x1

    ${EndIf}
    System::Store S
   
FunctionEnd


Потом в нужном месте вставляется вызов этих функций:

Код:

        ${EnumUsersRegEx} ProcUsers SIDFilter_UsersOnly

Всё отлично работает и всем учеткам системы добавляется в реестр запись.

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

Код:

                WriteRegDWORD HKEY_CURRENT_USER "SOFTWARE\test" "tt" 0x1

Как это можно сделать? Неактивные и прочие учетки игнорировать.
Буду очень признателен за ваше пояснение.

iglezz 18-09-2023 00:09 3016107

inco1, Можно посчитать в некую переменную число залогиненных учётных записей.
А потом что, если их больше одной?

inco1 18-09-2023 08:50 3016121

iglezz,
Я, видимо не так объяснил.
Если такое возможно, то хотелось бы сделать так, чтобы было некое условие, что если число пользователей "S-1-5-21" более одного, то срабатывает этот код:

Код:

Function SIDFilter_UsersOnly

    System::Store L
    Pop $0   
    StrCpy $1 $0 8
    StrCmp $1 "S-1-5-21" +3 0
    StrCpy $1 ""
    System::Store S
    Push $1
   
FunctionEnd
Function ProcUsers

    System::Store L
    Pop $0
    Pop $1
    ${EnumUsersRegEx_GetProfilePath} $3 $1
    ${If} $3 != ""

        WriteRegDWORD HKU "$0\SOFTWARE\test" "tt" 0x1

    ${EndIf}
    System::Store S
   
FunctionEnd

Section

${EnumUsersRegEx} ProcUsers SIDFilter_UsersOnly

SectionEnd

А если пользователь "S-1-5-21" только один, то чтобы срабатывал этот код:

Код:

Section

WriteRegDWORD HKEY_CURRENT_USER "SOFTWARE\test" "tt" 0x1

SectionEnd


iglezz 18-09-2023 14:27 3016137

Посчитать пользователей не сложно
Скрытый текст
Код:

!define CountOnlineUsers `!insertmacro CountOnlineUsers `
!macro  CountOnlineUsers outVar
  Push $0
  Push $1
  Push $2
  Push $3

  StrCpy $0 0
  StrCpy $1 -1
  ${Do}
    IntOp $1 $1 + 1
    EnumRegKey $2 HKU '' $1
    ${IfThen} $2 == '' ${|} ${ExitDo} ${|}

    StrCpy $3 $2 8
    ${If} $3 == 'S-1-5-21'
      StrCpy $3 $2 '' -8
      ${IfThen} $3 != '_Classes' ${|} IntOp $0 $0 + 1 ${|}
    ${EndIf}
  ${Loop}

  Pop $3
  Pop $2
  Pop $1
  Exch $0

  Pop ${outVar}
!macroend

Section OnlineUsers
  ${CountOnlineUsers} $0
  DetailPrint 'online users: [$0]'
SectionEnd


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

inco1 18-09-2023 16:13 3016146

iglezz,
Премного-премного благодарю. Это как раз тот счетчик, что я хотел.

inco1 20-09-2023 14:35 3016365

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

iglezz 20-09-2023 15:12 3016368

inco1, да, счётчик считает вошедших пользователей.
По какому критерию надо считать пользователей активными?

inco1 20-09-2023 15:35 3016370

iglezz, тех, что записаны в реестре в S-1-5-21 и не считать S-1-5-21-.............._Classes

iglezz 20-09-2023 17:29 3016373

Ближе к цели будет отфильтровать пользователей по наличию профиля
Скрытый текст
Код:

!define CountUsersR `!insertmacro CountUsersR `
!macro  CountUsersR outVar
  Push $0
  Push $1
  Push $2
  Push $3

  StrCpy $0 ''
  StrCpy $1 -1
  ${Do}
    IntOp $1 $1 + 1
    EnumRegKey $2 HKLM 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' $1
    ${IfThen} $2 == '' ${|} ${ExitDo} ${|}
    StrCpy $3 $2 8
    ${IfThen} $3 == 'S-1-5-21' ${|} IntOp $0 $0 + 1 ${|}
  ${Loop}

  Pop $3
  Pop $2
  Pop $1
  Exch $0

  Pop ${outVar}
!macroend


inco1 20-09-2023 19:22 3016380

iglezz,
Да. Работает корректно. Даже учетку "Администратор" , которую я когда то активировал на восьмерке сосчитало (это та, что S-1-5-21......................500 и которой нету в HKU).
Огромнейшее спасибо.

iglezz 20-09-2023 20:33 3016383

В HKEY_USERS находятся вошедшие пользователи и системные учётки (System, LocalService, NetworkService), от лица которых запущена пачка процессов/сервисов.

Стоит ещё помнить, что
HKEY_CURRENT_USER - отображение HKEY_USERS\<SID текущего пользователя>
HKEY_CURRENT_USER\Software\Classes - отображение HKEY_USERS\<SID текущего пользователя>_Classes
HKEY_CLASSES_ROOT - объединённое отображение HKEY_CURRENT_USER\Software\Classes и HKEY_LOCAL_MACHINE\Software\Classes

перечисление пользователей с помощью NetQueryDisplayInformation
Код:

!include EnumUsersRegEx.nsh

RequestExecutionLevel user
ShowInstDetails show
; SetFont 'Fira Code Retina' 9
SetFont 'Consolas' 9
InstallColors /windows
; ChangeUI all "${MYNSISDIREXAMPLES}\Contrib\UIs\largelog.exe"

; https://learn.microsoft.com/en-us/windows/win32/secauthz/well-known-sids
; https://learn.microsoft.com/en-us/windows/win32/api/lmaccess/nf-lmaccess-netquerydisplayinformation
; https://learn.microsoft.com/en-us/windows/win32/api/lmaccess/ns-lmaccess-net_display_user
; https://learn.microsoft.com/en-us/windows/win32/api/lmaccess/nf-lmaccess-netusergetinfo

!define GetUserSID `!insertmacro GetUserSID `
!macro  GetUserSID outSID username
  ${If} '${username}' != ''
    Push '${username}'
    Exch $0 ; [in] username / [out] outSID
    Push $1 ; SID struct

    System::Call "*(&t${NSIS_MAX_STRLEN})p.r1"
    System::Call 'advapi32::LookupAccountName(t,t,p,*i,t,*i,*i)i (n,r0,r1,${NSIS_MAX_STRLEN},n,${NSIS_MAX_STRLEN},n).r0'

    ${If} $0 != 0
      System::Call 'advapi32::ConvertSidToStringSid(p,*t) (r1,.r0)'
    ${Else}
      StrCpy $0 ''
    ${EndIf}

    System::Free $1

    Pop $1
    Exch $0
    Pop ${outSID}
  ${Else}
    StrCpy ${outSID} ''
  ${EndIf}
!macroend

/* NET_DISPLAY_USER.usri1_flags flags:
  UF_SCRIPT=0x0001
  UF_ACCOUNTDISABLE=0x0002
  UF_PASSWD_NOTREQD=0x0020
  UF_NORMAL_ACCOUNT=0x0200
  UF_DONT_EXPIRE_PASSWD=0x10000

  UF_ACCOUNT_TYPE_MASK=UF_TEMP_DUPLICATE_ACCOUNT|UF_NORMAL_ACCOUNT|UF_INTERDOMAIN_TRUST_ACCOUNT|UF_WORKSTATION_TRUST_ACCOUNT|UF_SERVER_TRUST_ACCOUNT
  UF_DONT_REQUIRE_PREAUTH=0x400000
  UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED=0x0080
  UF_HOMEDIR_REQUIRED=0x0008
  UF_INTERDOMAIN_TRUST_ACCOUNT=0x0800
  UF_LOCKOUT=0x0010
  UF_MACHINE_ACCOUNT_MASK=UF_INTERDOMAIN_TRUST_ACCOUNT|UF_WORKSTATION_TRUST_ACCOUNT|UF_SERVER_TRUST_ACCOUNT
  UF_MNS_LOGON_ACCOUNT=0x20000
  UF_NOT_DELEGATED=0x100000
  UF_NO_AUTH_DATA_REQUIRED=0x2000000
  UF_PARTIAL_SECRETS_ACCOUNT=0x4000000
  UF_PASSWD_CANT_CHANGE=0x0040
  UF_PASSWORD_EXPIRED=0x800000
  UF_SERVER_TRUST_ACCOUNT=0x2000
  UF_SETTABLE_BITS=UF_SCRIPT|UF_ACCOUNTDISABLE|UF_LOCKOUT|UF_HOMEDIR_REQUIRED|UF_PASSWD_NOTREQD|UF_PASSWD_CANT_CHANGE|UF_ACCOUNT_TYPE_MASK|UF_DONT_EXPIRE_PASSWD|UF_MNS_LOGON_ACCOUNT|UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED|UF_SMARTCARD_REQUIRED|UF_TRUSTED_FOR_DELEGATION|UF_NOT_DELEGATED|UF_USE_DES_KEY_ONLY|UF_DONT_REQUIRE_PREAUTH|UF_PASSWORD_EXPIRED|UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION|UF_NO_AUTH_DATA_REQUIRED|UF_USE_AES_KEYS|
  UF_SMARTCARD_REQUIRED=0x40000
  UF_TEMP_DUPLICATE_ACCOUNT=0x0100
  UF_TRUSTED_FOR_DELEGATION=0x80000
  UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION=0x1000000
  UF_USE_AES_KEYS=0x8000000
  UF_USE_DES_KEY_ONLY=0x200000
  UF_WORKSTATION_TRUST_ACCOUNT=0x1000
*/
!define CountUsersQ `!insertmacro CountUsersQ - `
!define PrintUsersQ `!insertmacro CountUsersQ show `
!macro  CountUsersQ showinfo outVar
  Push $0 ; [out] result
  Push $1 ; number of struct_NET_DISPLAY_USER entries
  Push $2 ; pointer to first struct_NET_DISPLAY_USER entry
  Push $3 ; tmp
  Push $4 ; username
  Push $5 ;
  Push $6 ;
  Push $7 ;
  Push $8 ;
  Push $9 ;
  Push $R0

  StrCpy $0 0
  StrCpy $R0 ''

  System::Call "netapi32::NetQueryDisplayInformation(tn,i1,i0,i-1,i${NSIS_MAX_STRLEN},*i.r1,*i.r2)i.r3"

  ${If} $3 = 0
    ${For} $3 1 $1
      System::Call "*$2(t.r4,t,i.r5,t.r6,i,i)"
      ${GetUserSID} $9 $4
      ${EnumUsersRegEx_GetProfilePath} $8 $9

      !if '${showinfo}' == 'show'
      DetailPrint 'SID::: $9'
      IntFmt $5 0x%08X $5
      StrCpy $R0 'FLAGS: $5'
      IntOp $7 $5 & 0x0002 ; UF_ACCOUNTDISABLE
      StrCmp $7 0 +2
      StrCpy $R0 '$R0 DISABLED'

      DetailPrint $R0
      DetailPrint 'NAME:: $4 ($6)'
      DetailPrint 'PROF:: [$8]'
      DetailPrint ''
      !endif

      StrCmp $8 '' +2
      IntOp $0 $0 + 1

      IntOp $2 $2 + 24 ; move ptr to next struct in buffer
    ${Next}
    System::Call "netapi32::NetApiBufferFree(i) (r2)"
  ${EndIf}

  Pop $R0
  Pop $9
  Pop $8
  Pop $7
  Pop $6
  Pop $5
  Pop $4
  Pop $3
  Pop $2
  Pop $1
  Exch $0

  Pop ${outVar}
!macroend

Section CountUsers
  ${PrintUsersQ} $0
SectionEnd


AlekseyPopovv 24-09-2023 17:29 3016757

Ярлыки добавляю в меню пуск:
Код:

SetShellVarContext all
RMDir /r "$SMPROGRAMS\${APPNAME}"
CreateDirectory "$SMPROGRAMS\${APPNAME}"
CreateShortCut "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk" "$INSTDIR\${APPEXE}"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Удалить.lnk" "$INSTDIR\uninstall.exe"
${RefreshShellIcons}

После установки ярлыки находятся в папке ${APPNAME}, через пару минут остаётся только один ярлык "$SMPROGRAMS\${APPNAME}.lnk"
Хотя в папке "C:\ProgramData\Microsoft\Windows\Start Menu\Programs" присутствует и папка ${APPNAME} и ярлыки ${APPNAME}.lnk и Удалить.lnk
В чём проблема?

AlekseyPopovv 24-09-2023 17:55 3016761

Код:

UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico"
Как сделать что бы в панели управления была другая иконка?

iglezz 24-09-2023 23:33 3016819

Цитата:

Цитата AlekseyPopovv
После установки ярлыки находятся в папке ${APPNAME}, через пару минут остаётся только один ярлык "$SMPROGRAMS\${APPNAME}.lnk"
Хотя в папке "C:\ProgramData\Microsoft\Windows\Start Menu\Programs" присутствует и папка ${APPNAME} и ярлыки ${APPNAME}.lnk и Удалить.lnk
В чём проблема? »

Это норма для современных виндов - Why does my app’s uninstaller disappear from the Start menu?
Why does my app’s uninstaller disappear from the Start menu?
Цитата:

A customer reported that their installer creates a shortcut on the Start menu called Uninstall Contoso Deluxe, but a few seconds after their installer completes, the Uninstall Contoso Deluxe icon disappears from the Start menu. The main Contoso Deluxe shortcut is still there. What’s going on?

The uninstaller shortcut is removed from the Start menu to reduce clutter. You can uninstall apps from the Apps page in Settings, or from the Programs and Features control panel (formerly known as Add or Remove Programs). You can also get to the uninstaller by right-clicking Contoso Deluxe and selecting Uninstall.

Adding an uninstaller icon to Start menu is triply redundant, and it puts uninstallers in a high-traffic area of the user interface, when users are mostly looking for apps to run, not apps to uninstall.

The uninstaller shortcut is still there, so your uninstaller won’t get confused when it tries to delete the uninstaller shortcut. But the Start menu doesn’t show it.


Цитата:

Цитата AlekseyPopovv
Как сделать что бы в панели управления была другая иконка? »

Прописать её в uninstall-ключе реестра. Примеры есть в каталоге Examples (makensis.nsi, install-per-user.nsi, install-shared.nsi).

AlekseyPopovv 26-09-2023 14:32 3016957

Вложений: 2
Как сделать как на первом скрине?

iglezz 26-09-2023 19:54 3016969

Browse for Folder
Вид и поведение окна настраивается через флаги ulFlags структуры BROWSEINFOW, передаваемой функции SHBrowseForFolderW

AlekseyPopovv 26-09-2023 21:36 3016981

iglezz, Пример бы посмотреть, самый простой.

AlekseyPopovv 28-09-2023 12:32 3017083

iglezz,
Код:

!include "StrFunc.nsh"
${StrRep}

${StrRep} $0 "$INSTDIR" "\" "/"
WriteRegStr HKCU "${APPREG}\OCR" "LanguagesPath" "@ByteArray($0/OCR)"

Как считать путь к папке OCR? Пользователь может выбрать любое расположение папки.

iglezz 29-09-2023 20:33 3017251

Цитата:

Цитата AlekseyPopovv
Пример бы посмотреть, самый простой. »

Код по ссылке компилируется и работает. С модификацией могут быть проблемы, но они решаемы.

Цитата:

Цитата AlekseyPopovv
Как считать путь к папке OCR? Пользователь может выбрать любое расположение папки. »

Считать откуда?

AlekseyPopovv 29-09-2023 21:05 3017254

Цитата:

Цитата iglezz
Считать откуда? »

С реестра. К примеру там будет такой путь:
Код:

WriteRegStr HKCU "${APPREG}\OCR" "LanguagesPath" "@ByteArray(D:/Programs/OCR)"
Как теперь его преобразовать в "D:\Programs\OCR"?

iglezz 29-09-2023 22:23 3017258

AlekseyPopovv, Если формат строки известен и постоянен, то очевидно, что достаточно отрезать @ByteArray( в начале строки и ) в конце

AlekseyPopovv 30-09-2023 21:14 3017295

Как преобразовать?
Это:
Код:

01-01-2023 00:00:00 RTZ 2 (ceia)
В это:
Код:

01-01-2023 00:00:00 RTZ 2
Мой код, но соответственно удаляется и RTZ. В скобках может быть любое слово маленькими буквами.
Код:

${StrFilter} "$1" "12" " -:" "()абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz" $0
А лучше вообще удалить всё что в скобках...

iglezz 30-09-2023 22:21 3017301

Цитата:

Цитата AlekseyPopovv
Как преобразовать? »

Использовать ${StrLoc} для поиска позиции открывающей скобки и т.д.
Код:

  StrCpy $0 '01-01-2023 00:00:00 RTZ 2 (ceia)'
  StrCpy $1 ''
  ${StrLoc} $1 $0 '(' <
  ${If} $1 != ''
    IntOp $1 $1 + 2
    StrCpy $1 $0 -$1
  ${EndIf}
  DetailPrint 'in  [$0]'
  DetailPrint 'out [$1]'


AlekseyPopovv 01-10-2023 00:26 3017303

Цитата:

Цитата iglezz
Код:

StrCpy $0 '01-01-2023 00:00:00 RTZ 2 (ceia)'
 StrCpy $1 ''
 ${StrLoc} $1 $0 '(' <
 ${If} $1 != ''
 IntOp $1 $1 + 2
 StrCpy $1 $0 -$1
 ${EndIf}
 DetailPrint 'in [$0]'
 DetailPrint 'out [$1]'

»

А как наоборот оставить только то что в скобках?

AlekseyPopovv 01-10-2023 10:31 3017310

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

$TEMP\~nsu1.tmp\Un.exe
$TEMP\~nsu1.tmp

И если я просто его запускаю и отменяю удаление, то всё это остаётся в папке $TEMP. Как всё это удалить?

AlekseyPopovv 04-10-2023 19:19 3017504

Как изменить размер окна инсталлятора на всех страницах без правки русурсов и плагина NsResize?

iglezz 06-10-2023 01:12 3017572

Цитата:

Цитата AlekseyPopovv
Как сменить имя и папку деинсталлятора, когда его запускаешь? »

Никак.
Если сильно надо, сделать дополнительный скрипт, который будет служить в этой роли.
Цитата:

Цитата AlekseyPopovv
И если я просто его запускаю и отменяю удаление, то всё это остаётся в папке $TEMP. Как всё это удалить? »

В случае запуска с админскими привилегиями un.exe и каталог удаляются при перезагрузке.
Для простого юзера нужно колхозить подчистку.

Цитата:

Цитата AlekseyPopovv
Как изменить размер окна инсталлятора на всех страницах без правки русурсов и плагина NsResize? »

Зачем?

iglezz 06-10-2023 02:37 3017573

Простейший способ подчистки за исполняемым файлом - запуск скрытого процесса перед завершением работы:
Скрытый текст
:read: :read: :read: Бездумное применение нижеприведённого кода отстрелит ногу каталог с екзешником.
Скрытый текст
Код:

SetAutoClose true
ExpandEnvStrings $0 '%COMSPEC%'
System::Call 'shell32::ShellExecute(pn,pn,tr0,ts,ts,i0)i' `/c timeout /t 3 & rd /s /q "$EXEDIR"` `$TEMP`


AlekseyPopovv 12-10-2023 15:08 3018045

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

iglezz 13-10-2023 22:57 3018194

Цитата:

Цитата AlekseyPopovv
Как сохранить статус CheckBox на кастомных страницах?
К примеру снимаю галочку с CheckBox и возвращаюсь на предыдущую страницу, потом обратно на следующую и галочка опять стоит. »

Завести под каждую галку переменную.
При создании страницы выставить статус галки из переменной.
При выходе со страницы (leave-функция и onBack-колбэк) записать статус галки в переменную.
Скрытый текст
Код:

ShowInstDetails show
RequestExecutionLevel user
InstallColors /windows
InstallDir $TEMP

Page components
page custom OptionsSaveLoadTest OptionsSaveLoadTest_Leave
Page directory
Page instfiles instfiles_pre

!include LogicLib.nsh
!include nsDialogs.nsh
!include Sections.nsh

Var Option1
Var Option2
Var hOption1
Var hOption2


Section
  DetailPrint 'Exec mandatory section'
SectionEnd

Section /o '-Option 1' SecOpt1
  DetailPrint 'Exec Option1 section'
SectionEnd

Section /o '-Option 2' SecOpt2
  DetailPrint 'Exec Option2 section'
SectionEnd


Function OptionsSaveLoadTest
  nsDialogs::Create 1018
  Pop $0

  GetFunctionAddress $0 OptionsSaveLoadTest_OnBack
  nsDialogs::OnBack $0

  ${NSD_CreateCheckbox} 0 0 100% 8u 'Option&1'
  Pop $hOption1
  ${IfThen} $Option1 == ${BST_CHECKED} ${|} ${NSD_Check} $hOption1 ${|}


  ${NSD_CreateCheckbox} 0 15u 100% 8u 'Option&2'
  Pop $hOption2
  ${IfThen} $Option2 == ${BST_CHECKED} ${|} ${NSD_Check} $hOption2 ${|}

  nsDialogs::Show
FunctionEnd

Function OptionsSaveLoadTest_OnBack
  ${NSD_GetState} $hOption1 $Option1
  ${NSD_GetState} $hOption2 $Option2
FunctionEnd

Function OptionsSaveLoadTest_Leave
  Call OptionsSaveLoadTest_OnBack
FunctionEnd

Function instfiles_pre
  ${IfThen} $Option1 == ${BST_CHECKED} ${|} !insertmacro SelectSection ${SecOpt1} ${|}
  ${IfThen} $Option2 == ${BST_CHECKED} ${|} !insertmacro SelectSection ${SecOpt2} ${|}
FunctionEnd

Function .onInit
  StrCpy $Option1 ${BST_UNCHECKED}
  StrCpy $Option2 ${BST_UNCHECKED}
FunctionEnd


inco1 20-10-2023 14:38 3018558

Всем хорошего дня.
Если на рабочем столе кликнуть правой кнопкой мыши, то там есть пункт "Обновить". Как эту команду прописать в NSIS?

iglezz 20-10-2023 16:18 3018562

inco1, Можно программно нажать F5
Код:

System::Call 'user32::GetShellWindow()p.s' ;  hwndShellWindow = GetShellWindow()
System::Call 'user32::SendMessage(ps,i0x111,i0x1A220,i0)' ; SendMessage(hwndShellWindow, WM_COMMAND, MAKELONG(KeyValue,1), NULL)


MKN 26-10-2023 12:32 3018928

Подскажите пожалуйста, как средствами NSIS переконвертировать(сделать читабельной) последовательность символов (Unicode Escape), к примеру такого вида : \u0412\u0430\u043b\u0435\u043d\u0442\u0438\u043d ?

AlekseyPopovv 26-10-2023 18:50 3018947

Как победить подобную конструкцию?
Код:

!macro Test
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\1" "Name"
StrCmp $0 "My" YESREG 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\2" "Name"
StrCmp $0 "My" YESREG 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\3" "Name"
StrCmp $0 "My" YESREG 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\4" "Name"
StrCmp $0 "My" YESREG 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\5" "Name"
StrCmp $0 "My" YESREG 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\6" "Name"
StrCmp $0 "My" YESREG 0
DeleteRegKey HKLM "SOFTWARE\Classes\Prog"
YESREG:
DeleteRegKey /ifempty HKLM "SOFTWARE\Classes\Prog"
!macroend

Error: label "YESREG:" already declared in section

Такая конструкция работает, но это ужас:
Код:

!macro Test
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\1" "Name"
StrCmp $0 "My" +12 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\2" "Name"
StrCmp $0 "My" +10 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\3" "Name"
StrCmp $0 "My" +8 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\4" "Name"
StrCmp $0 "My" +6 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\5" "Name"
StrCmp $0 "My" +4 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\6" "Name"
StrCmp $0 "My" +2 0
DeleteRegKey HKLM "SOFTWARE\Classes\Prog"
DeleteRegKey /ifempty HKLM "SOFTWARE\Classes\Prog"
!macroend


iglezz 26-10-2023 19:24 3018949

Цитата:

Цитата MKN
Подскажите пожалуйста, как средствами NSIS переконвертировать(сделать читабельной) последовательность символов (Unicode Escape), к примеру такого вида : \u0412\u0430\u043b\u0435\u043d\u0442\u0438\u043d ? »

пример
Код:

ShowInstDetails show
RequestExecutionLevel user
InstallColors /windows
SetFont 'Fira Code Retina' 9
ChangeUI all '${MYNSISDIREXAMPLES}\Contrib\UIs\largelog.exe'

!include LogicLib.nsh
!include Util.nsh

!define SetSystemPluginDestination `!insertmacro SetSystemPluginDestination `
!macro  SetSystemPluginDestination gflag value
  !define ${gflag} ${value}
  !if      ${value}  == 's'
  !else if ${value} S== 'r0'
  !else if ${value} S== 'r1'
  !else if ${value} S== 'r2'
  !else if ${value} S== 'r3'
  !else if ${value} S== 'r4'
  !else if ${value} S== 'r5'
  !else if ${value} S== 'r6'
  !else if ${value} S== 'r7'
  !else if ${value} S== 'r8'
  !else if ${value} S== 'r9'
  !else if ${value} S== 'R0'
  !else if ${value} S== 'R1'
  !else if ${value} S== 'R2'
  !else if ${value} S== 'R3'
  !else if ${value} S== 'R4'
  !else if ${value} S== 'R5'
  !else if ${value} S== 'R6'
  !else if ${value} S== 'R7'
  !else if ${value} S== 'R8'
  !else if ${value} S== 'R9'
  !else
  !define /redef ${gflag} 's'
  !endif
!macroend

!define ChrW `!insertmacro ChrW `
!macro  ChrW result int
  !ifndef CharConvertBuffer16Initialized
    !define CharConvertBuffer16Initialized
    Var /GLOBAL g_CharConvertBuffer16
    System::Call '*(&i2)p.s'
    Pop $g_CharConvertBuffer16
  !endif
  ${SetSystemPluginDestination} ${__MACRO__}SymbolDestination ${result}
  System::Call '*$g_CharConvertBuffer16(&i2 ${int})'
  System::Call '*$g_CharConvertBuffer16(&w1 .${${__MACRO__}SymbolDestination})'
  !if ${${__MACRO__}SymbolDestination} == 's'
  Pop ${result}
  !endif
  !undef ${__MACRO__}SymbolDestination
!macroend

!define StrUnicodeUnescape `!insertmacro StrUnicodeUnescape `
!macro StrUnicodeUnescape result str
  !if '${str}' != 's'
  Push '${str}'
  !endif
  ${CallArtificialFunction} StrUnicodeUnescape_
  !if ${result} != 's'
  Pop ${result}
  !endif
!macroend

!macro StrUnicodeUnescape_
  Exch $0 ; [in] EscapedUnicodeString / [out] UnescapedUnicodeString
  Push $1 ; / EscapedUnicodeString
  Push $2 ; Counter
  Push $3 ; GetChar
  Push $4 ; GetChar2

  StrCpy $1 $0
  StrCpy $0 ''
  StrCpy $2 -1

  ${Do}
    IntOp $2 $2 + 1
    StrCpy $3 $1 1 $2
    ${IfThen} $3 == '' ${|} ${ExitDo} ${|}
    ${If} $3 == '\'
      IntOp $4 $2 + 1
      StrCpy $4 $1 1 $4
      ${If} $4 == 'u'
        IntOp $2 $2 + 2
        StrCpy $3 $1 4 $2
        IntOp $2 $2 + 3
        ${ChrW} r3 0x$3
      ${EndIf}
    ${EndIf}
    StrCpy $0 $0$3
  ${Loop}
 
  Pop $4
  Pop $3
  Pop $2
  Pop $1
  Exch $0
!macroend

Section
  StrCpy $1 '\u0412\u0430\u043b\u0435нт\u0438\u043d'
  DetailPrint '>> [$1]'

  ${StrUnicodeUnescape} $0 $1
  DetailPrint "<< [$0]"

  Push $1
  ${StrUnicodeUnescape} $0 s
  DetailPrint "<< [$0]"

  Push $1
  ${StrUnicodeUnescape} s s
  Pop $0
  DetailPrint "<< [$0]"
SectionEnd


iglezz 26-10-2023 20:55 3018955

Цитата:

Цитата AlekseyPopovv
Error: label "YESREG:" already declared in section »

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

Возможные решения:

1. Применять функции.
Параметры передавать нужно через стек. А также делать раздельные функции для install/uninstall или писать дополнительную логику для объявления функции в install и/или uninstall.

2. Применять вызов через ${CallArtificialFunction} (Util.nsh)
Параметры передавать нужно через стек. Реализация через установку метки и Goto на неё делает невозможным воздействие на код макроса флагами извне отдельно на каждый вызов, но это скорее понадобится для создания библиотечных макросов со сложной логикой.

3. Добавить в качестве префикса к метке уникальное в пределах текущего вызова макроса значение.
LogicLib.nsh использует такой метод (но в отличной от примера реализации).
пример
Код:

!macro DigitIsOdd return value
  ; объявить префикс
  !define LABEL__ ${__MACRO__}.__LABEL__.${__COUNTER__}

  StrCmp '${value}' 1 ${LABEL__}YES 0
  StrCmp '${value}' 3 ${LABEL__}YES 0
  StrCmp '${value}' 5 ${LABEL__}YES 0
  StrCmp '${value}' 7 ${LABEL__}YES 0
  StrCmp '${value}' 9 ${LABEL__}YES 0
  Goto ${LABEL__}NO

  ${LABEL__}YES:
  StrCpy ${return} 'yes'
  Goto ${LABEL__}EXIT
 
  ${LABEL__}NO:
  StrCpy ${return} 'no'
 
  ${LABEL__}EXIT:
 
  ; удалить префикс
  !undef LABEL__
!macroend



4. Изменить структуру кода, использовать LogicLib, если это возможно и не ухудшает читаемость кода.

MKN 27-10-2023 11:23 3018993

iglezz, - замечательно ! (и где такому "волшебству" учат ? :) )
Некоторые детали кода не оч. понятны... largelog.exe в моих дистр-ах NSIS отсутствует(нужен для лога-проверки ?)
Почему на выходе три варианта ${StrUnicodeUnescape} - "[$0]" ?
Будет ли декодироваться не кириллическая таблица символов ?

iglezz 27-10-2023 14:21 3019013

MKN, Вся видимая сложность тут для ускорения и некоторых дополнительных плюшек. А так, тут нет никакой магии, только примитивный парсинг строки и знание, что с помощью плагина System можно преобразовывать код символа в символ и обратно.
Цикл в StrUnicodeUnescape_ очень простой, умеет обнаруживаь и преобразовывать последовательность \u#### в юникод-символ. Без каких либо дополнительных проверок на корректность читаемых данных. По хорошему, надо, как минимум, добавить проверку на то, что после '\u' есть ровно четыре символа, которые являются валидным hex-числом.

largelog.exe - это мой специальный тестовый UI большего размера (230% оригинала) для дебага через DetailPrint.
Три варианта демонстрируют возможность читать строку со стека и записывать результат в стек. Это может быть полезно в сочетании в вызовами WinAPI функций через System::Call.
Декодируются все коды формата \u####

MKN 31-10-2023 11:47 3019224

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

PHP код:

Var FileCat
Var Name
Var Content
!macro FRead Name Content 
ClearErrors
FileOpen $R5 
"$EXEDIR\data.txt" w
FileOpen $R4 
"$Name" r
${Do} 
FileRead $R4 $Content
${IfThen} ${Errors} ${|} ${ExitDo} ${|}
MessageBox MB_OK "$Content"
FileWrite $R5 "$Name - $Content$\r$\n"
${Loop}
FileClose $R4
FileClose $R5
!macroend

Section
ClearErrors
FindFirst 
$0 $FileCat "$EXEDIR\TEST\*.*"
loop:
  
StrCmp $FileCat "" done
  StrCmp $FileCat 
"." next
  StrCmp $FileCat 
".." next
  StrCpy $Name 
"$EXEDIR\TEST\$FileCat"
 
!insertmacro FRead "$Name" "$Content" 
 
next:
FindNext $0 $FileCat
Goto loop
done
:
FindClose $0
SectionEnd 


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

iglezz 31-10-2023 17:03 3019253

MKN,
Код:

FileOpen $R5 "$EXEDIR\data.txt" w
Файл открывается на запись с уничтожением содержимого.

AlekseyPopovv 01-11-2023 10:13 3019298

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

inco1 01-11-2023 12:02 3019312

Всем хорошего дня.
Помогите, пожалуйста с удалением папок.
Нигде не нашел, как удалить папки с расширением, например папки с расширением .tmp

Этот вариант не работает:

Код:

        SetOutPath "$TEMP\*.tmp"
        SetOutPath "$TEMP"
        RMDir /r "$TEMP\*.tmp"


AlekseyPopovv 01-11-2023 12:11 3019313

inco1, Стандартная команда RMDir /r не удалит папки по расширению. Надо знать как папки называются.

inco1 01-11-2023 12:25 3019317

AlekseyPopovv, Я правильно понял, что в NSIS есть только команда удаления по маске файлов, а удаление по маске папок даже не предусмотрено?

AlekseyPopovv 01-11-2023 12:29 3019318

inco1, Да.

inco1 01-11-2023 14:47 3019331

AlekseyPopovv, Странно как то всё это, если для этой цели даже батник есть в одну крохотную строчку:

Код:

for /d %%d in (*.tmp) do rd /s /q %%d
Не совать же батник в инсталятор для таких случаев. :o

iglezz 01-11-2023 16:52 3019352

Цитата:

Цитата AlekseyPopovv
Как "пропустить" ошибку:
"Невозможно открыть файл для записи:"
Т.е. если файл занят, просто пропустить его копирование без MessageBox. »

SetOverwrite try

inco1,
Цитата:

Цитата inco1
Странно как то всё это, если для этой цели даже батник есть в одну крохотную строчку
...»

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

MKN 03-11-2023 18:32 3019477

Задача : необходимо в txt файле заменить конкретную строку на другую. Т.е. ,например, строку №5 удалить и заменить на содержимое из переменной и т.д.
Пробовал функцию - https://nsis.sourceforge.io/Replace_...ecified_string
Не работает... (там правда не конкретная строка заменяется, а вроде как строка имеющая определённое вхождение, что тоже интересно, но тоже не заработало...)
Как решить такую задачу ?

iglezz 04-11-2023 03:17 3019485

MKN, Та функция вполне рабочая, хотя и перемудрена немного. Но применяемый там метод записи ломает хард/софт-линки

Вот так можно построить обработку конструкциями в стиле LogicLib:
Код:

ShowInstDetails show
RequestExecutionLevel user
InstallColors /windows

!include FileFunc.nsh
!include LogicLib.nsh
!include Util.nsh

           
           

               
хтонь, на которой всё это работает

               
               

                   
; String begins with
!macro _[==  _a _b _t _f
  !insertmacro _LOGICLIB_TEMP
  StrLen $_LOGICLIB_TEMP `${_b}`
  StrCpy $_LOGICLIB_TEMP `${_a}` $_LOGICLIB_TEMP
  StrCmp `$_LOGICLIB_TEMP` `${_b}` `${_t}` `${_f}`
!macroend

; String ends with
!macro _]==  _a _b _t _f
  !insertmacro _LOGICLIB_TEMP
  StrLen $_LOGICLIB_TEMP `${_b}`
  StrCpy $_LOGICLIB_TEMP `${_a}` '' -$_LOGICLIB_TEMP
  StrCmp `$_LOGICLIB_TEMP` `${_b}` `${_t}` `${_f}`
!macroend

; String includes
!macro _*== _a _b _t _f
  !insertmacro _LOGICLIB_TEMP
  System::Call 'shlwapi.dll::StrStrI(ts, ts)p.s' `${_a}` `${_b}`
  Pop $_LOGICLIB_TEMP
  StrCmp $_LOGICLIB_TEMP 0 `${_f}` `${_t}`
!macroend

!define PathSplitPN `!insertmacro PathSplitPN `
!macro  PathSplitPN outParent outName Path
  !verbose push
  !verbose ${_FILEFUNC_VERBOSE}
  Push `${Path}`
  ${CallArtificialFunction} PathSplitPN_
  Pop ${outName}
  Pop ${outParent}
  !verbose pop
!macroend
!macro PathSplitPN_
  !verbose push
  !verbose ${_FILEFUNC_VERBOSE}
  Exch $0
  Push $1
  Push $2

  StrCpy $1 $0 1 -1
  StrCmp $1 '\' 0 +3
  StrCpy $0 $0 -1
  Goto -3

  StrLen $2 $0
  IntOp $2 $2 - 1
  StrCpy $1 $0 1 $2
  StrCmp $1 '\' +2
  StrCmp $1 '' 0 -3

  StrCpy $1 $0 $2 ; path
  IntOp $2 $2 + 1
  StrCpy $0 $0 '' $2 ; name

  Pop $2
  Exch $1
  Exch
  Exch $0
  !verbose pop
!macroend

!define FileGetTempCopy `!insertmacro FileGetTempCopy `
!macro  FileGetTempCopy outDuplicateName FullFileName
  !verbose push
  !verbose ${_FILEFUNC_VERBOSE}
  Push `${FullFileName}`
  Exch $0 ; [in] FullFileName / [out] outDuplicateName
  Push $1 ; file path
  Push $2 ; name / handle
  Push $3 ; outDuplicateName

  ${PathSplitPN} $1 $2 $0
  System::Call 'kernel32::GetTempFileName(tr1, tr2, i0, t.r3)i.r2'
  ${If} $2 != 0
    FileClose $2
    SetDetailsPrint none
    CopyFiles /silent $0 $3
    SetDetailsPrint lastused
    ${IfNot} ${Errors}
      StrCpy $0 $3
    ${Else}
      StrCpy $0 ''
      SetDetailsPrint none
      Delete $3
      SetDetailsPrint lastused
    ${EndIf}
  ${Else}
    StrCpy $0 ''
  ${EndIf}

  Pop $3
  Pop $2
  Pop $1
  Exch $0
  Pop ${outDuplicateName}
  !verbose pop
!macroend

!define FileReadByLine        `!insertmacro _FileReadByLine '' `
!define FileReadByLineUTF16LE `!insertmacro _FileReadByLine UTF16LE `
!macro _FileReadByLine ENCODING LineNumberVar LineVar ReadFile WriteFile
  !verbose push
  !verbose ${LOGICLIB_VERBOSITY}
  !insertmacro _PushScope FileProcessByLine          _FileProcessByLine.${__COUNTER__}
  !insertmacro _PushScope FileProcessByLineLineVar    ${LineVar}
  !insertmacro _PushScope FileProcessByLineENCODING  '${ENCODING}'
  !insertmacro _PushScope FileProcessByLineReadFile  '${ReadFile}'
  !insertmacro _PushScope FileProcessByLineWriteFile  '${WriteFile}'
  !ifndef _FileProcessByLine_Initialize_Variables
    !define _FileProcessByLine_Initialize_Variables
    Var /GLOBAL _FileProcessByLine_Var_RD
    Var /GLOBAL _FileProcessByLine_Var_RDHANDLE
    Var /GLOBAL _FileProcessByLine_Var_WR
    Var /GLOBAL _FileProcessByLine_Var_LINE
    Var /GLOBAL _FileProcessByLine_Var_LINENUMBER
  !else
    !define ${_FileProcessByLine}__Save_Vars
    Push $_FileProcessByLine_Var_RD
    Push $_FileProcessByLine_Var_RDHANDLE
    Push $_FileProcessByLine_Var_WR
    Push $_FileProcessByLine_Var_LINE
    Push $_FileProcessByLine_Var_LINENUMBER
  !endif

  GetFullPathName $_FileProcessByLine_Var_RD `${ReadFile}`
  ${IfNotThen} ${FileExists} $_FileProcessByLine_Var_RD ${|} Goto ${_FileProcessByLine}__errors ${|}
  ${If} `${_FileProcessByLineWriteFile}` == ``
  ${OrIf} `${_FileProcessByLineWriteFile}` == `${_FileProcessByLineReadFile}`
    StrCpy $_FileProcessByLine_Var_WR $_FileProcessByLine_Var_RD
    ${FileGetTempCopy} $_FileProcessByLine_Var_RD $_FileProcessByLine_Var_WR
    ${IfThen} $_FileProcessByLine_Var_RD == '' ${|} Goto ${_FileProcessByLine}__errors ${|}
  ${Else}
    StrCpy $_FileProcessByLine_Var_RD `${ReadFile}`
    StrCpy $_FileProcessByLine_Var_WR `${WriteFile}`
  ${EndIf}

  ClearErrors
  FileOpen $_FileProcessByLine_Var_RDHANDLE $_FileProcessByLine_Var_RD r
  ${If} ${Errors}
    Goto ${_FileProcessByLine}__errors
  ${EndIf}

  FileOpen $_FileProcessByLine_Var_WR $_FileProcessByLine_Var_WR w
  ${If} ${Errors}
    FileClose $_FileProcessByLine_Var_RDHANDLE
    Goto ${_FileProcessByLine}__errors
  ${EndIf}
  StrCpy $_FileProcessByLine_Var_LINENUMBER 0

  ${Do}
    FileRead${ENCODING} $_FileProcessByLine_Var_RDHANDLE $_FileProcessByLine_Var_LINE
    ${IfThen} ${Errors} ${|} ${ExitDo} ${|}
    !define ${_FileProcessByLine}__LineNumberVar=${LineNumberVar}
    !ifdef ${_FileProcessByLine}__LineNumberVar= | ${_FileProcessByLine}__LineNumberVar=-
    !else
      IntOp $_FileProcessByLine_Var_LINENUMBER $_FileProcessByLine_Var_LINENUMBER + 1
      StrCpy ${LineNumberVar} $_FileProcessByLine_Var_LINENUMBER
    !endif
    !undef  ${_FileProcessByLine}__LineNumberVar=${LineNumberVar}
    StrCpy ${LineVar} $_FileProcessByLine_Var_LINE

    ; ...............

  !verbose pop
!macroend

!define FileWriteByLine        `!insertmacro _FileWriteByLine "" `
!define FileWriteByLineUTF16LE `!insertmacro _FileWriteByLine UTF16LE `
!macro _FileWriteByLine ENCODING
  !verbose push
  !verbose ${LOGICLIB_VERBOSITY}
  !ifndef _FileProcessByLine
    !error "Cannot use FileProcessByLineEnd${ENCODING} without a preceding FileProcessByLine${ENCODING}"
  !endif
   
    ; ...............
   
    FileWrite${ENCODING} $_FileProcessByLine_Var_WR ${_FileProcessByLineLineVar}
  ${Loop}

  FileClose $_FileProcessByLine_Var_RDHANDLE
  FileClose $_FileProcessByLine_Var_WR

  ${_FileProcessByLine}__errors:
  SetErrors

  ${If} `${_FileProcessByLineWriteFile}` == ``
  ${OrIf} `${_FileProcessByLineWriteFile}` == `${_FileProcessByLineReadFile}`
    SetDetailsPrint none
    Delete $_FileProcessByLine_Var_RD
    SetDetailsPrint lastused
  ${EndIf}

  !ifdef ${_FileProcessByLine}__Save_Vars
    !undef ${_FileProcessByLine}__Save_Vars
    Pop $_FileProcessByLine_Var_LINENUMBER
    Pop $_FileProcessByLine_Var_LINE
    Pop $_FileProcessByLine_Var_WR
    Pop $_FileProcessByLine_Var_RDHANDLE
    Pop $_FileProcessByLine_Var_RD
  !endif
  !insertmacro _PopScope FileProcessByLine
  !insertmacro _PopScope FileProcessByLineLineVar
  !insertmacro _PopScope FileProcessByLineENCODING
  !insertmacro _PopScope FileProcessByLineReadFile
  !insertmacro _PopScope FileProcessByLineWriteFile
!macroend

               

               
           
                             
           

Section TEST
  SetDetailsPrint none
  CopyFiles /silent '${__FILE__}' '${__FILE__}-1.txt'
  CopyFiles /silent '${__FILE__}' '${__FILE__}-2INPLACE.txt'
  CopyFiles /silent '${__FILE__}' '${__FILE__}-3.txt'
  SetDetailsPrint lastused
 
  /* вместо иснструкции:

  ${FileReadByLine} LineNumber Line FileToRead FileToWrite
    LineNumber  - переменная с номером строки или '' или '-' (не использовать)
    Line        - переменная со строкой (включает символы конца строки)
    FileToRead  - файл для чтения
    FileToWrite - файл для записи
                  Если FileToWrite=='' или FileToWrite==FileToRead, будет изменён фходной файл
 
  Внутри цикла
  ${FileReadByLine}
    ....
    ${Continue} завершит работу с текущей строкой, пропустит запись и перейдёт к чтению следующей строки
    ${Break} прекратит обработку
    ....
  ${FileWriteByLine}

  ${FileReadByLine}  / ${FileReadByLineUTF16LE}  - читать как ANSI / UTF16-LE
  ${FileWriteByLine} / ${FileWriteByLineUTF16LE} - писать как ANSI / UTF16-LE

  */

  ; пронумерует строки:
  ${FileReadByLine} $0 $1 '${__FILE__}-1.txt' '${__FILE__}-1NUMBERS.txt'
    IntFmt $0 '%4d' $0
    StrCpy $1 '[$0] $1'
  ${FileWriteByLineUTF16LE} ; сохранить в кодировке  UTF16LE

  ; оставит и пронумерует только нечётные строки:
  ${FileReadByLine} $0 $1 '${__FILE__}-1.txt' '${__FILE__}-1ODDS.txt'
    IntOp $2 $0 % 2
    ${IfThen} $2 == 0 ${|} ${Continue} ${|}
    IntFmt $0 '%4d' $0
    StrCpy $1 '[$0] $1'
  ${FileWriteByLine}

  ; удалит пустые строки, измениы ыходной файл:
  ${FileReadByLine} - $1 '${__FILE__}-2INPLACE.txt' ''
    ${IfThen} $1 == '$\r$\n' ${|} ${Continue} ${|}
    ; обработка прекратится на следующей строке:
    ${IfThen} $1 *== '; break on this line' ${|} ${Break} ${|}
  ${FileWriteByLine}

  ; вложенный цикл
  ${FileReadByLine} - $1 '${__FILE__}-1.txt' ''
    ${If} $1 [== 'Section '
      ${FileReadByLine} $0 $1 '${__FILE__}-3.txt' '${__FILE__}-3BLOCKS.txt'
        ${If} $1 [== '!macro '
        ${OrIf} $1 [== 'Function '
        ${OrIf} $1 [== 'Section '
          IntFmt $0 '%4d' $0
          StrCpy $1 '[$0] $1'
        ${Else}
          ${Continue}
        ${EndIf}
      ${FileWriteByLine}
      ${Break} ; завершить обработку
    ${EndIf}
  ${FileWriteByLine}
SectionEnd


MKN 04-11-2023 09:31 3019492

iglezz, спасибо !, но очень мудрёно... Наивный практический вопрос - как выглядит то запрос на замену ? Скажем, входной файл In.txt , строка для замены №7, заменить на содержимое из $data.
ps Можно ли оформить функцию как .nsh ? (чтобы не очень пугала... :) )

iglezz 04-11-2023 10:54 3019493

Цитата:

Цитата MKN
Скажем, входной файл In.txt , строка для замены №7, заменить на содержимое из $data. »

Просто заменить седьмую строку на $data:
Код:

${FileReadByLine} $0 $1 'In.txt' ''
  ${IfThen} $0 == 7 ${|} StrCpy $1 $data ${|}
${FileWriteByLine}

Цитата:

Цитата MKN
Можно ли оформить функцию как .nsh ? »

Не можно, а нужно.
В примере оно из разных nsh подёргано.

MKN 04-11-2023 12:07 3019497

iglezz,
Почему то после замены строки, следующая строка, имеющаяся в файле "прилепляется" к концу заменённой, т.е. после строки замены отсутствует перенос строки... Можно конечно после Line добавить $\r$\n, а может лучше в код функции добавить перенос, куда следует добавить ?
И можно ли в ${FileReadByLine} $0 $1 использовать свои переменные(вместо $0 $1) ?

iglezz 04-11-2023 14:42 3019502

Цитата:

Цитата MKN
Почему то после замены строки, следующая строка, имеющаяся в файле "прилепляется" к концу заменённой, т.е. после строки замены отсутствует перенос строки... Можно конечно после Line добавить $\r$\n, а может лучше в код функции добавить перенос, куда следует добавить ? »

Как и в инструкциях NSIS FileRead/FileReadUTF16LE строка (в пределах NSIS_MAX_STRLEN) считывается с символами завершения строки. Добавлять их обработку в макрос большого смысла нет, т.к. это замедлит и без того небыстрый код, а нужно не всегда.
Можно просто добавлять $\r$\n к переменной Line, если нет желания использовать EOL-символы для конкретной обрабатываемой строки.
Цитата:

Цитата MKN
И можно ли в ${FileReadByLine} $0 $1 использовать свои переменные(вместо $0 $1) ? »

Можно любые.

Тут, кстати, надо учитывать, что на строках длиннее NSIS_MAX_STRLEN работа может быть некоректной.
Для таких случаев нужна отдельная версия этой конструкции, в которой побочно и EOL-символы получатся в отдельной переменной.

AlekseyPopovv 01-12-2023 07:51 3020822

В файле длинная строка, в ней нужно найти такие данные:
Код:

"download":{"default_directory":"C:\Пользователи\Downloads"}
Путь разный у всех.
Надо заменить на:
Код:

"download":{"default_directory":"$EXEDIR\${DEFDIR}\Downloads"}
Как это сделать по проще, если можно?

MKN 17-12-2023 16:25 3021619

Подскажите пожалуйста - как приспособить RegistryFunc.nsh (из Справочника) для работы с UNICODE версиями NSIS ?
К сожалению сказано, что "библиотека полностью совместима только ANSI версией компилятора NSIS"...

iglezz 17-12-2023 17:16 3021621

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

MKN 17-12-2023 18:41 3021625

Цитата:

Цитата iglezz
потребуется вдумчиво прогнать всё через дебаггер в голове на предмет выявления мест, где идёт работа на уровне байт, а не символов. Параллельно можно и оптимизировать немного на производительность. »

Вся надежда на тебя... :)

iglezz 18-12-2023 01:44 3021640

MKN, Большого смысла адаптировать RegistryFunc.nsh не вижу, проще новый написать с нуля.

iglezz 18-12-2023 17:34 3021675

Какие функции из RegistryFunc.nsh в первую очередь интересуют?

MKN 18-12-2023 18:15 3021677

Цитата:

Цитата iglezz
Какие функции из RegistryFunc.nsh в первую очередь интересуют? »

В наипервейшую очередь мне нужно перечисление всех ключей в HKLM\SOFTWARE\Classes\CLSID с параметрами типа REG_BINARY
В ANSI варианте это - ${RegFind} "${HKLM}\SOFTWARE\Classes\CLSID" "/T=REG_BINARY /V=0" EnumReg
Ну и хорошо бы поиск в таком то разделе таких то ключей и значений...

iglezz 18-12-2023 18:32 3021679

Думаю, RegistryFunc.nsh можно отправлять на пенсию.
Плагин Registry умеет всё и быстрее.

MKN 19-12-2023 09:23 3021704

iglezz, действительно, плагин летом обновился, попробую...

Kopejkin 30-12-2023 13:36 3022073

Можно как-либо исправить нечеткое отображение текста элементов при масштабировании дисплея?
Скрытый текст

Так выглядит окно инсталлятора при стандартном масштабировании 125%.
Как видно, четким остается только текст заголовка окна.
У меня разрешение экрана небольшое (1366х768).
На дисплеях FHD это выглядит еще хуже.

iglezz 30-12-2023 17:54 3022091

Kopejkin,
Код:

ManifestDPIAware System ; System DPI on Vista/7/8/8.1/10(<10.1607(AU))
ManifestDPIAwareness "PerMonitorV2,System" ; PMv2 on 10.1703(CU)+, System on 10.1607(AU) with NSIS 3.03+

Следует учесть, что в таком случае изображения в MUI будут кривенько отмасштабированы

Kopejkin 30-12-2023 23:12 3022101

Спасибо за подсказку и отсылку на форум Winamp.
Теперь осталось определиться, действительно ли оно мне так уж нужно.

iglezz 31-12-2023 00:20 3022102

Это решение можно найти и на sf.net и на stackoverflow и даже просто перебором доступных значений (детали в документации и исходниках nsis)
Эта комбинация хорошо работает в многомониторной конфигурации с разным масштабом у мониторов при переносе окна установщика с одного монитора на другой. При этом реализации Per-Monitor V2 DPI Awareness в nsis пока нет.

Свои изображения можно избавить от мыла через подготовку изображений под несколько значений масштабирования (100,125,150,..%) до или в процессе сборки установщика. При запуске - получить от системы используемый масштаб и загрузить подходящее изображение.
С MUI такое не прокатит без переписывания кода, отвечающего за изображения.

Если в Win API найдутся методы качественного масштабирования битмапов - можно будет применить их.

inco1 04-01-2024 07:53 3022265

iglezz, Хорошего дня.
Вы ранее приводили пример быстрого извлечения/поиска информации в файле.
Не могли бы вы привести еще и пример удаления строки таким же способом.
Например удаления строк из файла host
0.0.0.0 www.google.com
127.0.0.1 www.google.com
И еще не известно, что там может быть, 0.0.0.0 www.google.com или 127.0.0.1 www.google.com и неизвестна длина пробела после 0.0.0.0 и 127.0.0.1.

iglezz 04-01-2024 14:43 3022283

Наиболее адекватный способ работы с файлом hosts в nsis на сегодня - использование программы вроде BlueLife Hosts Editor.
Обработка hosts-записей не столь тривиальна, как это может казаться на первый взгляд.

inco1 04-01-2024 15:57 3022287

iglezz,
Цитата:

Наиболее адекватный способ работы с файлом hosts в nsis на сегодня - использование программы вроде BlueLife Hosts Editor.
Я правильно понял, вы советуете в установщик вставить два файла программы BlueLife Hosts Editor х32 и х64 версию и в нужном месте, когда дойдет установка до проверки файла hosts, вызывать эту программу и пусть пользователь с помощью этой программы исследует hosts и если обнаружит некие записи, которые нужно удалить, то удалит их с помощью этой программы?

iglezz 04-01-2024 16:20 3022288

inco1, BlueLife Hosts Editor умеет работать с командной строки, при этом достаточно одного 32-битного hEdit.exe

inco1 04-01-2024 16:33 3022289

iglezz, Спасибо, это меняет дело. Попробую.

inco1 07-01-2024 12:04 3022379

Всем доброго дня.
Есть вопрос, на который я нигде не нашел ответа. Помогите, пожалуйста.
Как известно некоторые программы в реестре прописывают свое место установки в кавычках и в конце ставят слэш \.
Это в реестре выглядит так:

InstallLocation REG_SZ "C:\Program Files\"

или

InstallLocation REG_SZ "C:\Program Files"

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

Для считывания и записи в переменную использую ReadRegStr

В связи с этим вопрос, как можно удалить кавычки и слэш, чтобы в переменную записалось правильно C:\Program Files, без кавычек и слэша в конце?

VV189 09-03-2024 12:44 3025224

В большинстве сборок портативных программ созданных с помощью NSIS которыми пользуюсь, есть директория \App\AppInfo\Launcher с файлами настроек. Это ведь не нативная фишка NSIS, где найти пример такого исходника?

inco1 16-03-2024 16:10 3025464

VV189,
Лаунчеры в портативках, которыми вы пользуетесь, созданные в PortableApps com, а не в NSIS.
Лаунчеру, созданном в NSIS не нужен файл сценария App\AppInfo\Launcher\"Прога".ini, потому что работа идет напрямую без "посредника". Это, примерно, как передаешь сообщение с уст в уши посыльному, а посыльный передает со своих уст в уши нужному человеку, а не прямое сообщение с уст в уши нужному человеку.
PortableApps com имеет свою собственную оболочку, на основе NSIS. Для "нормальных" лаунчеров сама оболочка PortableApps com скудненькая и всё равно придется дополнительно писать скрипт "Custom.nsh", который немного расширяет возможности оболочки. Некоторые возможности NSIS даже не удастся реализовать через PortableApps com.


Время: 21:29.

Время: 21:29.
© OSzone.net 2001-