Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
New Interface NSIS »
Если уж предлагать, то ВСЕ файлы для проекта. Для твоего примера требуется куча плагинов (locate.dll FindProcDLL.dll NSISVCLStyles.dll WndProc.dll
ToggleInstFiles.dll , возможно и ещё какие то. Просто надоело устанавливать...) Плюс ругань на !define PBM_SETBARCOLOR 0x111E (по моему вообще не нужен т.к. уже есть в хедере (хотя и не с такой константой... тоже вопрос... )
А в целом, овчинка, по моему, вообще не стоит выделки...
4eshireCat
23-10-2014, 20:11
Пожалуйста, подскажите как с помощью NSIS переименовать секцию в ini-файле. Чем проще - тем лучше :)
переименовать секцию в ini-файле »
1. Секция - обычная строка, ini файл - обычный текстовый файл, отсюда делаем вывод, что можно переименовать секцию простой заменой строки (примеров с заменой уже тьма, к тому же в справочнике тоже есть примеры)
2. Можно воспользоваться плагином EnumINI (описание опять же, есть в справочнике), с помощью которого можно перечислить все параметры со значениями в конкретной секции (мы же знаем имя секции) - и просто записать все параметры со значением с новым именем секции, а секцию со старыми именем затем удалить
Если INI файл у вас не огромный по количеству строк (а, как мы знаем, у NSIS есть проблемы с чтением строк файла с большим количеством строк, когда скорость замедляется), то можно воспользоваться и первым методом
4eshireCat
23-10-2014, 20:45
K.A.V., спасибо. Реализовал с помощью ${LineFind} --> ${WordReplace}.
Begin2Fly
25-10-2014, 18:53
Здравствуйте.
Подскажите, пожалуйста, как грамотнее реализовать создание чекбокса на MUI_PAGE_DIRECTORY.
Отредактировал modern.exe, добавив туда чекбокс, но пока не получается с ним управиться. Есть идеи?
Подскажите, пожалуйста, как грамотнее реализовать создание чекбокса на MUI_PAGE_DIRECTORY. »
Создать собственную страничку с нужными элементами и заменить ею стандартную страничку выбора каталога
Отредактировал 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
Создать собственную страничку с нужными элементами и заменить ею стандартную страничку выбора каталога »
Можно, но не интересно.
"секс" с NSIS - это прекрасно »
А вот это мне нравится :laugh:
Спасибо за помощь, всё делал именно так, но не добавил:
page custom MUI_PAGE_DIRECTORY_POST
как грамотнее реализовать создание чекбокса на MUI_PAGE_DIRECTORY. »
Грамотнее, наверное, с помощью CreateWindowEx.
Отредактировал modern.exe, добавив туда чекбокс »
А вот это, уже из разряда : :)
"секс" с NSIS - это прекрасно Если вы любите заниматься с NSIS этим »
:) Может конечно, чуть проще, но редактирование ресурсов, это крайняк, когда уже ничего нельзя сделать по другому...
Ессно и то и другое - это результат, а значит имеет право быть.
Обновился NSIS Dialog Designer до v. 1.3.1 2014-10-27
http://coolsoft.altervista.org/en/nsisdialogdesigner
Limonica
11-11-2014, 12:03
Проблемка, как узнать Serial HDD, c помощью NSIS?
как узнать Serial HDD, c помощью NSIS? »
Самое простое с помощью HddInfo.dll - см в теме. Или http://nsis.sourceforge.net/Get_Disk_Volume_Serial_Number
Нужна помощь в таком вопросе. сделал инсталлятор, который позволяет переустанавливать мое ПО поверх текущей версии, т.е. без вызова удаления. В моем ПО есть длл с СОМ-сервером. Поэтому в момент переустановки эта длл может быть занята другим приложением. Мне надо следующее:
1) при невозможности заменить файл длл новым файлом попоросить перезагрузку
2) после перезагрузки удалить старый и скопировать новый файл.
2) после замены файла зарегистрировать эту длл через RegDLL
Как это сделать?
1) при невозможности заменить файл длл новым файлом попоросить перезагрузку »
1. Прописываете команду удаления dll (Delete)
2. Проверяете, есть ли эта dll на диске (если есть, значит занята приложением и не удалена) (команда IfFileExists)
3. Если dll не удалена, пользуемся командами MessageBox и Reboot
2) после перезагрузки удалить старый и скопировать новый файл. »
1. Методом записи в RunOnce прописываете исполнение батника на удаление и копирование вашей dll
2. Либо добавляете в свой пакет инсталлятора отдельную функцию, +добавляете обработку ключа командной строки и прописываете в RunOnce исполнение своего же инсталлятора с ключем, в коде инсталлятора в функции .onInit проверяете наличие ключа в параметре запуска (команда GetOptions), если ключ есть - выполняете написанную функцию по удалению dll и копированию нового файла
2) после замены файла зарегистрировать эту длл через RegDLL »
Регистрируете dll командой RegDll
Описание команд есть в справочнике, ссылка на справочник в моей подписи либо в шапке темы
блин, похоже, я вас не правильно понял и вы просили готовый код?
Begin2Fly
21-11-2014, 12:24
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}
Эту же перезагрузку можно организовать не через сообщение на экране, а на финишной странице установщика с двумя радиобуттонами, в документации это должно быть описано, по памяти не скажу.
Спасибо. Для меня главная трудность была продолжение работы инсталлятора после перезагрузки. Спасибо, что разъяснили, как это сделать.
Привет.
Столкнулся с небольшой проблемой по NSIS.
Нужно реализовать функцию проверки размера файла (md5) по принципу если размер совпадает с заданным в скрипте, то установка идёт по одному пути (выполняется одно действие), если не совпадает - по другому (выполняется иное действие).
Никак не могу что-то продумать эту операцию...
Задача в том, что если у юзера установлена заданная версия файла, то устанавливаются одни компоненты, если версия файла не совпадает - другие компоненты.
Ребят, помогите, пожалуйста, в этом вопросе.
Begin2Fly
23-11-2014, 12:28
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
Уважаемые, подскажите, есть ли плагин или какой-нибудь метод, для упаковки инсталлятором на ПК, на который идет установка, группы файлов в архив (например, ZIP). Плагины - распаковщики есть, а упаковщики?
Begin2Fly
23-11-2014, 19:31
Уважаемые, подскажите, есть ли плагин или какой-нибудь метод, для упаковки инсталлятором на ПК, на который идет установка, группы файлов в архив (например, 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 и подобные команды.
Begin2Fly, Хотелось без лишних EXE_шников в пакете обойтись...будем думать. Есть кое-что из Resurs Kit. Файлообменник подсунул параллельно какой-то левый Setap - браузер перехватил.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC