PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 [68] 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

MKN
23-10-2014, 18:27
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-файле. Чем проще - тем лучше :)

K.A.V.
23-10-2014, 20:35
переименовать секцию в 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, добавив туда чекбокс, но пока не получается с ним управиться. Есть идеи?

K.A.V.
25-10-2014, 19:26
Подскажите, пожалуйста, как грамотнее реализовать создание чекбокса на 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

MKN
27-10-2014, 10:25
как грамотнее реализовать создание чекбокса на MUI_PAGE_DIRECTORY. »
Грамотнее, наверное, с помощью CreateWindowEx.
Отредактировал modern.exe, добавив туда чекбокс »
А вот это, уже из разряда : :)
"секс" с NSIS - это прекрасно Если вы любите заниматься с NSIS этим »
:) Может конечно, чуть проще, но редактирование ресурсов, это крайняк, когда уже ничего нельзя сделать по другому...
Ессно и то и другое - это результат, а значит имеет право быть.

MKN
06-11-2014, 12:47
Обновился 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?

MKN
11-11-2014, 16:00
как узнать Serial HDD, c помощью NSIS? »
Самое простое с помощью HddInfo.dll - см в теме. Или http://nsis.sourceforge.net/Get_Disk_Volume_Serial_Number

Sann-X!
21-11-2014, 12:10
Нужна помощь в таком вопросе. сделал инсталлятор, который позволяет переустанавливать мое ПО поверх текущей версии, т.е. без вызова удаления. В моем ПО есть длл с СОМ-сервером. Поэтому в момент переустановки эта длл может быть занята другим приложением. Мне надо следующее:
1) при невозможности заменить файл длл новым файлом попоросить перезагрузку
2) после перезагрузки удалить старый и скопировать новый файл.
2) после замены файла зарегистрировать эту длл через RegDLL

Как это сделать?

K.A.V.
21-11-2014, 12:21
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}

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

Sann-X!
21-11-2014, 12:29
Спасибо. Для меня главная трудность была продолжение работы инсталлятора после перезагрузки. Спасибо, что разъяснили, как это сделать.

Aster
23-11-2014, 07:24
Привет.
Столкнулся с небольшой проблемой по 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

Salmo
23-11-2014, 19:00
Уважаемые, подскажите, есть ли плагин или какой-нибудь метод, для упаковки инсталлятором на ПК, на который идет установка, группы файлов в архив (например, 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 и подобные команды.

Salmo
23-11-2014, 21:01
Begin2Fly, Хотелось без лишних EXE_шников в пакете обойтись...будем думать. Есть кое-что из Resurs Kit. Файлообменник подсунул параллельно какой-то левый Setap - браузер перехватил.




© OSzone.net 2001-2012