![]() |
.: NSIS - все вопросы :. часть 2.
![]() Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения. Описание: Текущая версия: NSIS 3.05 от 15 декабря 2019 года Скачать | Архив сборок версии Первая часть этой темы Скачать первую часть этой темы одним архивом ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов: Справочник по NSIS - создан силами нашего сообщества. Руководство пользователя. Перевод – Поляков А.В, зеркало Документация Утилиты разработчика Расширение функциональности Примеры скриптов на нашем форуме Скрипт NSIS для перепаковки AIMP2+Сборки Тема для Notepad++(пример парсинга XML) Достоинства Ещё немного полезной информации: |
Моё почтение гуру NSIS-а.
Подскажите, возможно-ли добавить описание в создаваемом ДЕинсталляторе? Чтобы как у Инсталлятора (VIAddVersionKey), при наведении курсора на установщик появлялось описание: "ProductName" "${PRODUCT_NAME}" "FileDescription" "Удаление программы" "ProductVersion" "${PRODUCT_VERSION}" и проч. Заранее признателен. |
Цитата:
Код:
VIProductVersion "1.1.1.1" |
Цитата:
Вопрос ещё раз: Можно-ли сделать так, чтобы надписи\подписи при наведении курсора, у Инсталлятора и ДЕинсталлятора были разными? |
Цитата:
да не особо нужно то, если честно.. |
Подскажите пожалуйста как можно отследить нажатие кнопок аналогичных "назад" "далее"?
|
profcom,
Цитата:
|
Цитата:
|
Цитата:
|
Добрый день!
Иногда требуются админ права, чтобы инсталлятор отработал, каим образом можно сообщить пользователю , что нужны для инсталляции админ права. Сообщением типа у Вас нет админ прав и завершить инсталляцию, не очень современно. Как быть |
Цитата:
Код:
UserInfo::GetAccountType Цитата:
|
Цитата:
Добрый день! Подскажите пожайлуста, возможно кто-нибудь знает как можно установить тулбар в ie без лишних запросов со стороны браузера. |
Подскажите пожалуйста - есть ли в nsDialogs макрос отметки (снятия отметки) секций ? Не обнаружил в доке такого...
Что то типа аналога ${SectionIsSelected} ${ID sec} Если нет, то как минимальным кодом это можно реализовать ? |
Возможно ли узнать запущена прорамма или нет?
Просто убивать её критично и просить пользователя закрыть тоже неверно (пользователь не любит лишние вопросы) |
Цитата:
Отследите работает ли программа по ее процессу. |
Цитата:
Есть встроенные средства в Section.nsh для собственного treeview --- через nsDialogs я рисовал treeview ![]() минимальным никак - забудь, особенно, если это еще чужой treeview |
habib2302, чет не туда... у автора скрипт спрашивайте.
на форуме он здесь прописан - в личку ему пишите. |
kotkovets,
адресок на его профиль можно |
habib2302, поиск по теме в первой части --> diakov
|
kotkovets, вот заинтересовался созданием портативок по подобию PortableApps.com, и вот дошло дело до создания лаунчера...как я понимаю данная технология заключается в том что когда прога запускается лаунчер вносит необходимые изменения в систему, а когда закрыть, тот самый лаунчер удаляет все следы присутствия в системе (за исключения, понятно самих профилей или настроек которые хранятся непосредственно в папке портабла) вот нарыл скрипт лаунчера фоксит немного что переделал под неро (только в шапке и appinfo.ini) что бы проверить запустится ли), тело скрипта не трогал! Так вот непонятно где в скрипте вносить данные (который должны вносится в систему при запуске ...а где при завершении работы проги...не могли бы объяснить, вот сам код:
Код:
!define PORTABLEAPPNAME "Nero Express Portable" Или может можно как то упростить сие чудо (как бы две секции в одной команды запуска в другой команды по завершению работы проги) |
В данном лаунчер - это NSIS, значит необходимые изменения вносим перед запуском приложения, т.е в самой
первой стандартной функции - .OnInit запускаем процесс без ожидания процесса, если процесс не найден - закрываем лаунчер, далее nsis ждет завершения процесса, по завершении процесса - удаляем следы. лаунчер нужно сделать, чтобы запускался скрытно, в функции .OnInit Код:
SetSilent silent Код:
Quit как то так - один из множества вариантов. |
Ну в принципе понятно...а после какой команды в .OnInit писать инструкции по заметанию следов?
|
Цитата:
После запуска (по сути инсталляции) нужной программы, её "разворачивания" в ОС и запуска - из неё же , вслед запускается маленький exe-скрипт, контролирующий процесс запущенной программы . Как только программа закрывается, (т.е. процесс прекращён) , этот фискальный скрипт-uninstaller подчищает все следы установки программы, и самоликвидируется. Ессно можно организовать установку-запуск программы и из фискального скрипта-uninstaller_а (пусть будет лаунчер). |
Цитата:
|
Цитата:
Мож как то прикрутить возможно из статьи вашей Запуск внешних приложений в режиме ожидания завершения приложения |
Цитата:
Справочник по NSIS => Примеры кодов => Работа с процессами хм, даже не знаю, что ещё объяснять, вам Вячеслав уже всё расписал, осталось только ткнуть вас в файл справки, что я уже сделал... |
Цитата:
Может так например Код:
${ExecWait} "приложение.exe [parametr1]...[parametr2]" $5 |
Цитата:
Цитата:
Читайте справку Вы пишите команды, не понимая их функционал... |
Цитата:
Ну вообще это как бы правильно будет или можно как то по другому сделать? |
Цитата:
Цитата:
Давайте не будем оффтопить, а то получится как с участником Creator (точно ник не помню), которому раз 20 за день говорили одно и то же - Читайте справочник, а он упорно не хотел видеть эти слова Просто возьмите и пролистайте файл справки, найдёте что-то нужное, более чем уверен И описания команд Exec и ExecWait там есть... |
Возможно ли изменить цвет полоски ProgressBar_а, скажем с зелёненького на красненький или синенький ? :)
Пытался делать по мотивам http://stackoverflow.com/questions/1...nsis-installer Не работает... |
Цитата:
Попытался сделать по тем же мотивам, получилось :) Вообщем весь функционал в секциях, я там чуть изменил, сделал более удобно, создал переменную, и можно на проятжении всего скрипта менять цвет прогресс бара, ну так, для забавы :) |
есть ли в NSIS какая то переменная для 64 систем в папку system32, $SYSDIR идёт в SysWOW64.
|
Limonica, пример Wow64DisableWow64FsRedirection:
Код:
!include x64.nsh Еще, может быть полезным для переключения между 32/64-битными разделами реестра для записи: Код:
SetRegView 32 |
|
Цитата:
Цитата:
|
Оказывается, умельцы с форума winamp.com смогли приспособить известную в Inno Setup, оформительскую botva2.dll для NSIS.
Примечательно, что для оформления, к примеру, кнопки, код занимает по сути, всего одну строку ! В отличии от загородки из кучи кода в NSIS... Код:
!include "MUI2.nsh" И , конечно здорово было бы иметь подобную DLL, заточенную конкретно под NSIS... Почему то никто до сих пор не сделал такой замечательной полезности ... |
Цитата:
изучаешь API - и все тебе прелести, поэтому никто не делал, никто не хочет читать изучать - дай нам две строчки кода и отвали! |
Цитата:
Кто изучил и разбирается в API - молодец ! Кто делится этими познаниями с другими и на их базе создаёт инструментарий облегчающий жизнь NSIS-пользователям - два, нет, двадцать два раза - молодец ! :) А позыв к углублённому познанию вопроса - дело тонкое и добровольно-индивидуальное. Тут, как поэта, муза должна посетить. А муза приходит не всегда и не к каждому... (что мы вообще знаем про NSIS-музу ? :) ) |
MKN, предлагаю тебе написать, посидеть, попотеть - узнаешь много нового :)
|
Цитата:
А уж про сам NSIS и говорить нечего... :) Ессно только слова благодарности. |
kotkovets, Здравствуйте, с уважением... Я совсем недавно начал знакомиться со NSIS в довольно узком сегменте свойств. Прочитал в справке о разработанной Вами библиотеке ProcessFunc.nsh для работы с процессами. В справке написано:"Гарантировано работает начиная от Windows 2000 и выше, независимо от разрядности системы х32 или х64." Означают ли эти слова, что средствами библиотеки возможен доступ по всем заявленным функциям к процессам, как 32 битным, так и 64 битным на системе 64 бит? Проверить не могу, такой машины нет...
|
Цитата:
--- а также, написанная мною библиотека, полностью совместима с юникодной версией компилятора NSIS для юникодной nsis файл ProcessFunc.nsh сохраняем в любой кодировке unicode. |
|
Вложений: 1
подскажите, возможно ли сделать доп. страницу в инстолляторе c nsDialogs без верхней шапки и с картинкой по всей высоте (см. вложение).
|
Impeck,
Отредактируй размер в modern.exe и помещай картинку куда угодно. |
Моё почтение!
Подучите, пожалуйста, а то своим умишком ни как не дотямлю: Как на доп. странице выбора компонентов, группы чекбоксов связать с Радиокнопками? Например Радиокнопка "Для ВСЕХ", с ней связана пара отдельных чекбоксов; вторая Радио "Для текущего", с другими чекбоксами. Как-бы соорудить, чтобы при выборе радиокнопки "Для ВСЕХ" становились активными ТОЛЬКО чекбоксы "ВСЕХ", а при выборе Радиобуттона "Для текущего" были активны ТОЛЬКО чекбоксы "текущего". ![]() Т.е чтобы при выборе "ВСЕМ" отметить чекбоксы "Текущему" было-бы нельзя и наоборот. |
Подскажите, пожалуйста. Мне необходимо, чтобы перед установкой пользователь выбрал бы сам необходимый ему файл (путь к нему и название самого файла)..Возможно ли переделать MUI_PAGE_DIRECTORY или это решается только созданием своей страницы?
|
Цитата:
|
Привет народ, :)
Вопрос имеется, можно ли привязать вывод этого: Код:
!insertmacro MUI_PAGE_LICENSE ".\Text.rtf" Максимум что смог добиться это безошибочной компиляции с выводом этих страниц, в которых в место текста пустота. |
Цитата:
Код:
!insertmacro MUI_PAGE_WELCOME |
diakov, Спасибо. :)
Вариант твой конечно интересный, но слишком громоздкий + много чего не нужного и лишнего используется... Относительно, и пока на половину решил проблему так: Код:
;Для блока страниц MUI_PAGE ![]() |
Цитата:
|
kotkovets, Было бы также не спрашивал, первым делом проверил, не работает. Похоже что присвоение второго значения для этой переменной не светит, ибо в "единицу времени" она может быть только одна, когда у меня их уже 2, и больше... Еще мысли есть?
![]() Зы, И как напоминание, использую NSIS UTF. |
Цитата:
|
kotkovets, Дай пример, чет не въеду ни как про что ты...
Там ведь суть в чем, в том, что сам дубликат всей строки - не вариант, не зависимо от изменения в нем, названия функции имен используемых переменных и т.д.. Это я имел ввиду, говоря, что нельзя задать для переменной второй адрес каталога с требуемым файлом. Зы, Если ничего не получится, то хоть польза будет от наших трудов, в справочнике откроешь новый раздел "Функции Нсис": 1. Простые. 2. Преопределенные (как используемая мною в примере, изменять ее, кстати тоже нельзя). :) |
Всем привет, в Windows есть переменная %USERNAME% отображающая активного пользователя, есть ли такая переменная в NSIS или как можно получить имя оригинального пользователя не используя плагин UserMgr?
|
Цитата:
Код:
ExpandEnvStrings $1 "%USERNAME%" |
Спасибо конечно, но дело в том что на англоязычных системах как не странно нет переменной %USERNAME%, нужен альтернативный вариант..
|
К слову сказать, но почему то не все переменные можно получить через ExpandEnvStrings - в Windows 7 и Windows 8. (в XP - всё получается)
В частности, для "%USERNAME%" всегда работает : Код:
System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2" |
kotkovets, По моей проблеме ничего нового нет ? Я там в посте у себя поправочку сделал если что прочитай.
|
Как то скучно в теме перед Новым Годом... Для разнообразия :
Попался код для проигрывания видео в процессе установки, на заднем FullScreen фоне. Видеофайл должен быть WMV формата. http://www.mediafire.com/?jie4ce7ixjn4ez0 Интересно, каким образом изменить код, чтобы можно было проигрывать AVI и как бы организовать проигрывание в отдельном задаваемом окне на кастомной странице ? Код:
OutFile WMV_Play.exe |
MKN
ИМХО для NSIS это лишняя ненужность. Но чисто для интереса сделать можно :) З.Ы. Пробовал сделать плагин аналог botva2.dll, но дальше загрузки изображения в память не дошел :) |
Вложений: 1
Плагин для инно для воспроизведения видео, хавает все для чего есть кодеки в системе
|
Необходимо завершить процесс ориентируясь на его путь, пример "$TEMP\main.exe", как это можно реализовать в NSIS, соответствующие плагины по работе с процессами, завершают процесс только по имени, у кого какие мысли по этому поводу...
|
Цитата:
Примеры кодов => Работа с процессами с помощью NSIS В конце статьи есть "Перечисление запущенных процессов", таким способом думаю получится ;) |
kotkovets, Здравствуйте. Скажите, пожалуйста, получилось осуществить эту идею?
http://forum.oszone.net/nextnewesttothread-218597.html Ваше сообщение в конце страницы... |
люди.дайте справку или полное описание всех плагинов лля NSIS на русском языке
|
habib2302, держите
|
Народ, подскажите! Как из 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" |
Painkiller, справку читайте внимательней, пример из справки:
Ярлык с файлом иконки: Код:
CreateShortCut "$DESKTOP\Справочник по NSIS.lnk" "$WINDIR\NSIS_Help.chm" "" "$WINDIR\Explorer.exe" "2" |
Может кому пригодится код, позволяющий создать на кастомной странице активную гиперссылку с "тултипом" :
Код:
!include "MUI2.nsh" |
Среди API функций, есть функция FindExecutable, которая находит имя приложения, связанного с заданным типом файла.
К примеру, эту функцию можно задействовать для определения браузера по умолчанию, что часто необходимо. Алгоритм нахождения такой : в браузере, как правило, открываются файлы htm и html. Создаём временно такой файл, "натравливаем" на него функцию и ищем приложение, которое открывает этот тип файлов. Код:
Name "opens_by_default" |
Цитата:
Цитата:
Цитата:
Правда в первом случае, такие вот функции лучше сразу преподносить кодерам в виде универсальной функции, т.е. чтобы можно было передать в функцию парочку значений и, чтобы функция их приняла и обработала (а не привязываться, к примеру, к одному элементу, чтобы не разбухать исходник добавляя тултипы) Вы же прекрасно понимаете, что в этой теме такую полезную инфу всё равно увидят не все, т.к. многим просто лень перечитывать тему (а это и понятно, если страниц в теме много), поэтому лучше сразу в справочник их вносить, а здесь так сказать как "быстрый анонс новенькой плюшки" :) |
K.A.V.,
Для справочника инфу ведь надо как то правильно оформлять... Вот ещё занятный пример: Установка на кнопку стандартной страницы, таймера с индикацией обратного отсчёта, т.е. задержка активности кнопки перед продолжением установки. Например, для кнопки "Install" для PAGE_WELCOME или для кнопки "I Agree" для PAGE_LICENSE. Где можно применить - например, чтобы пользователь перед установкой прочитал чего нибудь полезное, а не сразу клацал кнопками продолжения установки. Для этого есть спец. DLL ( местонахождение DLL - рядом со скриптом, ессно при наличии в коде !AddPluginDir ".\" ) : Код:
!AddPluginDir ".\" |
ToolTips (всплывающие подсказки) на стандартной странице выбора компонентов (PAGE_COMPONENTS)
ToolTip будет появляться при наведении указателя мыши на выбранный компонент. Код:
!define MUI_COMPONENTSPAGE_NODESC |
MKN, может разтолкуеш роботу этого плага http://nsis.sourceforge.net/ToolTips_plug-in
В нем мне кажется все как то проще...вот пытаюсь его привязать к радиобутону в Page custom в PageInit ставлю код: Код:
FindWindow $0 "#32770" "" $HWNDPARENT |
Цитата:
Вот пример с nsDialogs с чекбоксом Код:
!include "MUI2.nsh" |
Цитата:
А вообще вся "фишка" в функции CreateWindowEx. Но создание tooltips, это так, между прочим... Ведь с её помощью можно создавать разнообразные объекты на страницах, особенно интересно, что на стандартных. Но вариации параметров мне далеко не все понятны. Хотел бы попросить kotkovets, сделать как нибудь подробный разбор этой полезнейшей функции (наверное и сопутствующих GetWindowRect , MapWindowPoints, SetWindowPos и т.д.) - применимо к использованию в NSIS. Док по ним ужасно мутный для "рядового" понимания.... И примеры на Cи... |
K.A.V., а можно сделать в ToolTips перенос по строкам, чтобы все не в одну строчку было?
|
Цитата:
В классическом тултипе не срабатывает переноска строк, в модерне переносит :) |
Вложений: 1
Небольшой набросок тултипа, сделанный когда-то для личных нужд..
раз уж пошла такая пьянка... |
Попытаюсь примерами "подогреть" интерес к NSIS System Plug-in и в частности к функции CreateWindowEx .
Пример 1 : Создаём на странице окно и помещаем в это окно WebBrowser : (можно просматривать страницы, как в интернете, так и локально обычные htm html ) Код:
!AddPluginDir ".\" Функция CreateWindowEx создает разнообразные окна с расширенным стилем для разнообразных объектов. "STATIC" - (статический элемент) Обозначает простое текстовое поле, окно или прямоугольник, используемый для надписей, окно или другие отдельные органы управления. Координаты и размеры окна в данном примере, меняются в значениях - i1,i1,i400,i200 Стиль прямоугольника окна можно изменять (в примере это ${SS_GRAYFRAME} Наглядно видно что происходит, если менять например, на SS.BLACKRECT , SS_GRAYRECT и т.д. , не подгружая WebCtrl ), Можно задавать тип объекта (создать кнопку, чекбокс, тултип, картинку, область текста и др.. ) Функция MapDialogRect конвертирует (преобразует) заданные единицы измерения диалогового окна - в экранные единицы (пиксели). Команда WebCtrl:: работает со специальной DLL (это модернизированный nsWeb плагин ) |
Цитата:
Код:
!define TTM_SETMAXTIPWIDTH 0x418 Цитата:
--- зы. в моем примере уже автоматом добавляется это свойство тултипу |
Цитата:
|
Цитата:
|
kotkovets, есть такой вопрос...вот например мозила создает папку профиля вот так
С:\Users\Пользователь\AppData\Roaming\Mozilla\Firefox\Profiles\5z4z2uxh.default\ Тоесть у каждого индивидуальная папка 5z4z2uxh.default, возможно ли как то получить в переменную этот путь, скажем прочить путь входящего в папку файла или как такое можно провернуть? Чтобы при установке можно было дописать в нее некоторые файлы. Например как в описаном K.A.V. методе...только получается что в моем случае путь задан неявно... Код:
${GetParent} "C:\Program Files\Winamp\uninstwa.exe" $R0 |
diakov, а подумать?
например переменная $APPDATA при SetShellVarContext current возвращает такой путь: Код:
Section дальше просто в этой папке ищем папки по маске *uxh.default Код:
OutFile test.exe под свои конкретные задачи скрипт переделать легко! действуй! |
Благодарствую сейчас буду экспериментировать.
|
Применеие в NSIS функции CreateWindowEx
Пример 2. Размещение текста на странице. Код:
StrCpy $R0 "Текст Текст Текст Текст" Теперь, изменим создаваемый элемент управления (встроенного класса ) "STATIC" - на класс "EDIT" Цитата:
Ещё раз про установленные стили окна: Цитата:
Цитата:
Код:
!include MUI2.nsh |
Цитата:
В создании диалога маленькая ошибка, что бы команда возвращала дескриптор окна в переменную $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' ${NSD_GetText} $R2 $R3 MessageBox MB_OK "$R3" IDOK --- nsDialogs - все делает также, но только для "своих" страничек, данный код полезен только, если нужно сделать диалог на стандартных страничках. |
kotkovets,
Подскажи пожалуйста - каким образом создать окно с рамкой, к примеру, для той же вставки текста ? Пытался использовать для этого WS_BORDER и WS_DLGFRAME - без результата... И такой вопрос - возможно ли поместить на странице отображение реального времени, т.е. попросту часы ? |
Здравствуйте. Сделал файл win.bmp из папки NSIS\Contrib\Graphics\Wizard на всю ширину инсталлятора. Теперь не виден текст. Вопрос: как убрать эту картинку на задний план, чтобы был виден текст?
|
Цитата:
Код:
!define WS_BORDER 0x00800000 константа DEFAULT_STYLES объявлена в nsDialogs.nsh, т.е достаточно прописать !include MUI2.nsh --- FindWindow $0 "#32770" "" $HWNDPARENT - абсолютно ненужная здесь команда, дескриптор родительского окна в переменной $dlg --- Цитата:
обновление.. к примеру в одну секунду... Так как, созданному элементу таким способом присваивается системный шрифт - не очень красиво... установим элементу шрифт родительского окна, сразу после создания диалога: Код:
SendMessage $dlg ${WM_GETFONT} 0 0 $R9 |
Цитата:
как то так вкратце - важно последовательность действий |
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 |
Народ, не подскажите как через nsis добавить апплет в установку удаления программ . Пример есть UninstallTool.cpl. Что с ним делать. Закинуть в sistem32 и что дальше??
|
kotkovets, спасибо. Переставил блок ;Image control после ;Text в файле Welcome.nsh. Теперь все отобразилось нормально. Но появилась проблема. Можно ли как нибудь убрать фон, который присутствует у текста?
Я так понимаю за цвет фона отвечает строка Код:
SetCtlColors $mui.WelcomePage.Text "" "${MUI_BGCOLOR}" |
Цитата:
Код:
SetCtlColors $mui.WelcomePage.Text 0 transparent |
Добрый день... Есть ли возможность в NSIS создавать не модальные окна сообщений? Скрипт до распаковки совершает длительное действие над текстовым файлом в цикле, - как этот процесс визуально обозначить? Повесить на это время баннер или сообщение.
|
Появился вопрос допустим при помощи функции CreateWindowEx мы создали кнопку, как мы можем отследить ее нажатие в реальном времени? Макросы nsDialogs не работают с такими кнопками. Может как вариант получать ее состояние через какое то время установленное таймером? Или возможны другие варианты?
|
Цитата:
Заодно назовём это Пример 3 Использование функции CreateWindowEx для создания кнопки. ( + создание MessageBox с помощью API ) Код:
!AddPluginDir ".\" Цитата:
|
Ребят привет, помогите пожалуйста убрать с страницы установки Кнопочку "Детали.."
Не могу найти где она правится... |
|
Ребят один момент есть, как сделать чтобы при запуске инсталятора играла музыка и заканчевалась вплоть до его закрытия.
Заранее извиняюсь если вопрос уже существует, не нашел... |
kysk, может это:
вопрос - http://forum.oszone.net/post-1361791.html#post1361791 ответ - ниже http://forum.oszone.net/post-1361863.html#post1361863 |
alert30, а куда прописывать этот скрипт?
|
Цитата:
Описание плагинов => NewAdvSplash: изображение перед запуском Данный плагин может показывать как изображения перед запуском инсталлятора, так и позволяет проиграть музыкальную композицию, даже в формате MP3 Цитата:
|
Нечего не выходит с добавлением трека... Можно лично от вас готовый код, может что-то не то делаю.
|
Для проигрывания аудио во время установки можно использовать такой известный код :
Код:
!define SND_NAME "sound.mp3" |
Цитата:
|
Я писал по этой теме: http://forum.oszone.net/thread-67386-44.html
|
Цитата:
Вы спросили: Цитата:
Вы мне отвечаете: Цитата:
А словосочетание Цитата:
Мы можем набросать готовый код, но только в том случае, если видим, что лично Вы что-то пытаетесь сами написать своими руками |
!define SND_NAME "sound.mp3" - здесь же прописывается путь к аудио файлу? так: "D:\sound.wav" -- Ошибка MCI - пишет что данный файл не найден.. что делать?
Вышеуказанную запись, я понял, больше не повторится. Мне просто срочно нужно это узнать, а на счет того что я делаю своими руками я отвечу так: я умею очень многое но не в плане конечно же инсталятора я его начал изучать только вчера, приспособиться трудновато к скриптам, поэтому чтобы не сидеть не париться как минимум два дня, мне легче спросить у знатоков, и уже отрубно знать что и куда писать. |
Цитата:
Кстати , этот код проигрывает и MIDI файлы. Чтобы не маяться дурью и не утяжелять дистр MP3 файлом, лучше уж проигрывать MIDI. Например: !define SND_NAME "hotel_california.mid" |
Хм.. Куда тогда прописывается путь?
|
Цитата:
|
Ребят ну че никто не может обьяснить? Ну ткните пальцем, не врубаюсь я нифига у мну одни ошибки кидает пишет типо строка File "${SND_NAME}" содержит ошибку! Фиг его знает что делать, поткинь чистый код без всяких там включений инсталятора, финиша, старта страниц. Чисто код и куда его ставить.
|
kysk,
Цитата:
|
====Вот скрипт инсталла====
; 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 |
kysk,
А где у тебя находится файл sound.wav ? Он должен быть рядом с твоим скриптом. Убери строку OutFile "sound.exe", у тебя же есть OutFile "setup.exe" убери _______ за Function .onInit |
Сделал как ты говорил, спасибо получилось только теперь, он открывает какой-то мини проигрываетль и пишет что типо какой-то драйвер не найден)
Пробую этим способом: Function .myGuiInit File "D:\song.wav" BgImage::Sound "$TEMP\song.wav" FunctionEnd Function .onGUIEnd Delete "$TEMP\song.wav" FunctionEnd Инстал запускается но почему то не проигрывает трек, что здесь не правильно? Может нет строчки запуска трека? |
Ребят подскажите такую тему: Как сделать на финишной страницы или вообще можно это сделать например:
Текст: хотите прикупить вещи "заходите" к нам! "заходите" - это будет ссылкой на сайт только нажав на нее откроется сайт. Проблема в том что текст может светиться только полностью, а мне нужно только чобы определенное слово в этой строке светилось. Вот как такое осуществить? |
Цитата:
|
Цитата:
Цитата:
|
А можно как нибудь запретить скачивание файлов в $temp при запуске инсталятора?
|
Цитата:
Или о каком скачивании файлов вы говорите? |
Вы все правильно поняли, именно это я имел в виду, ну чтобы скрыть от пользователя своии временные файлы инсталятора)
Но видимо без этого никак... |
Цитата:
А служебные файлы, типа плагины, картинки и т.п. - тоже вряд ли кого заинтересуют. Сам скрипт никто не увидит и не извлечёт... Чего бояться то ? |
Нечего бояться, просто интересен функционал nsis'a
Но он и без того большой |
Народ, прошу помощи!!
Не срабатывает регистрация dll в x64 , а в x32 все ок . Причём в ручную dll регистрируется Код:
|
Painkiller, подтверждаю, замечал подобное на 64-битной Windows 7. Списал всё на устарелость NSIS. Региструю через nsExec::Exec 'regsvr32.exe /s "$INSTDIR\ax.dll"'.
|
Еще заметил что не работает Plugins "KillProcDLL" на x64. Альтернативу бы его найти рабочую ??
taskkill что ли использовать =)) |
Painkiller, опять же, занимался этим вопросом. Решение:
Код:
!include "nsProcess.nsh" |
|
kotkovets, при компиляции ругается на строчку
Код:
!define WS_BORDER 0x00800000 |
Цитата:
можно просто записать вместо ${WS_BORDER} в коде цифрами - 0x00800000 Код:
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "Текст Текст Текст Текст",\ Код:
!ifndef WS_BORDER Цитата:
|
kotkovets, Уже разобрался. Она была объявлена в самом начале кода. Поэтому и ругалась на повторное объявление. Спасибо =)
|
помогите, пожалуйста:
у меня есть две папки файлов, как мне сделать чтобы исходя из того, какие компоненты выбраны, в выбранную директорию устанавливалось содержимое папок. например, если выбрал оба компонента - устанавилось сначала содержимое первой папки, затем второй прочел всю тему, всю справку, подобные примеры не нашел - видел только с выполнением msi и exe в секциях. |
Цитата:
В справочнике: Статьи от hb860 => Секции и выбор компонентов Попутно читаем про переменные и про команду File (В справочнике: Перевод справки NSIS => File) |
про секции я знаю, все сделал.
но я не включал MUI_PAGE_INSTFILES, т.к. я хочу чтобы в любом случае был выбор компонентов и мне пишет "Установка успешно выполнена!", но ничего не устанавливается. получается, если нельзя убирать выбор типа установки INSTFILES, то проблема была в этом. но в статусе установки хотелось бы наблюдать не список распакованных файлов, а то какой компонент сейчас устанавливается, или все вместе. такое возможно?) |
Цитата:
http://forum.oszone.net/post-1515790-845.html |
В nsDialogs есть функция обратного вызова для кнопки "Назад" - nsDialogs::OnBack function_address.
А есть ли нечто подобное для кнопки "Далее" (Next) ? Я не обнаружил... К примеру, надо организовать вызов какой либо функции перед переходом со страницы на страницу (скажем у меня 10 кастомных страниц и я перед переходом-открытием каждой последующей, хочу сначала делать нечто, при нажатии кнопки "Далее", на предыдущей странице, и только потом должна открыться последующая страница) Как это можно реализовать ? И для стандартных страниц тоже... |
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
К примеру, чтобы следующая страница открывалась согласно моих параметров для функции AnimateWindow. Если для первой страницы AnimateWindow работает как положено, то следующая, после клика Next, почему то игнорирует AnimateWindow... И если уж говорить про AnimateWindow, то возможно ли её применение для окон созданных с помощью CreateWindowEx ? Ни черта не получается анимировать созданные дополнительные окна, и ессно инфы нигде "ни гу-гу" ... Если бы это удалось, то можно было бы оч. интересно оформлять элементы страниц... |
Цитата:
Цитата:
Цитата:
Код:
|
K.A.V.,
Так я уже делал... Не работает. Видно не всё так просто. Вот код : Код:
!define AW_HOR_POSITIVE 0x00000001 И просьба к kotkovets, - подскажи пожалуйста, как анимировать с помощью AnimateWindow, созданное CreateWindowEx окно ? |
Цитата:
Был абсолютно не прав, у вас в скрипте просто ошибка, анимация не применяется из за неправильной строки. В функции страницы 1 вместо $HWNDPARENT надо применить $dlg. Код:
Function page1 |
Цитата:
Интересно сработает, если созданных окон несколько ? |
MKN, как вариант с 2-ым диалогом могу предложить такое решение, добавить эффект исчезания, а потом появления
Т.к. вроде бы, функция анимации создаёт саму анимацию именно в действии, т.е. если окно уже показано, то к нему нельзя применить эффект опять появления Сначала скрываем, а потом показываем, впринципе так даже получше будет мне кажется :) Код:
!define AW_HOR_POSITIVE 0x00000001 Цитата:
Цитата:
|
Цитата:
Код:
System::Call `user32::AnimateWindow(i$R2,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})` |
K.A.V.,
Действительно, оригинально получается (как затвор передёргивается :) ) С цветом уже понял... Цитата:
|
Цитата:
|
Цитата:
При таком нехорошем раскладе, как менять хэндлы созданных окон для анимации, если их будет несколько на одной странице ? |
Цитата:
Создаём ещё одно такое же "окошко" выше первого: Код:
System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "К этому AnimateWindow ",\ И потом только мы прописываем вызов функции анимации на созданный элемент Как-то так ;) Полный код: |
Создаём прямоугольную область со скругленными углами (закругляем углы окна) с помощью функции CreateRoundRectRgn :
(можно вообще сделать окно страницы в виде эллипса или круга...) Код:
!include MUI2.nsh |
Цитата:
а именно в событии WM_PAINT, ну что ли так: http://radiofront.narod.ru/htm/prog/...api/paint.html через нсисовский system это практически нереально.. проблема system - нормальная реализация обратных функций (калбеков) в остальном system - хорош.. |
Reposition Window - изменяем позицию (месторасположение) окна.
Может пригодится, когда окно инсталлятора закрывает собой другое окно, например запущенного приложения (или наоборот). Окно в нужный момент сместится-"отпрыгнет" в сторону. Код:
!include MUI2.nsh Код : Код:
!include MUI2.nsh |
Цитата:
Код:
...i50,i100...,i$dlg,i222,i0,i0) i.R2 Цитата:
Код:
System::Call "*(i,i,i,i)i.r1" т.е в данном примере разница равна 50.. |
извините, может тупой вопрос, но все же:
используя ShowInstDetails hide, остается только кнопка "Показать детали", нажав на кнопку, открывается список деталей установки. каким способом можно сделать, чтобы была кнопка "Скрыть детали", убирала отчет и опять появляласть кнопка "Показать детали"? |
Цитата:
скорее просто так и не сделаешь.. |
Добрый вечер, подскажите пожалуйста. Есть программа к которой сделан патч, при установке патча путь берётся из реестра, но программа к которой устанавливается патч прописывается в разных месте в 32 битной винде в одном месте, а в 64 битной в другом. Как лучше реализовать чтение из реестра в InstallDirRegKey ?
|
Цитата:
Вот, например, таким способом... Читаем значение из первой ветки (типа 32 бит система) и, если в параметре путь в папку программы и есть файл "проверка файла.exe" в директории, то назначаем переменной $INSTDIR значение ключа реестра Если файл не существует, читаем из другой ветки в реестре (типа 64 бит система) и по той же схеме А если при чтении из второго ключа программа установки не найдёт указанный вами файл, то будет ошибка установки (можете сами убрать потом) Код:
Function .onInit |
Помогите плиз, сложилась такая ситуация:
Есть готовый SFX архив который отлично работает, переспросил не случайно ли нажали и запускает INSTAL.BAT который уже сам дальше занимается установкой и настройкой приложения. Однако поменялись условия и теперь нужно два варианта настройки данного приложения, получилось 2 батника каждый настраевает по своему. Нужно менять диалог например "будем ставить дополнительные примочки?", да - запускаем install1.bat, нет - запускаем install2.bat или отмена если случайно нажали. SFX такое может реализовать только ключами к запуску - не подходит (шибко "умные" пользователи) Можно реализовать еще одним батником - но это не красиво выглядит, менюха из cmd корявенько выглядит Нужно переключаться на полновесные инсталяторы, а я в этом нуб нубом. Хотелось бы: инсталер распаковывает в указанный темп файлы, предложить окно выбора 1 ставим так, 2 ставим так, 3 выход, пульнуть запуск соотвецтвующего батника и погаснуть, дальше все будет отрабатывать батник. Если это не сильно сложно может кто нибудь написать скрипт на такой прикол? или посоветуйте чем такое можно собрать самому? |
ASiRU, теперь дублируете вопрос после создания темы?
|
Вопрос совсем изменен, тут если возможно прошу скрипт для NSIS, ответ из темы не подходит по описанным выше причинам, от SFX приходится отказываться. Ту тему попрошу закрыть.
|
Цитата:
Кстати в sfx можно то же использовать два варианта установки без ключей. Простая установка и установка с зажатым Shift. |
Цитата:
Код:
!include MUI2.nsh |
ASiRU,
Попробуй : http://rghost.ru/43465395 рядом с Custom_BAT.exe (или Custom_BAT_hide.exe) должны находится два твоих BAT файла, с именами a.bat и b.bat (ессно можно было использовать маску... ). Остальное ясно из фейса. На W7 запускать от имени админа. Custom_BAT_hide.exe - для скрытого запуска батников ( запуск плагом nsExec ) |
Цитата:
|
Цитата:
Код:
Function .onInit |
Цитата:
|
profcom MKN
Спасибо огромное за участие и предоставленные примеры. Буду раскуривать эту петрушку дальше. |
Как изменить чекбокс на любой из тех, которые лежат в папке ${NSISDIR}\Contrib\Graphics\Checks?
Строка ниже не помогает. Вставляю ее сразу после объявления страницы лицензии (!insertmacro MUI_PAGE_LICENSE license.rtf) Код:
!define MUI_LICENSEPAGE_CHECKBITMAP "${NSISDIR}\Contrib\Graphics\Checks\simple-round2.bmp" |
Цитата:
вы сами себе объявили.. |
Необходимо запустить приложение из скрипта. Файлы этого приложения, как обычно, сначала распаковываются в $TEMP, откуда и происходит запуск-установка этого приложения.
Вопрос : возможно ли штатным образом зафиксировать окончание процесса распаковки файлов в $TEMP ? Есть ли какой либо Callback для этого ? |
Цитата:
Или я не правильно понял суть вопроса? :) |
Привет всем.
Прошу помочь с валидацией вводимой информации. (nsDialogs) Т.е. нужна, например, проверка - что в поле с ID указано число, а не текст. Через логически функции это сделать можно, но как запретить переход на след страницу или возврат к предыдущей, пока не поправишь? |
Цитата:
1. Подсчитываем количество символов в строке, в которой у нас хранится ID (команда StrLen) 2. Обрабатываем строку командой ${StrFilter}, указывая, что нужно отфильтровать и оставить только цифры 3. Подсчитываем количество символов в отфильтрованной строке (команда StrLen) 4. Сравниваем количество символов до фильтра и после, если количество символов не равное, значит в поле ID была указана буква (команда StrCmp) Может быть, есть и другой способ, не знаю, может кто чего другого посоветует, но я бы так сделал :) Цитата:
|
Цитата:
Дорабатываем контрол - только на ввод цифр и не более двух символов.. |
Подскажите. В хедере кода прописываю вот эту строку:
Код:
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" Код:
!define MUI_ICON "D:\Инсталлятор\images\install.ico" Использую EclipseNSIS, MUI2 Помогите пожалуйста поменять картинку шапки инсталлятора! Заранее спасибо! |
Происходит такая странность : хотя по умолчанию и отмечена RadioButton1, но при клике на Button1, событие её отметки оказывается не зафиксировано.
Если же разок кликнуть по уже отмеченной RadioButton1 - сразу всё ОК. И при переключении на RadioButton2 - всё ОК. В чём причина отсутствия реакции на дефолтовую отметку ? Код:
!include MUI2.nsh |
MKN, потому что функция fnRadioButton[1/2] со всеми вытекающими отрабатывает только после клика по RadioButton[1/2], которого после запуска инсталлятора ещё не было.
Простая команда Call fnRadioButton1 перед nsDialogs::Show решит проблему. |
Цитата:
(Потому, как приведённый пример, частный случай для двух кнопок. Если же их не 2 , а 32...) |
Доброго дня, методом проб и ошибок, мучая предоставленные ранее примеры и справочник из шапки, понял что в первый раз и спрашивал чутка нето и видел процес по другому. В моей последней версии получилось вот так
Код:
!define PRODUCT_NAME "Notes" От одного батника избавился полностью, там было добавление строк в .txt и копирование фалов. А вот у второго осталась одна последняя строчка к которой незнаю как подступиться. Код:
if %userdomain% == ACME echo UserName=%username% >> D:\Notes\setup.txt И вопрос второй косметический, в окне компонентов есть пунк который показывает требуемое место на диске, можно ли ему как то присвоить свое статичное значение или выключить вообще?? (Это не кретично, но не красиво выходит, инсталер не учитывает работу .msi который отрабатывает в процесе) |
Цитата:
Код:
!define MUI_HEADERIMAGE Код:
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" |
Цитата:
Код:
nsExec::Exec `"$WINDIR\System32\cmd.exe" /C if %userdomain% == ACME echo UserName=%username% >> D:\Notes\setup.txt` Код:
Function Test |
Цитата:
|
profcom Спасибо, буду пробовать дальше )
|
Фоновое изображение на стандартных страницах (на всех или по выбору)
Картинку фона ессно используйте свою - bg.bmp размером 497x314 |
Так ещё одна загвоздка с radiobutton
Имеется структура выбора компонентов: -Группа секций 1 --Секция 11 ID_11 --Секция 12 ID_12 --Секция 13 ID_13 -Группа секций 2 --Секция 21 ID_21 --Секция 22 ID_22 --Секция 23 ID_23 используя код из справочника, всё хорошо выбирает. НО хотелось бы чтобы по нажатию на чекбокс "Группа секций 1", происходило убирание голчек с секций 11, 12, 13, т.е. со всей группы. Подскажите что добавить чтобы можно было управлять группой. |
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 можно только с кривой реализацией, когда сначала с секции убирается выделение а потом присваивается. а этот нормальный метод переключения по одному нажатию не прокатит, а жаль. т.е. реализовать выбор одного компонента одним нажатием исключающие выбор двух других компонентов не получится, а получится только выбор двойным нажатием... |
Lex_from_Belarus,
Сделай свою комбинацию на кастомной странице (с помощью nsDialogs). Там любую комбинацию можно реализовать. |
MKN, да я если честно вообще не понимаю, как за столько лет существования nsis с отсутствующим в нём radiobutton не нарисовали кастомной страницы с дизайном стандартной. а сам не хочу писать потому как знают что кривая будет страница в плане сходства с оригиналом, а сколько надо сделать чтобы её реализовать и заставить работать. жуть.
Кстати может у кого есть нарисованный кастом под компоненты? |
Lex_from_Belarus,
Примеров уже было много. Просмотри 1 часть темы, наверняка найдёшь подходящее, останется только подкорректировать под свои нужды. |
|
Цитата:
|
в секции деинсталляции проблема.
все удаляется без проблем кроме того, что в меню пуск Код:
Section Uninstall windows 7 64 бита в чем моя ошибка. и еще дайте пример как зарегистрировать расширение файла (ассоциацию) |
andryz80,
Про всё уже не раз сказано и приведены примеры. См. 1 часть темы. |
А кто-нибудь знает как запустить файл установки во время установки моего установщика в режиме совместимости Win7 (просто прога не устанавливается просто так на Win8, а врежиме совместимости всё OK)
Надо использовать, а вот с каким параметром не знаю. ExecWait '"$INSTDIR\someprogram.exe"' $0 |
Lex_from_Belarus,
Не знаю как в W8, а в W7 параметры совместимости устанавливаются в [HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers] Может попробовать перед запуском, сначала туда "прописывать" программу-установщик ? |
покопался на форуме нарыл вот SetShellVarContext all добавил
Код:
а вот как регить ассоциации не нашел. точнее не нашел универсального средства, что бы для ХР или семерки или 64разрядных работало и там и там помогите. или хотя бы носом мокните где почитать. ведь тому, кто ориентируется легче дать наводку. а я новичок и не ориентируюсь пока еще. сорри |
вот нашел регистрацию расширений но много чего не понятно.
можете кто нибудь прокомментировать что за записи в реестр делает макрос? Код:
!macro RegisterExtension extenstion |
Помогите мне пожалуйста загрузить текст из rtf файла. Суть:
1. При компиляции к инсталлятору подключается rtf файл с текстом 2. При запуске инсталлятора из этого файла читается содержимое и выводится в Label. Суть такая же, как и с окном лицензии. Это возможно реализовать? Заранее спасибо. |
Цитата:
Цитата:
нужно создавать контрол RichEdit20A примеров до хрена |
Цитата:
Вот немного основной информации : Но и это далеко не всё... Для полного счастья при ассоциировании надо также чтобы : Приложение, которое устанавливается для всех пользователей компьютера, было зарегистрировано под ключом реестра 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 обстановка с ассоциированием ещё круче... Цитата:
Хотя не всё так уныло, как описано в статье. Некоторые программы успешно справляются с ассоциированием файлов при установке, не смотря на то что "их" тип файлов, по умолчанию уже занят системой. Например, AdobeReader. |
ужасс как все запутаноо. а может есть кусок универсального кода?
задача то у меня простая. что бы файлы с расширением lay открывались программой sprintlayout но что бы и на ХР и на семерке работало а по поводу почему папка не удаляется никто не поможет? |
Цитата:
Код:
Цитата:
Код:
Section Uninstall |
Прошу помочь с ведением лога установки.
Для записи в лог использую плагин: http://nsis.sourceforge.net/NSISLog_plug-in С ним все ок. Но стоит вопрос записи времени каждого действия: Использую плагин: http://nsis.sourceforge.net/Time_plug-in Очень неудобно каждый раз писать в переменную и потом выводить... Может есть какое то более универсальное решение? |
DruOleg, в справочнике не смотрели страничку по пути "Примеры кодов => LOG-файл установки"?
В тот метод можно прикрутить время |
Цитата:
|
Прошу помочь найти ошибку версия nsis ANSI. Ошибка заключалась в необходимой инициализации перед вызовом функции.
Код:
System::Alloc 64 # (4+4+8+8+8+8+8+8+8=64 байта) # выделяем буфер |
Цитата:
2. Вы сами прописываете ручками в коде, какие данные занести в LOG файл и плагин просто прописывает текст в файл по указанию переменной? |
Цитата:
Код:
!macro Log _msg |
Цитата:
2. Да, это основной аргумент - пишу в лог только то, что мне нужно. |
Подскажите пожалуйста, а на основании этого лога можно сделать Uninstall. Ну проще говоря, при установке есть 20 компонентов, устанавливается допустим из них штук 15. Потом при удалении хотелось бы сделать возможность удалить допустим 10, т.е. должно остаться 5 штук. Или есть проще вариант. Вариант с прописыванием файлов вручную не вариант, т.к. файлов в каждом компоненте много и они пересекаются в одних и тех же папках.
|
Цитата:
|
Цитата:
Используй !insertmacro MUI_UNPAGE_COMPONENTS и пропиши всё что пожелаешь для выбора при удалении , на основании предварительной проверки уже установленных компонентов... (А это всего - по 3-4 строки кода для проверки наличия каждого компонента - есть ли такой то файл или ключ и если нет, то сделать недоступным чекбокс отсутствующего компонента... ) Вредный совет : А, если лень, то можно и без проверки, укажи все 20 - обычно ошибки при этом не бывает, хотя так будет бестолково и не правильно... :) По моему , так гораздо проще и быстрее, чем возиться с логом... |
Цитата:
Цитата:
|
блин папка не удаляется и файлы не ассоциируется
может мне весь код выложить? вот весь код. вот что я делаю не так? ассоциации нет и папка не удаляется. при том все из папки удаляется а она сама нет Код:
!define PRODUCT_NAME "Sprint Layout" |
andryz80, если уж собирались выкладывать весь код, то и выкладывайте весь, а не кусок.
|
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" ) После анинсталла перезагрузись и проверь удаление папки. Если и это не поможет, то придётся позвать батюшку и освятить твой скрипт... :) |
Прощу прощения я не заметил, что код не весь вот вроде весь
под XP на виртуалке я пробовал и все работает как надо а вот под семеркой все проблемы вылезают. Код:
!define PRODUCT_NAME "Sprint Layout" |
andryz80, Я конечно не специалист в ассоциациях, но на мой взгляд должно быть так для win7
Код:
WriteRegStr HKEY_CURRENT_USER "Software\Classes\.lay" "" "Layout.File.6" |
Скрываваем в окне: опции-значки Minimize\Maximize (Свернуть\ Свернуть в окно. Это, которые в верхнем правом углу окна.)
Код:
!include MUI.nsh |
подскажите а как правильно установить шрифт, я так понимаю прото установить в папку fonts недостаточно?
|
Цитата:
|
Цитата:
там вроде только ttf и fon |
Цитата:
|
переписал заново и не помогло
под ХР работает все как надо а вот на семерке не удаляется папка и еще почему то ярлык на рабочем столе а так же тот файл который ассоциирован не отображают иконку. просто как неизвестный файл и все но ассоциации работают неуже ли меню пуск как то отличается на семерке от ХР? Код:
;Sprint Layot 6.0 |
andryz80, Скинь на какой нибудь файлообменник всю программу и скрипт, попробую помочь.
|
Цитата:
|
Цитата:
Можно с помощью команд, системных или спец утилит. (Как, уже было где то на форуме - поищи "Как получить доступ к файлу или папке" ) |
Цитата:
в секции делаю (хотя пробовал по разному): 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 highest Код:
RequestExecutionLevel admin |
Считываем информацию со страницы PAGE_DIRECTORY о наличии свободного/необходимого объёма дискового пространства.
Скрываем отображение этой информацию на странице PAGE_DIRECTORY. Код:
!include MUI.nsh |
Добрый день!
С помощью NSIS создается деинсталлятор ко всему прочему. Как сделать так, чтобы этот деинсталлятор пользователь запускал с правами администратора. могу ли я внутри скрипта NSIS это прописать? Может быть можно поставить на деинсталлятор атрибут запускать с правами администратора |
Цитата:
|
profcom, вот на свой яндексдиск архив забросил забрать с яндексдиска
|
Цитата:
может я в коде не то что-то написал? |
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" проверку установки можно не делать |
Урррааа. все папка проклятая ужаляется и все работает и даже аасоциации
просто вначале добавил Код:
RequestExecutionLevel highest и еще одна неприятная мелочь. при ассоциации почему то у файлов ассоциированых иконка неизвестного файла. Код:
Section |
Цитата:
Цитата:
На счет иконки завтра напишу в чем беда времени не хватило. |
Цитата:
|
А подскажите пожалуйста, как прибить окна выполняющегося инсталятора, когда выполняется вот эта команда?
ExecWait "$INSTDIR\program.exe /S" Тут в частности вылазит, когда программа установлена, сообщение о том что надо удалить старую, а мне бы хотелось, чтобы постоянно просто устанавливалось никому ничего не говоря. |
Цитата:
В зависимости от организации твоего скрипта можно использовать разные приёмы : При условии запуска Silent установки - от просто AutoCloseWindow true и HideWindow, до радикального Код:
Function .onGUIInit Цитата:
или, если проверка положительна : 1. автоудаление старой версии без всяких сообщений 2. в зависимости от ПО, можно сделать установку поверх старой проги, с обновлением файлов и записей реестра и пр. 3. запрет на установку новой... Выбирай... :) |
MKN, нет, ситуация такова, что program.exe - это не моя программа, но тоже установщик nsis. просто как библотека установится должна, а она уже выдаёт окна, например об уже установленной версии.
|
profcom, и еще вопросик можно ли эту иконку при ассоциации сделать с внешнего файла iconka.ico а не тот, что в ехешнике самой программы?
|
Цитата:
|
Цитата:
Код:
!include "FileFunc.nsh" |
Цитата:
DLL используют, когда в неё помещают наборы разных иконок, с разным разрешением, битностью и т.д. Тогда ссылаются на id нужной иконки в DLL. |
Цитата:
|
Цитата:
Если путь указан верно и используется действительно файл ico, а не нечто иное с расширением ico - то работать просто обязано. :) |
похоже все дело в самой иконке. в файле ico не одна иконка а три разного размера может потому и не заработала. попробовал с обычной иконкой все пашет на ура
|
прошу еще помощи
команда WriteRegStr записывает в реестр я так понял DeleteRegKey это наоборот. и синтаксис у нее такой же? почему то компилятор ругается |
Цитата:
Справочник по NSIS => Перевод справки NSIS => Работа с реестром |
Подскажите - каким образом создать таймер, отсчитывающий время в ч:м:с с момента старта, т.е. начиная с 00:00:00 ?
С ${GetTime} что то номер не выходит... |
Цитата:
Если так, то есть прекрасный плагин Time plug-in, там есть математические операции со временем |
Цитата:
Т.е. идёт процесс - наглядно отображается время с нуля-начала процесса. Процесс закончился - отображение исчезло (+ , если возможно, заненсение результата в переменную) |
Цитата:
Попробуй плагин ThreadTimer plug-in, там в callback функции пропиши определение времени, затем сообщения "WM_SETTEXT" на элемент, который будет таймер отображать Сам не пробовал (сейчас времени нет), чисто теория :) |
Цитата:
Может как то самим организовать отсчёт ? : для минут и секунд заявим 3 переменные, которые будут обозначать разряды времени : $1 - десятки минут ( от 0 до 5 ), $2 - единицы минут (от 0 до 9), $3 - "сдвоенный" разряд, отсчёта секунд от 00 до 59. (или всё же лучше разделить разряды секунд на десятки и единицы ? Но по моему не обязательно...) и начнём посекундный отсчёт, с занесением ( и одновременно отображением) значений в эти переменные по следующей логике : как только отсчёт секунд достигнет 59, через следующую секунду $3 обнуляется до 00 , а в $2 - разряда единиц минут заносится - 1, и отсчёт секунд начинается вновь c 00 до 59 Когда цикл счёта секунд до 59+1 вновь завершится, к единицам минут добавится ещё единичка и так до 9, после чего добавляется единица в разряд десятков минут, т.е. в $1. И так до достижения 59 мин 59 секунд. А больше вообщем то и не надо, и такое то значение вряд ли когда понадобится на практике... (хотя в идеале часы тоже надо бы учесть...) |
Цитата:
Я тебе его дал для создания отдельного потока, без которого обновлять элементы (менять циферки, пока идёт распаковка файлов к примеру) не получится Короче вот смотри код, смотри на заголовок окна ;) А там уже добавишь высчитывание диапазона времени, если нужно (плагином Time plug-in) Код:
; Script generated by the HM NIS Edit Script Wizard. Это тебе как в пример, блин пока писал, ты тут понаписал много чего про цифры :lol: Сейчас прочитаю и вникну в суть --- Цитата:
Тот плагин "Time", там можно подсчитать разницу во времени, т.е. смотри: запускается инсталлер - команда определения времени в той функции, которую я тебе выше написал (для отображения часов в реальном времени) там прописываем команду на математическую операцию (из текущего времени вычитаем то, которое было на момент запуска инсталлера) и таким образом получаем то время, которое работает инсталлер на текущий момент Решил изобрести велосипед?? :) |
K.A.V.,
Не, мы кажись не поняли друг друга... Сначала. Чего я хотел : идёт процесс (или не идёт, всё равно) , в окне инсталлера наблюдаем оконце с таймером, который я запускаю как душе угодно. Или вовсе автономно или когда начнётся процесс установки. Таймер после запуска начинает отсчёт с 00:00. Ключевой момент - от 00: 00. Для начала - всё. Вот, как то так... :) |
MKN, да блин, какая разница то? Используй плагин time и делай математическую операцию :biggrin:
Ведь всё к одному и тому-же сходится один фиг :yes: Держи, дружище ;) Копайся :drug: Код:
|
K.A.V.,
Однако, как хитро запутанно... :) Благодарю ! |
Здравствуйте! Нижепредставленый код загружает в 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'' |
Цитата:
но можно во временную папку для работы плагов (установщик автоматом создает и по завершении работы подчищает) Код:
InitPluginsDir |
Подскажите что я делаю не так. Есть код:
Этим кодом я хочу проверить установлена ли библиотека и если нет, то установить. В UninstallString прописан путь к Uninstaller программы полностью вместе с файлом, поэтому использую ${GetParent}, чтобы отсечь Uninstall.exe и получить просто путь, ну а далее проверка есть лигтштыефдд в папке, если есть значит пропустить, но почему-то этот код не катит, постоянно идёт установка, хотя по пути в реестре всё есть. Проверка в реестре 2 раза, т.к. при установке в 32 битной и 64 битной системе путь в реестре разный. |
Цитата:
Lex_from_Belarus, че за хрень, а не нормальный код.. Код:
IfFileExists $prog\Uninstall.exe 0 +2 Код:
IfFileExists $prog\Uninstall.exe +4 Код:
MessageBox MB_OK "$$0 = $0" IDOK |
IfFileExists $prog\Uninstall.exe +4
ну и как вы себе это представляете? я же написал что в uninstallstring в реестре хранится путь с фалом, т.е, например c:\program files\program\uninstall.exe. MessageBox вставляю для проверки везде пишет всё ОК, т.е. и реестр правильно читает и отсекает в пути имя файла, т.е. оставляет просто путь, но вот после ifFileExists идёт дальше а не перескакивает на ОК, как буд-то ifFileExists не срабатывает, т.е. всё остальное проходит, а на ifFileExists косяк. |
Возвращаясь к таймеру...
Время исполнения кода можно подсчитывать и таким способом, с помощью функции GetTickCount : Код:
OutFile "Elapsed Time.exe" Вопрос : возможно ли при этом способе визуализировать отсчёт времени в процессе выполнения кода ? |
Цитата:
|
Цитата:
Цитата:
У меня так работает с маленьким расхождением в миллисекундах. |
Цитата:
Цитата:
А если с выделением-очисткой памяти : Код:
System::Alloc 400 |
Цитата:
Если в секции с паузой, то всё норм |
Цитата:
Код:
!include nsDialogs.nsh |
Вот еще набросал примерчик для стандартной функций установки используя плагин ThreadTimer для создания параллельного потока . В принципе куда угодно можно отобразить время.
Код:
OutFile "Time2.exe" |
Цитата:
Код:
!include LogicLib.nsh |
Озадачился я тут такой задачкой : Необходимо получить Callback при наведении указателя мыши и клике левой кнопкой мыши на любом объекте с известным ID, на любой страницы .
Т.е. - навёл мышь на объект, кликнул ЛКМ - произошло действие. Есть ли универсальное решение для такой задачи ? Также интересно - возможно ли при вышеописанном действии, выделять границы объекта (на время нахождения указателя мыши в пределах границы объекта) ? |
Цитата:
|
kotkovets,
А возможен ли обходной маневр - если вычислить координаты нужного объекта, а при клике ЛКМ, тут же вычисляется позиция курсора и вызывается функция сравнения "пересечения" границ координат указателя и объекта - что и вызывает событие при "пересечении" ? Или это получится громозда, а не код... |
Изменяем месторасположение полосы прогресс бара (индикатора процесса установки) на странице PAGE_INSTFILES
Код:
!include "MUI2.nsh" нижний правый углы рабочей области. Поскольку рабочие координаты определены относительно левого верхнего угла рабочей области окна, координаты левого верхнего угла - (0,0). Функция GetWindowRect отыскивает размеры рамки ограничивающей прямоугольник определяемого окна. Размеры даны в экранных координатах, которые расположены относительно левого верхнего угла экрана. Функция SetWindowPos изменяет размер, позицию и Z-последовательность дочернего, выскакивающего или верхнего уровня окна. Дочерние, выскакивающие и верхнего уровня окна размещаются по порядку согласно их появлению на экране. Самое верхнее окно принимает самый высокий ранг и становится первым окном в Z-последовательности. SWP_NOZORDER - Сохраняет текущую Z-последовательность (игнорирует параметр hWndInsertAfter - дескриптор порядка размещения). |
Уважаемые!
Обнаружил полезный пример: Цитата:
|
Цитата:
Код:
!include "MUI2.nsh" |
Цитата:
Код:
MessageBox MB_OK|MB_ICONEXCLAMATION "Продолжить установку?" IDOK Start А вообще, было бы интересно узнать подробнее, как поставить таймер на кнопку в таком сообщении. |
Здравствуйте! Как изменить текст, который отображается над прогрессбаром на странице установки? Там показываются файлы, которые сейчас распаковываются. А мне нужно поставить свой текст. Это возможно?
Заранее спасибо |
Цитата:
Код:
SetDetailsPrint none Код:
DetailPrint "бла бла бла" |
Цитата:
Цитата:
Код:
!include "MUI2.nsh" Кнопки в сообщении и надписи действий на кнопках 0x0 - ОК 0x1 - ОК Отмена 0x2 - Прервать Повтор Пропустить 0x3 - Да Нет Отмена 0x4 - Да Нет 0x5 - Повтор Отмена 0x6 - Отмена Повторить Продолжить 0x4000 - ОК Справка Значок сообщения : 0x10 - Белый X-крест в красном круге 0x20 - Вопросительный знак в "всплывающем облаке" 0x30 - Восклицательный знак в жёлтом треугольнике 0x40 - Восклицательный знак в "всплывающем облаке" Инфо : http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx |
Ещё раз о таймере... Отсчитать время можно также с помощью функции timeGetTime
Эта функция якобы менее ресурсоёмкая, сравнительно с GetTickCount... Код:
OutFile "Elapsed Time-timeGetTime.exe" которая извлекает текущее значение счетчика высокого разрешения. Только зачем это нужно на практике не ясно... Эту функцию чаще применяют для всякой Random_изации, что есть тоже не понятное явление для практики... Обычного подсчёта мне добиться не удалось... Синтаксис был такой ("основной" ,без вычитания...) : Код:
System::Call "kernel32::QueryPerformanceCounter(*l.r0)" |
Цитата:
Код:
System::Call "kernel32::QueryPerformanceCounter(*l.r1)i.R0" Что функция возвратила в буфер - не понятно, может тут и числа быть с плавающей запятой, который NSIS не умеет работать (хотя стандарный плаг Math (для мат. вычислений) умеет. Дерзай! :) |
возникла задача сделать небольшую програмку
при запуске просит выбрать букву диска съемного а далее работает с этим диском (меняет атрибуты всех файлов) как менять атрибуты файлов я догадываюсь а вот как определять букву диска не знаю. подскажите плииизз все таки не нашел как менять атрибуты |
andryz80, Справочник по NSIS
GetDrives: перечисляем устройства хранения информации Locate: поиск файлов/папок и не только... Аттрибуты файлам устанавливаются командой SetFileAttributes Код:
SetFileAttributes "$WINDIR\explorer.exe" HIDDEN|READONLY ИХ можно комбинировать, т.е. для файла указывать сразу несколько аттрибутов, только разделить их нужно вертикальной чертой (пример выше) |
а атрибуты папок какой командой менять?
|
кстати может я велосипед изобретаю? планирую програмку сделать дл борьбы с вирусом, который на флешке прячет файлы.
может уже есть готовая? |
|
почему бред?
вполне под силу исправить реестр (отключение возможности загрузки в защищенном режиме) почистить папки в которых прописывается вирус удалить на флешке папку с вирусом авторан и ярлыки изменить атрибуты папок вроде должно сработать |
Цитата:
SOS! Мне надо как-то привести к общему знаменателю кусок кода, только никак не могу собразить как это заставить перейти на Start: - после нажатия OK, а без нажатия - на Exit:, если функция в любом случае возвращает 1, нажимай ОК или не нажимай: Код:
!include "MUI.nsh" Цитата:
|
Waterclo,
Для различия кодов возврата надо использовать сообщение типа 0x1 (или иное "несколькокнопочное", с учётом конкретных кодов возврата) Код:
!include "MUI2.nsh" А вешать таймер отсчёта на кнопку в сообщении - хлопотно и наверняка громоздко. И стоит ли оно того... Может конечно кто и заинтересуется и напишет плаг, но маловероятно... |
Для определения оборудования в NSIS , используют обычно HwInfo plug-in (а других просто нет...) ( http://nsis.sourceforge.net/HwInfo_plug-in )
Но возможности его весьма убоги. Есть ещё CPUFeatures, определяет массу параметров CPU (почему то кроме названия проца... ) И похоже, что другого, тем более универсального, инструментария - нет... Кое что конечно можно получить с помощью API и выудить из реестра... Только это довольно-таки громоздко в коде. Например, определяем сетевой адаптер и некоторые его параметры : Код:
OutFile "LanDetect.exe" Код:
OutFile "MemInfo.exe" Возможности его широки и не объятны, только не понимает он к сожалению по русски. К примеру, при определении сетевых адаптеров, видим сплошные кракозябры в описании... Код:
OutFile WMI.exe |
Друзья, насколько НСИС дружит с Вин8 ?
Возможно вопрос уже задавался... Если что, извиняюсь... |
Цитата:
|
MKN, благодарю, не подскажете ещё, взаимодействия с реестром также корректно работают? Создание ключей, удаление ключей в реестре и т.д
|
Aster,
Быстрее и проще проверить самому. :) И с реестром всё хорошо работает. Что и как сделаешь, то и получишь. :) Делай всё согласно доку и нашему Справочнику - и всё будет так, как надо. |
Цитата:
Цитата:
Код:
Function callback_Function |
Цитата:
|
Цитата:
![]() |
Цитата:
Давно интересует такой вопрос - может ли NSIS работать с окнами класса Internet Explorer_Server ? (Это что то связанное с GetIHTMLDocument2 ) ( К примеру, Corel их вовсю применяет в своих инсталлерах , да и др. ПО тоже. ) |
Цитата:
![]() Код:
;-Создание ярлыков из INI-файла P.S Может кому понадобится, поэтому хвастаюсь :) |
Изменяем стандартную страницу выбора компонентов PAGE_COMPONENTS без правки ресурсов
Код:
!define PRODUCT_NAME "COMPONENTSPRE" |
Подскажите пожалуйста - как с помощью WMI вызова узнать версию файла шрифта ?
(вроде бы надо как то использовать Win32_FontInfoAction Version. Но как ? ) |
Вложений: 1
Цитата:
Код:
On Error Resume Next эксперементально на nsis |
kotkovets,
А как натравить скрипт на конкретный TTF ? (рядом находящиеся не видит...) И очень очень долго идёт обработка (у меня минуты три, а что находит - не понятно...) Вот так после обработки : Код:
===============root\CIMV2===================== |
Цитата:
я не спец по vbs.. спроси в другой теме.. попробую перевести на nsis , ну если узнаешь как на VBS делать..:) |
MKN, спасибо всё получилось, как я хотел.
Цитата:
|
Цитата:
|
Подскажите как выйти из ситуации, вот код:
Код:
Function ClickButton |
diakov,
возможно дело в Redirection (перенаправлении) попробуй в Function .onInit : ${If} ${RunningX64} ${DisableX64FSRedirection} # или ${EnableX64FSRedirection} ${EndIf} |
Подскажите такое, есть код:
Код:
Function ClickButton1 |
Цитата:
который никогда... эээ... почему бред - не буду описывать, ибо справка есть.. пишите на логических констукциях - потеряться и запутаться стремится к нулю |
kotkovets, а если так:
Код:
Function ClickButton1 Как сделать что бы установщик после нажатия на кнопку ок закрывался сам и комп перезагружался? |
Господа, подскажите пожалуйста
Возможно ли при установки приложени дополнять установщик своими ключами Например Цитата:
|
Цитата:
Читайте справочник Справочник по NSIS => » GetOptions: обрабатываем значение ключа в параметре запуска инсталлятора Это как определить, указан ли конкретный ключ при запуске инсталлера, а насчет Цитата:
|
Ребят может кто то подскажет что с моим кодом нет так?
|
Иногда в NSIS коде встречается такое : ${SegmentFile} ${SegmentInit} ${SegmentPreExecPrimary} и др ${Segment ***
Что это и для чего ? |
MKN, гугл рулит, и вот нашел что-то: http://portableapps.com/manuals/Port...custom-segment
Пока на английском. |
alert30,
Это я уже читал (переводил). Яснсти нет. (Что за Custom.nsh ? Где он есть, что содержит ? ) Или ${Segment - это местная для portableapps, специфика ? |
Цитата:
заголовочном файле *.nsh Естественно заголовочный файл включается в тело скрипта: Код:
!include "путь к файлу nsh" |
В скрипте есть несколько секций. Как сделать так, чтоб в зависимости от разрядности системы (32-bit, 64-bit) выполнялись те или иные секции, а ненужные даже не отображались в окне выбора компонентов.
Сорри если ответ уже был, но перечитывать 350 страниц форума нет возможности. |
Цитата:
Код:
!include "MUI2.nsh" в любой секции пишу вот такой макрос: Код:
${If} ${RunningX64} |
kotkovets, спасибо.
А есть возможность сделать тоже самое, только добавить определение версии Windows. Нужно, чтобы определялась Windows 8. |
Кто нибудь может подсказать как изменить текст на странице стартового меню?
пробую так: Код:
var $mui.StartMenuPage.Text |
Цитата:
Цитата:
Либо используйте SendMessage (WM_SETTEXT) с указанием handle элемента, ID элемента узнайте сами, смотря с помощью чего вы там страничку делаете wolkow70, Вы вроде бы не первый день с NSIS работаете, а справочник так и не пробовали весь полностью прочитать? |
Цитата:
Код:
Команда MUI_STARTMENUPAGE_TEXT_TOP помещает текст над списком меню "Пуск". поэтому и пробовал прописать StrCpy $mui.StartMenuPage.Text "$(MUI_STARTMENUPAGE_TEXT_TOP)" |
Цитата:
В команде ${NSD_SetText} должно же быть указание handle, а по вашему коду полчается что? А ничего, вы сначала переменной $mui.StartMenuPage.Text назначаете текст, который уже определён в $(MUI_STARTMENUPAGE_TEXT_TOP), затем указываете эту переменную ($mui.StartMenuPage.Text) в команде ${NSD_SetText} :o Хотя за место неё должно быть указание handle элемента, разве не? Т.е. по вашему коду должно быть тип такого (где $TextHandle - дескриптор элемента с текстом): Код:
${NSD_SetText} $TextHandle $mui.StartMenuPage.Text |
Цитата:
Оказалось, что в отличии от других страниц в хедере StartMenu.nsh переменная $mui.StartMenuPage.Text стандартно не объявлена. Поэтому пришлось ее объявлять и действительно ей придется предварительно назначать handle, пока я не разобрался как это делается. Для других страниц в хедерах содержатся такие команды типа: GetDlgItem $mui.DirectoryPage.Text $mui.DirectoryPage 1006 |
Цитата:
Для Modern UI Для Modern UI 2 Теперь можете использовать переменную $mui.StartMenuPage.Text, в ней - handle элемента с текстом ;) |
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. |
Цитата:
Цитата:
а так, для назначения текста там же dll используется, пролистинте чуть выше по коду в *.nsh файле, может та dll что-то делает :) |
Цитата:
Код:
outfile test.exe |
В примере лог конструкций Справки сказано " для
${Case5} и далее пять значений : Цитата:
Или 5 - это и есть ограничение для макроса ? (а где про это вообще сказано ? ) Тогда в вышеприведённой цитате хорошо бы указывать - "не более пяти значений". Так было бы более конкретно и понятно... Вроде бы мелочь, но... А если надо выбирать из 25 значений ? |
Цитата:
Из хедера LogicLib.nsh: Код:
!macro _Case5 _a _b _c _d _e |
MKN, а правкой хидера можно и больше...
Ну добавь в логику ещё {case5} и уже 10... И так далее... |
Привет всем.
Вопрос простой: подскажите, пожалуйста, какой командой удалять ярлыки с рабочего стола? Команда Delete "$DESKTOP\имя ярылка.lnk" не срабатывает... |
Цитата:
А вообще, телепатов здесь нет... Операционная система? Разрядность? Может, дело в этом? Shortcuts removal fails on Windows Vista |
Цитата:
Код:
outfile test.exe |
K.A.V., ну у меня WinXP.
При таких командах ярлык с рабочего стола удалился. SetShellVarContext all Delete "$DESKTOP\имя ярлыка.lnk" Спасибо за помощь! |
Ребята помогите с ссылкой http://winreview.ru/NSIS/472/Sozdani...mandnoj-stroki , на новый сайт статью не перенели, это вроде бульдозера сайт, а тут ни у кого в закромах родины не осталось?
Создание своего инсталлятора на NSIS. Реализация дополнительных ключей командной строки вот название статьи |
Цитата:
|
Закрепление ярлыка программы на Панели задач в ОС Vista/Windows 7
В составе некоторых современных дистрибутивов появилась полезная утилита pin2taskbar.exe, позволяющая в процессе установки или деинсталляции приложений закрепить значок программы на Панели задач в ОC Vista/Windows 7 или изъять его. Я взял такую утилиту из оригинального дистрибутива KMPlayer. Выложил для скачивания здесь: http://rusfolder.com/35691315 Применение утилиты в скриптах NSIS может быть реализовано примерно таким образом: Код:
!include "WinVer.nsh" |
Цитата:
http://forum.oszone.net/post-1830962-2193.html |
Добрый вечер есть плаг http://nsis.sourceforge.net/EBanner_plug-in в описании написано PNG (with transparency) are supported, тоесть PNG с поддержкой прозрачности поддерживается, но отображается он в инстальнике все равно на черном фоне, в чем может быть причина?
|
Цитата:
Закрепление всегда срабатывает. Код:
Var AppExe |
Цитата:
|
|
Цитата:
|
Товарищи, можно ли как-то сравнить два файла (без версии в ресурсах) на дату изменения (нужно определить более новый файл) ?
При этом речь идет не о проверке при распаковке, а нужно выполнить операцию CopyFiles, если файл новее. |
Цитата:
Код:
GetFileTime "путь\файл" $0 $1 Значения в переменных будут в виде ахинеи, что для сравнения не важно. Но можно и переконвертировать в нормальный вид, например дату создания : Код:
OutFile "Test_GetFileTime.exe" |
kotkovets,
Столкнулся с проблемой при закреплении ярлыка на панели задач (никак не хотел закрепляться). Помогло выполнение ремонта кэша иконок перед выполнением макроса. Вот таким образом: ExecWait '"$SYSDIR\ie4uinit.exe" -ClearIconCache' ${PinToTaskBar} "$INSTDIR\$AppExe" |
Кто-нибудь может подсказать как при выполнении функции ReplaceLinesInFile по замене текста в файле сделать так, чтобы временный файл создавался не в папке с инсталлятором, а где-нибудь в другом месте?
Вопрос связан с тем, что инсталлятор нужно записать на диск. Код:
Function ReplaceLinesInFile |
Хочу понять, что куда распаковываются компоненты программы, написанной в NSIS. Подскажите, как вытянуть сценарий?
|
Цитата:
Вы можете его изменить как вам угодно, вы же обрезали и выкинули кусочек кода, где присваивается переменной путь файла Код:
StrCpy $_FindInFile '$EXEDIR\TEST.txt' ; Заменяем строки в этом файле Цитата:
Цитата:
И прочитайте шапку темы, там ответ кстати дан. И прочитайте справочник по NSIS на русском языке. Всё в шапке. |
Цитата:
StrCpy $_FindInFile '$INSTDIR\opera_install_log.xml' ; Заменяем строки в этом файле StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку StrCpy $_LineToInsert '$INSTDIR' ; На что будем заменять Call ReplaceLinesInFile В процессе замены неоднократно именно в папке с инсталлятором (не в $INSTDIR) создается временный файл. В деталях отображается переименование файла во временный по мере внесения изменений. Вот мне нужно,чтобы он мелькал в другом месте, так как на CD он не сможет создаваться. |
здравствуйте,
подскажите, отличаются ли события при нажатии на крестик закрытия и Cancel button? Я использую пользовательскую функцию CustomAbort и хотел бы при нажатии на кнопку отмены выводить одно сообщение, а при нажатии на крестик другое. возможно ли это? . |
kotkovets, Здравствуйте. Хочу повторить вопрос, который я задавал раньше... У Вас, как-то, было желание написать библиотеку, чтобы работать в NSIS с окнами приложений. Очень хочется, например, кликать на кнопки формы по координатам мышью... :) Появилось ли что-то подобное где-нибудь, у кого-нибудь?
|
Всем Привет , кто может помочь мне ? Мне нужен простой пример ассциации файлов , и еще при выборе компонентов мне необходимо чтобы флажок был установлен по умолчанию и его нельзя было бы убрать как в inno setup где флаг установлен как fixed , помогите плиз! Заранее спасибо .
|
Mafioza, про ассоциацию фалов есть раздел в справочнике из первого поста (Создание своего инсталлятора на NSIS. Ассоциации файлов. Макросы)
Чтобы флажок был заблокирован нужно вставить в скецию SectionIn RO, например: Код:
Section "Sec Name" secName |
Друзья, подскажите:
Как в поле Show Detalis скрыть отображение распаковки файлов и путь программы? (распаковывается один файл в $Temp, затем удаляется). И напротив, как в это поле вывести выхлоп запуска консольной утилиты, и при этом скрыть консольное окно? |
Цитата:
Ну как вариант, можно сделать отдельный EXE чисто с функцией замены строк, копировать его в $TEMP и запускать оттуда Цитата:
|
Всем привет , я хочу создать инсталляторм браузера Opera , не могли бы вы мне помочь , я хочу чтобы после установки браузер был назначем по умолчанию и дом, страницей стала страница opera.com , заранее спасибо !
|
Цитата:
Цитата:
Либо упаковываете изменённый файл конфигурации, либо после распаковки файла, командой WriteINIStr устанавливаем значение параметра, описание команд NSIS есть в Справочнике по NSIS |
Какое сжатие использовать, чтобы файлы из инсталлятора нельзя было вытащить при помощи 7-zip и прочих архиваторов?
|
Здравствуйте. Моя трабла такова, хочу сделать установочник в котором хотел бы использовать несколько ключей установки, в частности для добавления в различные директории ярлыки программы, подскажите пожалуйста кто чем может.
|
Цитата:
Код:
|
NSIS 3.0a0
Скачать : http://nsis.sourceforge.net/Download Обсуждение : http://forums.winamp.com/showthread.php?t=361808 |
Цитата:
бегло пробежался, что нового... самые существенные: --- 1) Подержка юникода (я так понял примерно..), т.е не нужно отдельно скачивать юникодную версию - текстовый скрипт может быть в любом юникоде.. деинсталлятор всегда "юникодный" - т.е будет работать от windows 2000 (XP) и выше... -- 2) Поддержка Windows 8 и Windows Server 2012 -- 3) Плагины отдельно хранятся в папках: анси - NSIS\Plugins\x86-ansi юникодные - NSIS\Plugins\x86-unicode --- ссылку на скачивание добавил в шапку |
Ещё пример для функции CreateWindowEx :
Создаём на странице окно и помещаем в это окно флеш анимацию ( в формате swf ) Код:
!include MUI2.nsh путем регистрации классов окна "AtlAxWin80" и "AtlAxWinLic80" плюс несколько пользовательских сообщений окна. (ATL - Active Template Library - Это библиотека классов и шаблонов, предназначенная для разработки собственных компонетов ) classid - при вставке flash это константа и всегда имеет значение clsid: {D27CDB6E-AE6D-11cf-96B8-444553540000}, это значение указывает на элемент ActiveX : \WINDOWS\system32\Macromed\Flash\Flash11e.ocx AtlAxGetControl - Получает указатель интерфейса IUnknown элемента управления, который хозяйничает в окне. Вот комплект-пример : |
Всем доброго времени суток!
У меня к Вам следующий вопрос - мне нужно при установке программы дописать/вписать свое значение в ключ реестра. Вся проблема в том, что до меня уже может быть несколько записей, и мне нужно определить есть ли запись в ключе реестра. Если запись уже есть, то мне нужно дописать свой путь к программе. Также возникает проблема с анисталом. Например: [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: Заранее благодарю! |
Цитата:
Цитата:
|
Шутку понял - смешно :)
С инсталом разобрался, а как быть с анисталом не разобрался :help: Можете привести пример? |
Erik Pilsits написал хедер GetFolderPath.nsh, который позволяет получить путь к предопределённой папке в ОС
Используются функции SHGetFolderPath (для WinXP) и SHGetKnownFolderPath (для Vista и выше) и ряд констант и ID для папок. С этими функциями можно конечно получать пути и обычным образом. Например, для COMMON_APPDATA : Код:
OutFile "GetFolderPath-test.exe" Для XP получение пути интереса не представляет, т.к. практически все переменные предопределённых папок, уже есть в самом NSIS. Разве что, как альтернатива получения пути. А вот для Win7 и 8, где большое разнообразие специализированных папок, может пригодиться. Вот комплект-пример : |
Для разнообразия оформления прогрессбара, существует занятная библиотека - SkinProgress.dll, использующая цвета из внешних bmp файлов.
Код:
!AddPluginDir ".\" |
не компилит
+ 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 |
Цитата:
line 8 в скрипте - это !define /math PBM_SETRANGE32 ${WM_USER} + 6 описано в http://nsis.sourceforge.net/NsDialogs_FAQ |
Цитата:
поэтому ошибка! В 3 версии NSIS добавлены много констант в хедер WinMessages.nsh |
Цитата:
И Nsis я испольтзовал v2.46... Цитата:
|
всем привет я хотел бы установить разные изображения в welcomepage и finishpage. и еще я хочу чтобы файлы для компиляци добовлять сразу одной папкой все файлы и подпапки как в inno setup с флагом ignoreversion recursesubdirs createallsubdirs , помогите пожалуйста , заранее спасибо .
|
Mafioza, а мы хотим, чтобы вы наконец-то хотя бы открыли наш Справочник по NSIS
|
K.A.V. вот я его отркрыл несколько раз но не нашел если вам не трудно не могли бы вы быть любезным и написать его здесь ?
|
Цитата:
Цитата:
Насчет разных изображений точно сказать не могу, вроде бы здесь как-то описывали, как сделать 2 разных изображения (может кто и подскажет, либо ищите поиском по теме), но втыкнуть одно изображение и в "Приветствие" и в "Финишь" страницы можно, путь к страничке я указал, читайте там. Цитата:
Раз вы даже не знаете, как добавить файлы для упаковки, читайте полностью описание всех команд, ибо тыкать вас постоянно в справочник здесь никто не будет, мы здесь помогаем, а не делаем всё за вас И в описании команды File, обратите внимание на команду SetOutPath, она задаёт, в какую папку будут распаковываться файлы Так же, прочтите страничку Переменные NSIS (Variables) |
Цитата:
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "2.bmp" |
Цитата:
Нее, я имел ввиду тот случай, когда при инсталляции используются разные изображения в приветствии и на странице финиша :) |
vahe-91, есть кнопка "Удалить" в твоём комменте.
|
Попался такой код : Комбобокс-список выбора диска
Код:
!include "MUI2.nsh" |
Какое сжатие использовать, чтобы файлы из инсталлятора нельзя было вытащить при помощи 7-zip и прочих архиваторов?
|
Цитата:
А если уж так беспокоит неприкосновенность файлов в самом инсталляторе - засунь их в любой запароленный архив. И извлекай файлы при инсталляции - командой разархивирования с паролем. Ну и запуск инсталлятора также сделай с паролем... |
Цитата:
Awral, могу оказать Вам медвежью услугу по Вашему вопросу, так как один "горе-программист", специально для подобных случаев, произвел на свет программульку. http://mpc-build.googlecode.com/svn/...xexecute-hide/ http://mpc-build.googlecode.com/svn/...de/0.6/xeh.exe Описание от автора программульки: Цитата:
То, что делает эта программулька (меняет кое-где AD на 7E), можно сделать с помощью NSIS. При этом, намного эффективнее и без посредников! :) Всего-то, используйте свой оригинальный сценарий или задействуйте версию NSIS, ниже 2.0! При выборе последнего предложенного варианта, перед всеми нами, очень скоро, может возникнуть проблема по поиску старых версий NSIS! :) P.S. Я не призываю пользоваться программулькой, а наоборот, являюсь ее "противником", так как подобные задачи решаются с помощью NSIS, без посредников! |
Доброго времени суток, кто подскажет по сообщению http://forum.oszone.net/post-2104519-323.html
Никак не могу понять в чем соль... |
Цитата:
а то, получается несвязно - ребутом прерывается внезапно.. поэтому все команды следует функции переносить в непосредственно во время установки.. |
Тоесть получается, что нельзя сделать перезагрузку именно из функции нажатия бутона, а надо пихать Reboot в секцию установки...но мне это не подходит...хотел именно так...
Как же посоветуешь выйти из ситуации kotkovets, или можно что то придумать? |
diakov,
Если я правильно понял, то раз после нажатия OK сообщения, сразу предполагается Reboot , т.е. по сути, сначала закрытие-выход инсталлятора, а затем уже Reboot - то можно закрыть инсталлятор после нажатия ОК и после закрытия, организовать Post функцию с Reboot и с условием, что был нажат нужный ОК. А вот для этого условия могут быть варианты... |
Цитата:
Цитата:
|
diakov,
Самое простое, если устанавливается драйвер, то в TEMP ещё помещается и маркерный файл (предположим пустой файл - drv) и исходя из его наличия совершается нужное действие (перезагрузка) после закрытия инсталлятора. ( Нет маркерного файла - нет перезагрузки. ) Код:
!include "MUI2.nsh" Наверняка можно и по другому сделать. |
MKN, немного не то, мне надо что бы перезагрузка происходила именно после выполнения всех команд в функции нажатия бутона, пробовал писать Quit, Abort и т.д. не помогает инстальник не закрывается, как сделать это именно в функции что бы он закрылся?
Если воспользоватся командой ${KillProcess} то инстальник убивается но ф-ция .onGUIEnd не отрабатывает. |
diakov,
Вызови функцию из функции или ещё откуда : Код:
Section |
MKN, ну вот допустим так:
Код:
Function ClickButton1 Можна тупо написать автоитовский скрипт и сэмулировать нажатия на кнопки, но хочется средствами нсис... |
Цитата:
здесь винда, вот на помощь и идет апи.. завершить процесс можно и плагинами или читая наш справочный материал. зы. но внезапное прерывание не выгружает плагинов загруженные нсисом.. это я в скрипте вижу - BrandingURL |
kotkovets, так какой выход посоветуете из ситуации?
|
diakov,
как алкоголь 120% установку видели.. вот точно так можно.. что тут сложного.. в установку все перенести ps. или отдельно написать установку драйвера (на nsis) - кнопкой тупо запускать установщик ( в тихом режиме).. |
Ок, буду кумекать.
|
Цитата:
На кастомной странице Quit точно отрабатывается в Section. И в Function, вызванной из Section - тоже нормально. Ну и до кучи проверил - в Function вызванной из Function - нормальный Quit выход-закрытие. |
MKN, так, или я чето туплю:
Код:
Function ClickButton1 Склоняюсь ближе к совету kotkovets, на счет написать отдельно инстальник драйвера... |
diakov,
Вот мой код : Код:
!include "MUI2.nsh" Возможно можно работать и с несколькими секциями, но наверное придётся манипулировать с их флагами... Кстати, этот вопрос уже поднимался http://forums.winamp.com/showthread.php?t=140929 Но чем закончилось - не понятно... |
Вышел из ситуации написав отдельный ехе-шник по установке драйвера, по совету kotkovets.
|
Добрый день!
Необходимо до самого инсталляционного пакета показывать окно типа: "Установить обновление". С кнопками установить и отменить. Делается веьсма просто пишется exe файл из которого пускаем NSIS инсталлятор. Но возможно ли непосредственно в cамом NSIS инсталяторе написать такое. т.е первую страницу? Подскажите куда копать. |
Добрый день!
Раньше я получал $StartMenuFolder так Цитата:
|
Никак не разберусь, можно ли как-то обойти ограничение в 2 Гигабайта при создании инсталлятора?
Видел, что можно использовать архивы, но во-первых, не понял как это сделать (примеров не нашел), во-вторых, давнишние сообщения, возможно к настоящему времени есть более интересные решения? Если не сильно затруднит, попрошу развернутый ответ, с примером написания кода, или ссылкой на таковой пример. |
Появилась небольшая проблема. Растянул HEADER_BITMAP на всю ширину (в файле Contrib\UIs\modern_headerbmp.exe). Чтобы текст не заходил за изображение исправил очерёдность инициализации и установил прозрачность фона для Header.Text в файле Interface.nsh:
Код:
!macro MUI_GUIINIT_OUTERDIALOG UNINSTALLER 1. При переходе с Welcome_PAGE на следующую страницу (в моём случае LicensePage, но это значения не имеет) текст не отображается, а начинает отображаться только со страницы, следующей за LicensePage (в моём случае ComponentPage). 2. При переходе с лицензии на компоненты и обратно появляется наложение предыдущего текста на текущий. При последующих переходах наложение только увеличивается. Как мне исправить эти проблемы? Заранее спасибо |
Цитата:
Перед показом страничек, добавь выполненение нашей будущей функции Код:
; Welcome page И добавь эту самую функцию: Код:
Function SetTransparentText |
Добрый день.... Есть хотелка обращаться к файлам в определенной папке, как к массиву.
Цель хотелки: сделать так, чтобы на экране отображались радиокнопки где можно было выбрать нужный архив и разархивировать его. Если со второй частью вроде понятки есть в голове, типа создать цикл и засунуть туда радиокнопку... а может я и неправ, но вот с первой частью - облазал всё, то ли запрос неверно составляю... в справке по locate в т.ч. на русском не нашел как выделить файл, имя которого не известно, из папки. Спасибо! Надеюсь на ответ! |
ИМХО это проще на Си/С++ реализовать. Получается ищем в определенной папке файлы, выводим их на экран в виде списка, далее формируем строку для распаковки и запускаем её. И я бы вместо радиокнопок сделал бы листбокс, красивее выглядит :)
Такое можно и на NSIS но это уже к гуру |
Цитата:
ну так и задавайте поиск по этой маске.. Цитата:
Код:
Intop $0 $0 + 1 естественно с помощью плага заносим в массив. |
Может кто-нибудь сталкивался с задачкой, когда нужно заблокировать вторую (третью, четвертую и т.д) копию запущенного инсталлятора, пока не будет завершена первая?
|
Цитата:
Код:
!include "MUI2.nsh" |
Второй день, как пытаюсь освоить NSIS (v2.46, Win7(x64)Ru) и, сразу же застрял, казалось бы, на ровном месте.
Не могу настроить отображение описаний компонентов, вернее одного, при деинсталяции. Не подскажете, что не так? |
Kopejkin, нормальный скрипт в студию..
|
В скрипте много "мусора", который используется для запоминания и пояснения (для меня), а также кусков чужих скриптов.
|
Kopejkin,
Для секций удаления применяется тот же макрос, но с приставкой Un Код:
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN ----- p.s Скрипт выделяется и заключается в тег: # невозможно по-человечески прочитать... |
Спасибо kotkovets.
Сообщение отредактировал. |
Добрый день!
Подскажите пожалуйста как добавить свою кнопку на стандартную страницу компонентов. Добавил следующий код, но кнопка рисуется только на первой странице. Заранее спасибо. Код:
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc" |
|
Частично разобрался. !define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc" нужно ставить перед страницей которую кастомизируешь. Но... вопрос остался. При добавлении кнопки таким способом инсталлятор зависает на странице компонентов.
Предположения? |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Ну вот скриптик упрощённый для примера. На странице приветствия кнопка рисуется, а если закомментировать/убрать строку !insertmacro MUI_PAGE_WELCOME, то на странице компонентов кнопка не отображается. Правда тут инсталлятор не зависает.
Код:
|
K.A.V., большое спасибо за развернутый ответ!
Цитата:
|
Почитал форум. Похоже что править стандартные страницы можно только при помощи системных функций. Ребят, киньте плиз ссылочку на документацию по системным функциям
|
Вложений: 1
Нашёл решение в виде Button.dll Но возникла небольшая сложность. Кнопка работает только в нижней части экрана. А если скажем изменить координату Y на 200, то уже не работает. Нужна помощь!
Код:
|
Цитата:
|
Для патча использую плагин VPatch, который выводит в протокол свои сообщения (DetailPrint).
В сценарии примера имеется только одно из них. Можно ли как-то локализовать остальные сообщения? Код:
; Update the file - it will be replaced with the new version |
Привет народ, :)
Требуется небольшая помощь с определением Осей в инсталляшке. Задача: Если Ось ХР и разрешение экрана выше чем: 2048 пикселей, - установить один файл в указанный каталог. Если Ось Виста, Севен или Осьмушка, и разрешение экрана выше чем 2048 пикселей, установить другой файл в указанную директорию. Номера, битности и прочее значения не имеют.. За примерчик с описанием был бы очень благодарен. Зы, Использую, версию юникод - 2,46,5, если что. |
В Справочнике по NSIS есть два уже готовых примера: "Определение операционной системы" и "Определяем и меняем разрешение экрана". Подгоняйте под свои потребности.
|
MKN, в твоём примере 3 Использование функции CreateWindowEx для создания кнопки кнопка работает только в верхней и нижней части экрана. Если ты изменишь координату Y на 100, она уже не работает. Что странно, ведь ты создаёшь кастомную страницу, а мне тут писали что перекрывается стандартными контролами, потому и не работает. Я правда правлю стандартную страницу (components page)
|
можно ли чтобы при запуске созданного установщика с ключом , выполнялся определённый файл?
а при обычном запуске , все распаковывалось в временную папку и запускался определенный файл2 (все файлы внутри установщика) всё должно быть скрыто от глаз пользователя |
Цитата:
Теперь другие вопросы появились, ибо нигде не увидел инфы или какого либо вразумительного описания, на те или иные моменты в создании инсталлера под Вин8. Собственно, как Нсис с ней работает, нормально или не поддерживает вообще? Из справки ув. КАВа, плагин как я понял её не определяет, а есть ли обновление для определения этой ОС?! Ну, и любой примерчик по созданию инсталлера и определению этой версии Оси пригодился бы... Собственно задача моя простая, сделать инсталляшку для Осей: (ХР), (Виста, Севен) и (Осьмушка). При установке определяется разрешение экрана, после его определения в зависимости от ОС, устанавливаются те или иные исполняемые файлы, на ту или иную версию программы... И т.д.. Зы, При условии что ОС 8 стоит особняком от остальных Осей. Цитата:
Второе не проблема, Прописываем в скрипте сверху, например: !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 Вроде все... |
Скажите пожалуйста можно ли заблокировать процесс на время установки если да то как?
|
Можно, смотри справку по Нсис, в части:
Примеры кодов: - Работа с процессами с помощью NSIS Ссылка на справку в шапке темы. Хотя нет, тебе же заблочить процесс надо, а не закрыть, скорее всего нет. Хотя может кто и подскажет вариант... |
Цитата:
(читайте поновее способ от kotkovets) Код:
!include "WinVer2.nsh" У Windows 8 => 6.2 --- Цитата:
Перевод справки NSIS => GetOptions: обрабатываем значение ключа в параметре запуска инсталлятора + Перевод справки NSIS => File: Добавляем файлы в инсталлятор Перевод справки NSIS => Exec: запускаем приложения Перевод справки NSIS => ExecWait: ждём завершения исполнения приложения --- Цитата:
А если речь идёт об управлении сторонним процессом, то лично я вам тут не помогу (максимум, что можно сделать - убить процесс, а потом в нужное время запустить) |
Цитата:
заведи с ключом /key .. Код:
!include "FileFunc.nsh" нужно сбрасывать флаг ошибки командой ClearErrors |
K.A.V,
Ай спасибки камраден. :) Цитата:
Зы, Побег тестить примерчики... :) |
Да, речь идет о стороннем процессе. А можно сделать так - если процесс запустился то сразу его убить? И при этом чтобы инсталлятор продолжал работать
|
Я же написал, скачай справку и в ней прочитай в указанной статье, там есть пример по убиению запущенного процесса. + там-же будет ссыль на требуемые файлы в работе.
Впрочем: Весь текст по этой теме из нее. |
Привет народ, :)
Очередной вопрос появился и понять не могу, это мой косяк или Нсисовский... Имеем: - для инсталляции 4 версии файлов + либы, в зависимости от ОС для определенной программы. Код установки простенький, привожу только кусок самой установки файлов для определенного языка программы и под конкретную ОС: Размер для файлов в среднем такой: file.exe - 9 МБ file-2.exe - 12 КБ Library-1.dll - 150 КБ Library-2.dll - 80 КБ (ставится отдельным макросом в зависимости от разного назначения) Вроде как, инсталлер правильно определяет размер всех файлов в совокупности включенных в компиляцию инсталлера. Вопрос в том, почему при выборе только одной секции из 4 возможных, он указывает в поле: "Размер устанавливаемых файлов", число, соответствующее сразу всем файлам включенных в инсталлятор - 59 МБ. :o А не конкретно тех, которые отмечены к установке, в которой будет от силы - 10 МБ... ?! Зы, Сижу под Юникодом. :) Зы-зы, В догонку вопрос по Win8-Blue: В вики пишут что ядро у нее: Цитата:
То что выдается плагином по определению версии, это - 6.2. Картинко: http://yadi.sk/d/VGPlu9Ee7xand На скрине видно что у Оси версия - 6.3, а инсталлер выдает старый номер. Где в ней откопать этот номерок чтобы по нему сверятся, ибо пока, тут ничего не понятно.. Или может мысли какие есть ?! |
Цитата:
проверь под winver.nsh: Код:
${WinVerGetMajor} $1 ;старшая цифра версии win может быть библиотека kernel32.dll прежней версии осталась (оттуда берутся данные) если все совпадает - звиздят...:) |
Вложений: 1
Подскажите, пожалуйста, почему могут плохо переключаться компоненты?
"Эффект" проявляется после добавления кода, выделенного красным. Т.е. компоненты переключаются, но можно выбрать сразу два. Если переключить их несколько раз, работоспособность восстанавливается - как будто что-то удерживает состояние выбранного компонента (не соображу, как правильно сформулировать). Причем проявляется не сразу, а только после возврата с кастомной странички, например, для выбора другой версии файла. Приложен архив с эти сценарием. При наличии указанных в !include файлов, можно скомпилировать и посмотреть. P.S. Я так понимаю, что ProcessFunc.nsh пока несовместим с NSIS 3. Цитата:
|
kotkovets,
Привет народ. :) Цитата:
Это баг в API, конкретно в функции GetVersionEX. Она сообщает версию 6.2 и билд 9200. ![]() ![]() ![]() Для Win8-Blue правильная версия - 6.3. Зы, Есть что ни будь по моему вопросу выше, о непонятках с размером устанавливаемых файлов ?! |
Цитата:
потому что макросу радиобутон изначально от чего то нужно переключать секции, а когда с нечего начать... 1. а именно делаем секцию отмеченную в зависимости от выбранного языка (это сильно упрощает код) 2 много лишних действий с определением разрядность оси, она уже определена в макросе ${WinPlatformArchitecture} т.е в переменной $5 значит нужно изымать лишниие функции... ну примерно так: Цитата:
|
kotkovets, спасибо большое! :up
А я все никак не мог сообразить, как привязать компонент к выбранному языку установки. |
Цитата:
В его сборках много всяких правок оригинальных косяков и прочих полезностей.. Сам жду, чтобы на троечку переехать с ее вкусняшками... :) Цитата:
|
Цитата:
http://yadi.sk/d/p-Uquod_821WI |
Сразу раскаталась губа (моя) :)
А в 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 --------------------------- ОК Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата kotkovets:
Код: » работает хорошо но при запуске с ключом выполняются и то что должно быть при запуске с ключом и то что должно быть только при обычном запуске вопрос как сделать чтобы при запуске с ключом выполнялся только код прописанный именно для запуска с ключом а при обычном запуске только код для обычного запуска след вопрос как сделать чтобы программу сделанную с nsis невозможно было открыть архиватором след вопрос нужно скопировать файл "comp.ini" из %temp%\spacep в директорию с прогой после копирования посмотреть появился ли "comp.ini" в директории с прогой если непоявился то копировать "comp.ini" из %temp%\spacep в %appdata% |
Цитата:
Код:
!include "FileFunc.nsh" Код:
Strcpy $1 "$CMDLINE" "" -4 ;берем из $CMDLINE последние 4 символа и заливаем в $1 Цитата:
Цитата:
--- читать нужно тему. а не листать.. |
Цитата:
ну в частности как копировать разобрался: CopyFiles /silent "$EXEDIR\comp.ini" "$INSTDIR\" а вот как Цитата:
след вопрос можно ли сделать чтобы при обычном запуске инстала файл не распаковывался, а при запуске с ключом распаковался? |
Цитата:
Описание команды IfFileExists читали в файле справки? Цитата:
Цитата:
|
Привет народ,
Подскажите плиз, номера кодовых страниц для этих языков: ${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 |
K.A.V.,
Сейчас буду смотреть оно или нет, ибо в ютф не все так однозначно. И как я про ланги забыл... ))) Зы, Все пытаюсь прикрутить текстовуху лиценза на разных лангах, и все никак. Все прочие работают нормально, а эта зараза... |
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" ... Мысли есть какие на этот счет ?! |
MaGoth, прочитай про команду LicenseLangString в оригинальной справке к NSIS
Цитата:
|
Да блин, я уже все что можно перепробовал, не работает эта команда, как впрочем и многие другие в попытке изменить файл... :(
|
Цитата:
Показ файла лицензии в зависимости от выбранного языка, то бишь от переменной $LANGUAGE Здесь работает принцип подмены файла лицензии, в функции перед показом странички лицензии. Для времени компиляции удобно воспользоваться файлом ${NSISDIR}\COPYING - не стоит путь менять без надобности, если нет файла создаем файл COPYING (не пустышку!!!, хоть с одним символом) в папке, где установлен NSIS. По скрипту файлы лицензии лежат рядом со скриптом, в противном случае указываем абсолютные пути или пути относительно скрипта к файлам лицензии. |
У инсталятора есть дополнительно к тихому режиму (ключ /S) еще сделать выбор русского языка из списка при тихой инсталяции. Получается сначала нужно выбрать язык, потом программа устанавливается в тихом режиме, софтина - Raidcall ? Пробовал с ключом /1049 - не срабатывает, окно выбора языка появляется.
|
Вложений: 1
Цитата:
Держите готовый код, самый простой способ с файлом лицензии, в зависимости от языка |
Цитата:
Код:
Function .onInit Цитата:
http://forum.oszone.net/post-2205311-469.html Значит можно принудительно менять язык установщика через ключи: http://forum.oszone.net/post-2204336-465.html Код:
|
kotkovets,
я не пытаюсь сделать свой установщик, есть готовая программа - Raidcall, мне просто нужно, чтобы на клиентских компах по сети она устанавливалась в скрытом режиме без окон о выборе каких-то действий. Она при запуске с ключом /S выдает запрос какой язык использовать. Мне нужно, что бы вообще ни чего не спрашивала, а сразу установила русскую версию. |
Цитата:
|
kotkovets,
Цитата:
K.A.V., Цитата:
Но немного изменив код, удалив ненужные строки получилось его скомпилировать... :) |
Цитата:
Хотите сказать, мой код у вас не компилировался и файлы лицензии не показывались в зависимости от языка? Если вы пытались накидать содержимое моего примера в свой скрипт, и при этом у вас не сработало, значит ошибка с вашей стороны Я дал вам готовый, полностью рабочий код, могу дать и откомпилированную версию для примера |
Цитата:
В чистом виде ваш скрипт скомпилится, но при добавлении его кода в мой инсталляционный файл уже нет. Проблема была вызвана несколькими причинами: 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" Зы, Да, чуть не забыл. Возможно, что ещё проблема в самих плагинах была, они у меня все были изначально, но один из них имел старую версию сборки, стянул поновее, с оф. форума Нсис в теме автора... |
Возникла такая проблемка. Делаю кастомную кнопку About на странице компонентов. Нужно чтобы эта кнопка была только на этой странице. Так вот при нажатии Back на странице компонентов возвращаемся на страницу директории и кнопки действительно нет. Дальше происходят чудеса. Нажимаем Next и снова Back и кнопка About сияет на странице директории. Как это можно победить? Сорри если такой вопрос уже был
Код:
|
Цитата:
Код:
System::Call 'user32::CreateWindowEx(....,ir0,i0)i.R0' Код:
Function DirectoryShow |
Спасибо огромное ! Всё работает !!!!! :yahoo:
|
Есть ли способ вывести строку Space Available: на стандартной странице компонентов?
|
Цитата:
В твоём случае текст с информацией о свободном дисковом пространстве - на PAGE_COMPONENTS. Это можно реализовать так : Код:
!include "MUI2.nsh" А с этим надо определяться сразу же после запуска инсталлятора. О чем выводить соответствующее сообщение. PS Касательно кнопки на стандартных страницах... Пример был дан как пример, годный лишь для случая, когда ну позарез нужна кнопка именно на стандартной странице. А вообще это извращение... Как уже говорили ранее - кнопка нормально отображается только в верхней и нижней частях окна страницы. По центру она закрыта контролом области "поля-окна" стандартной страницы. А это, как оказалось, гадость ещё та (как и вообще, все стандартные страницы :) )... Можно изменить размер этой закрываюшей кнопку области либо в ресурсе, либо через системные функции. Но это получится гемор, не стоящий того... |
Огромное спасибо !!!
Суть в специфике программы. Юзер выбирает разные компоненты, от этого зависит требуемый размер. Поэтому и хотелось чтобы требуемый и доступный размер были на странице компонентов. А кнопку я решил внизу сделать всё-таки. Пока вроде работает :) MKN, спасибо за код! Единственное - не читает шрифт в строку Space Available. Буду кумекать |
tony1990,
Измени в GetDlgItem $1 $0 1027 - ID 1027 на 1006. Такой шрифт будет соответствовать тому, что на странице PAGE_COMPONENTS. PS 222 - это ID нашего, созданного на странице, окна с надписью |
Если щелкать мышью в "переключателе" справа от компонентов, а не по ним, нужный компонент отмечается, но цветной прямоугольник выделения остается на компоненте, ранее выбранном щелчком по нему.
Можно ли вообще избавиться от выделения цветом? ![]() Переключатель компонентов с выделением активного жирным шрифтом. |
Привет народ, опять я с неожиданной проблемой... :)
В скрипте имею 8 языков. Все было нормально и проблем никаких, до тех пор пока не добавил чешский. Появилась проблема, и откуда у нее ноги растут тоже не совсем понятно, хотя догадываюсь что где-то в ресурсах самого Нсис зарыта, в той части которая рулит лангами... Суть проблемы в том, что у созданного деинсталлятора после инсталла и его запуска секция - "итальянская" накладывается на "чешскую" именем, т.е. вместо: ... Деинсталлировать итальянскую версию. Деинсталлировать чешскую версию. ... Выводится: ... Деинсталлировать итальянскую версию. Деинсталлировать итальянскую версию. ... При наведении курсора мыши на секцию, обе секции отображают правильный текст для лангов указанных версий. В самих секциях тоже все ровно: Картинко: ![]() Сверху секции при установке, снизу деинсталл.. Собственно сам вопрос, в каком файле надо порыться чтобы это поправить?! Зы, проверил на других лангах инстал и деинстал, пара - чешский итальянский глючат везде при деинсталляции... |
Цитата:
Цитата:
|
Цитата:
Но, в то же время, в коде ранее предложенным kotkovets, (это где кнопка ДАЛЕЕ не активна пока не будет выбран 1 из компонентов ) - такого эффекта нет... Повторю этот код : Код:
OutFile "example.exe" |
Цитата:
На всех этот эффект есть. Цитата:
![]() Еще вопрос по NewAdvSplash. Указано, что можно воспроизвести *.mp3 и *.wav. WAV воспроизводится без проблем. а вот MP3 - нет. Связано ли это с тем, что у меня не установлены никакие кодеки, кроме тех, что устанавливаются вместе с системой? Еще ни разу не ощутил в них потребности, т.к. использую VLC Player. Если нужно чего перекодировать - Format Factory. Насколько я понимаю, эти программы используют свои кодеки автономно. |
Цитата:
Цитата:
|
Цитата:
|
Подскажите пожалуйста решение для такой задачи :
Необходимо определить тип файла у файла лишённого расширения. (такие файлы часто образуются при скачивании, часто встречается не правильное расширение у видео и у графики) Также необходимо узнать название продукта у исполнямых exe-файлов не зависимо от их имени - blabla.exe ( в свойствах файла это - "Название продукта" ) Каким образом с помощью NSIS извлечь из файлов эту информацию ? Предполагаю, что для этого можно использовать функцию System::Call `shell32::SHGetFileInfo (или SHGetFileInfoA ) совместно с флагами SHGFI_TYPENAME (0x000000400) SHGFI_EXETYPE (0x000002000) SHGFI_DISPLAYNAME (0x000000200) Но как ? |
Цитата:
Цитата:
Читать файл нужно с помощью команды: FileReadByte побайтовое чтение файла с заданным смещением.. получили сигнатуру и сравниваем... например архив rar имеет сигнатуру rar! в начале файла ( FileRead ) но потом нужно отсечь лишние символы - оставить первые 4 символа или 4 байта в двоичном ввиде через ( FileReadByte ) |
Цитата:
Тогда такой вопрос - если использовать знаменитую утилиту TrID - File Identifier ( http://mark0.net/soft-trid-e.html ) , то каким образом перенаправить содержимое из окна консоли в , скажем, текстовый файл, для дальнейшей обработки ? |
Цитата:
пример на архиве 7z: Код:
outfile test.exe Цитата:
Код:
trid -> text.txt |
Цитата:
|
Цитата:
я сам только сейчас узнал сигнатуру 7z, exe - начало (первые 2 байта) всегда одинаковые... более сложных случаях рекурсивно.. как программка ранее.. |
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 счисление ? Но тогда именно на него и надо ориентироваться... Как его считать из файла ? |
Цитата:
Цитата:
[37 -->= 55] [7А --> =122] , что равно ASCII = 7z --- NSIS выводит "байт" в десятичном виде например, конвертация 16-ричное число в десятичное, десятичное в ASCII Код:
IntFmt $1 "%i" 0x37 ;16-ричное число в десятичное Код:
IntFmt $3 "0x%X" 122 |
Возвращаясь к вопросу о выводе строки Space available: на стандартной странице компонентов. Всё работает на ура до тех пор пока не начинаешь выбирать эти самые компоненты. Тут видать страница обновляется и созданная нами надпись про доступный размер на диске исчезает. Похоже, это нельзя обойти . Ежели только в исходниках нсиса не копаться. Да и то не поможет наверно.
|
kotkovets,
Благодарю за разъяснение. ps На winamp.com , один добрый пользователь даже код-хедер подарил... Наверное корректно будет приаттачить его здесь ? |
Цитата:
ради пары строк - целый хедер.. :) |
FTID.nsh - signature-based file type identification
автор aerDNA Только что автор что то пофиксил : |
Цитата:
|
Цитата:
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, подскажет... |
Добрый день!
Возможно ли использовать одну и ту же функцию для install и deinstall секции Есть функции BASE64 Encoding/Decoding Functions здесь Но как их заставить работать для деинсталл секции |
Цитата:
|
В том то и дело, что нельзя
|
Цитата:
Цитата:
Цитата:
Цитата:
Подсказка: ищите в скрипте слова, которые появляются в сообщениях при запуске программы удаления |
Вызов стандартного диалога выбора каталога/файла (принтера/компьютера) c помощью функции SHBrowseForFolder
Полезно при работе со стандартными страницами для обзора до или после установки и при помещении кнопки обзора на любой странице. (Есть конечно Dialogs plug-in, но в нём нет некоторых моментов, доступных при оперирировании флагами функции ) Код:
OutFile "SHBrowseForFolder_test.exe" Флаги 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, в виде плагина... |
Цитата:
Код:
!include "MUI2.nsh" |
Цитата:
В приведённом примере ведь всё на месте и никуда не исчезает. Либо измени размер 1023, либо смести своё окно-надпись в свободное место. Те же грабли , что и с кнопкой... |
Эффект "кругов на воде" на BMP рисунке.
Получается с помощью инносетаповской waterctrl.dll и следующего кода : Код:
!AddPluginDir ".\" |
Эффект пламени на BMP изображении
Для эффекта используется инносетаповская firectrl.dll. Т.к. пламя какое то бледненькое, лучше использовать WizModernImage-Is.bmp светлого цвета. Код:
!AddPluginDir ".\" |
Положение окна 1023 получается регулировать, но вот его размеры нет. Меняю параметры, идущие за положением - на размеры окна они не влияют. Хотелось бы поместить всё-таки строчку о доступном размере на стандартное место, дабы не контрастировать с предыдущей страницей директории
Код:
|
Цитата:
Код:
System::Call "User32::SetWindowPos(i$R5, i0, i0, i180, i150, i15, 0x0004)" Также по хорошему, надо , сделать привязку к базовым единицам, чтобы при ином разрешении экрана, выбранные координаты не уехали... (А может и не обязательно... ) Гемор одним словом. Не проще ли подправить размер окна в ресурсах ? |
Да. Изменение размера окна в ресурсах оказалось самым оптимальным решением. Подправил. Супер!
В связи с этим возникла идейка что наверно можно и стандартную надпись про доступный объём на диске поместить на страницу компонентов, используя те же ресурсы. Код в ресурсах добавил, но вероятно надо править в исходниках ещё. Вообще реально ли это сделать? |
Добрый день. Есть ли возможность получить в переменную командную строку запущенного процесса GetCommandLine?
|
Цитата:
использование макроса: Код:
${CmdProsess} "пид процесса" "$var" $var - переменная, где находится командная строка запущенного процесса |
К слову о процессах. Можно извлечь в переменную, командную строку (полный путь установщика) для текущего процесса, альтернативно функции из справочника :
Код:
System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1' Код:
System::Call kernel32::GetCommandLine()t.r0 |
Цитата:
Код:
MessageBox MB_OK "$CMDLINE" |
kotkovets, Добрый день. Позволю себе в третий раз задать тот же вопрос. Видимо, вы не видели предыдущие... Вы, как-то, намеревались написать библиотеку для работы с окнами приложений. Что-нибудь есть подобное? Хотелось бы кликать на объекты формы по координатам и т.д.... И на чужой форме создавать всплывающие подсказки.
|
Цитата:
Цитата:
как то так.. |
Цитата:
А зачем тогда в справочнике пример с GetModuleFileNameA ? Если для общего развития, то понятно. Тогда и GetCommandLine сгодится. Хотя получается, что место им в разделе : "А здесь не ищут лёгких путей" :) И ещё о получении пути запущенного процесса, как альтернатива твоего замечательного ProcessFunc.nsh. Есть ещё хедер некоего Erik Pilsits - Process Functions Header. Делает вроде как то же самое, только с маленьким огрехом, упомянутым неким poofeg в своём блоге : Цитата:
По поводу кликанья по объектам... Меня давно интересует функция GetCapture, которая извлекает дескриптор окна , который захватила мышь. А также как регистрировать слик мыши для управления событиями ? Но не знаю как это приспособить в NSIS. Не приведёшь пример ? |
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
kotkovets,
Жаль, что system плаг никто до сих пор так и не усовершенствовал... |
Вызов окна "О программе"
Вызывается стандартное окно Windows - "О программе" Код:
!include "MUI2.nsh" ps Интересует, как лучше разместить это окно, в центре экрана, не зависимо от разрешения ? |
|
"Шкурный вопрос" или об оформлении 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" Вот вариант кода с прозрачной страницей и возможностью поместить на странице фоновый рисунок : |
"Шкурный вопрос" или об оформлении NSIS инсталлятора с помощью Skin_ов. Продолжение.
Дополнительные стили для SkinH.dll : Скачать : http://www.mediafire.com/?q5lk80vd7ivf9ob Стилей в сети много, но почти все они на китайских ресурсах, откуда скачать их затруднительно (надо регистрироваться, иногда вводить капчу иероглифами и пр.).. :) Если кому удастся скачать ещё стилей - выложите пожалуйста здесь . Но пожалуй, самая простая и удобная в применении - это библиотека Skin.dll. Не требует доп файлов-стилей. Тоже от китайских умельцев. Скачать : http://www.mediafire.com/?1g2idooxhm2713i В зависимости от выбранных инструкций и параметров вызова DLL, можно получать разнообразные результаты. ( Но не со всеми инструкциями я разобрался... Кто владеет китайским, может меня дополнит и поправит... Оригинал док в архиве ) ) Код:
!include "MUI2.nsh" |
Добрый день, господа. Можно ли средствами NSIS определить размер памяти, занимаемой другим процессом?
|
Цитата:
(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 ) . А это уже просто строчные операции... |
MKN, Спасибо... Посторонними утилитами не проблема, хотя-бы через tasklist и дополнительный файл... Хотел, именно , средствами NSIS, если возможно... Было бы изящно :)
|
Может кому интересно будет. Редактор стилей SHEditor v0.2 b5 (русская версия) для файлов скинов *.she: скачать.
Цитата:
Цитата:
|
Цитата:
Цитата:
|
ну почему ${WinVersion} (плагин WinVer2) в Windows 8.1 в одном скрипте возвращает 6.2, в другом 6.1 ? :sorry:
|
Цитата:
до финала может любые цифры выдавать... потому что не финал.. |
Цитата:
Оказалось, что он запускает файл в режиме совместимости Win7 :dont-know странно, я эту галку точно не ставил. |
Таймер обратного отсчёта на кнопке MessageBox_а
Как то эту задачу уже решали с помощью специальной DLL, что не удобно и лишено гибкости управления... Но есть и другой способ, с помощью nsWindows плагина ( http://sourceforge.net/p/ifififi/code/HEAD/tree/ ) : Код:
!include "nsWindows.nsh" !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, Спасибо, что не забыли мою просьбу! Да, это решение трудно назвать изящным :), думал будет не больше двух строк...
|
Цитата:
|
Продолжая вопрос скинизации, нашел у китайцев еще 30 скинов *.she и просмотрщик стилей SHEViewer. Собрал в кучу ранее выложенные здесь скины и русскую версию SHEditor: СКАЧАТЬ.
Если у вас будут новые (другие) файлы стилей, просто добавьте их папку "Skins" и SHEViewer подхватит их автоматически. Скриншот SHEViewer: ![]() MKN, если не трудно, дай пожалуйста ссылки на ресурсы с наборами стилей, может мне удастся пополнить нашу коллекцию. По поводу переименования файла стиля в skinh.she ты был прав, я ошибся, прошу прощения. Это имя стиля зашито в библиотеке DLL и используется по умолчанию. Если надо использовать другой стиль, то нужно переименовать файл, или использовать функцию SkinH_AttachEx для загрузки стиля с другим именем. |
Цитата:
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 |
Здравствуйте. Такой вопрос- можно ли сделать проверку символов в пути устанавливаемой программы? Например проверить чтобы в нем небыло пробелов, если есть- abort. Такое возможно?
|
Цитата:
|
Можно пример, как скачать файл силами плагина System.dll
|
kotkovets, ну например программе нужно для работы чтобы в пути не было русских букв.
|
Цитата:
|
Цитата:
|
Цитата:
Вызывай нужные 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 |
Цитата:
задать к примеру жесткую установку к примеру: Код:
installdir "$PROGRAMFILES\PROGRAM_SOFT" 2) Можно фильтровать путь установки, таким методом фильтрации и сравнения длины строк: Код:
!include "WordFunc.nsh" |
Ещё раз про Skin_ы.
На skinse.com есть такой плагин - SkinSE NSIS Plugin. Позволяет "одевать" инсталлятор с помощью SkinSE_NSIS.dll, SkinSE.dll и SkinSE_QQ2009.zip (архив с графическими bmp элементами) Скачать SkinSE For NSIS : http://www.skinse.com/Download.htm |
kotkovets, есть ли обнова WinVer2.nsh c правильным отображением Windows 8 и 8.1 ?
И вопрос по редакциям Windows 7, существуют же не только N редакции но и K и KN как быть с ними? И как универсально распознать Home Basic независимо от издания (N, K, KN)? ProcessFunc.nsh недавно выложенная тоже не работает в самой последней версии :( |
Цитата:
Да и основное отличие от нормальных редакций - в отсутствии 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 Цитата:
А хедер от kotkovets (который в справочнике) работает ? ps Для разнообразия, последние летние WinVer.nsh |
|
Код программы "Font Viewer" :
(от китайских товарищей. Перевод гугловский, может быть не точен... ) PS после компиляции будет немного ругани, не влияющей на работоспособность. И похоже опять - из nsWindows.nsh... |
Информация об установленных жестких дисках.
Может быть получена при помощи спец. DLL и следующего кода : |
Не могу понять как использовать массивы nsArray или NSISArray:(((
Как это сделать? Может кто-то привести программку, которая сначала задает массив z[0]=a, z[1]=b, z[2]=c, z[3]=d, z[4]=e с последующей выдачей Код:
${ForEach} $i 0 4 + 1 |
Цитата:
|
Еще вопрос. Не смог понять и найти как задать размер окна в nsDialogs. Например где тут задавать? В мануале не нашел. Там только описание всяких операторов. Спасибо!
Код:
Function nsDialogsPage1 |
Цитата:
|
kotkovets, Не понял слово "ресурсы" в этом контексте, но правильно ли я понимаю, что невозможно в ходе программы размер окна поменять? Что же делать, если мне нужно создать окно то с 1, то с 10 полями, в зависимости от того, что выберет пользователь?
|
Цитата:
|
Цитата:
По-видимому nsResize мне подойдет, спасибо! |
Подскажите пожалуйста : как запускать NSIS инсталлятор в режиме "always on top - всегда поверх всех окон" ? Хотя бы одну страницу (но желательно сохранять этот режим для каждой последующей)
Пробовал так : не работает... И как бы сделать кнопочку-переключатель режима "always on top" - где нибудь в верхнем правом углу окна ? |
Цитата:
Нужно в функции иницилизации окна, когда окно есть, но его не видно.. :) Код:
!include "MUI2.nsh" |
1. Как завершить процесс, с помощью плагина System?
2. Как освободить dll-библиотеку от блокирующих дискрипторов? |
Limonica,
1. через справочник на русском.. 2. через reboot |
Цитата:
|
Цитата:
|
kotkovets, можете подправить WinVer2.nsh что правильно определяло редакцию на Windows 7, так удобно пользоваться...
|
Цитата:
|
kotkovets, заодно и ${WinName} для Windows 8/8.1 поправьте. А ${WinVersion} и в 8 и в 8.1 возвращает 6.2, но в 8.1 должно было быть 6.3
|
Цитата:
c:\windows\system32 , в C:\WINDOWS\ServicePackFiles\i386 и в c:\windows - опять же, по обстановке. Отключить защиту ( на время замены) можно в реестре : Код:
поменять значение [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon] "SfcDisable" Защищён ли файл , можно проверить с помощью функции SfcIsFileProtected - как то так : System::Call "sfc::SfcIsFileProtected(i 0, w R4) i.R0" каллбак в $R0 - если 0 - файл незащищен Также повсеместно предлагают для этого батник http://geekswithblogs.net/robz/archi...ws-xp-sp3.aspx Так гласит Гугл. :) |
Цитата:
Теоретически можно , как описано здесь : http://xaknotdie.org/22h/5/11.html в разделе "Отключение Windows File Protection на лету" Только гемор это ещё тот. Не проще ли один раз перезагрузиться ? Или блокнот предполагается менять ежедневно ? :) |
в NSIS нельзя слить arc и exe как в Inno Setup ? :dont-know
Чтобы не копировать куда-то перед распаковкой. |
Цитата:
http://www.transl-gunsmoker.ru/2012/...g-post_18.html http://www.transl-gunsmoker.ru/2012/...g-post_19.html Может быть когда нибудь, какой добрый программер и реализует это для NSIS... Готовых решений - похоже нет. |
Обновленный winver2.nsh
1. Исправлена определение редакции в win7 2. Добавлена поддержка win8 и win8.1 Как пользоваться читаем в нашем справочнике. |
А Server 2012 R2 ? :(
|
Цитата:
|
Цитата:
Код:
${If} $0 == 6 ;MajorVersion |
kotkovets, подскажи пожалуйста, можно ли средствами NSIS определить семейство процессора машины AMD или Intel. (вот как идет определение ОС)
|
Цитата:
|
MKN, спасибо, но есть еще один вопрос, в описании пишет:
Код:
${CPUFeatures.GetVendor} out_var Проблема решена, плаг не той кодировки скинул в папку. Вот код может кому пригодится: Код:
!include "LogicLib.nsh" - первым делом |
Хедер ToolTips
Как и что - видно из примера : Код:
!AddIncludeDir . |
Друзья, ситуация такая:
Код:
|
Если Function .onInit поместить впереди всех секций, то невозможно будет из него управлять флагами секций, а если после всех секций, то при запуске установщика идет какая-то распаковка файлов. Так и должно быть ? :dont-know
![]() |
Цитата:
Это нужно для компилятора NSIS - время когда создается проект. |
Цитата:
|
рядом с exe лежит ini в зависимости от значения в нём нужно выполнить разные действия
например в секции "setup" параметр "user" значение "q" нужно выполнить Rename $INSTDIR\P.dll $INSTDIR\rbp.dll например в секции "setup" параметр "user" значение "w" нужно выполнить Rename $INSTDIR\E.dll $INSTDIR\rbe.dll |
icq99999999, в справочнике, что в шапке, описано, как работать с ini файлами
Код:
ReadINIStr $0 "$EXEDIR\что-то.ini" "setup" "user" |
Цитата:
|
почему нельзя Два раза проверять файлы?
|
Цитата:
|
Вложений: 1
Цитата:
есть 2 файла рядом с exe нужно в зависимости от того есть они или нету выполнять действия в этом коде у меня ничего не получается |
icq99999999, если вы не в состоянии разобраться в переходах и метках, то пишите так:
Код:
!include "LogicLib.nsh" зы. две метки с одним именем не могут сосуществовать.. |
kotkovets, откуда можно узнать список тех команд, которые можно применить с ${If} ?. Например вы вверху написали ${If} ${FileExists}, а я этого не знал :) (про IfFileExists конечно знал)
|
|
Я конечно, дико извиняюсь, но вот это http://forum.oszone.net/post-2236753-599.html неужто никто не знает. Как сделать неизменяемым значение переменной на протяжении трех функций?
|
alexfinik,
Честно говоря, не фига не понятно что ты хочешь.. Если неизменность значения переменной, взятого из текстового поля на первой страницы - для остальных страниц, то это вроде как очевидно, типа : Код:
!include "MUI2.nsh" |
Цитата:
|
kotkovets, если в NSIS 3.0a1 сделать unicode установщик, то ${WinVersion} в Windows 8.1 выдаст 6. вместо 6.3
|
MKN, В func1 задается переменная. В msgbox в func3 отображается заданное значение этой переменной. У меня оно пустое... Я, наверное, плохо объясняю. Сейчас понятно объяснил?
Твой скрипт эту задачу не выполняет - проверил. Задаю 5 - отображает 1 |
Цитата:
Я ведь только пример привёл основы. |
MKN, разобрался. Зря использовал в Test1Leave и Test2Leave "${NSD_GetText} $R4 $R4"
Это я про свой пример http://www.oszone.net/go.php?url=htt...36753-599.html Про ваш - ну если ничего не править - выдавало что сказал. Почему - сам не понял... Вроде всё ок должно быть... Вот так работает: Код:
|
alexfinik,
Если надо править, то добавь OnChange, как уже вышесказано : Код:
...... |
MKN, хм, а зачем, если у меня работает и так?
Правда есть другой "простой", просто "элементарный" вопрос. По запросу "числа", "сложение" - я ничего не нашел Как выполнить операцию $NumMan=$NumMan-1 ?? У меня for работает только с нуля почему-то. Приходят в голову всякие извраты типа сделать строку длиной $NumMan Отнять единицу, подсчитать его размер и присвоить $NumMan. Бывает что-то попрощу? Плохо ли искал в мануале, но нашел только сравнение чисел... Терпеть не могу писать в форумы, а вот зачастил что-то... И главное простейший вопрос, а не нашел ничего... |
Цитата:
Код:
IntOp $NumMan $NumMan - 1 |
kotkovets, Спасибо! Нашел еще вот такое:
Код:
System::Int64Op $NumMan - 1 |
Цитата:
|
Ошибка в WinVer2.nsh:
![]() Система Windows XP SP2 Home Edition. |
Limonica, а вы уверены, что это ошибка? Может просто неверно используете модуль? Похоже на вывод справки.
|
Цитата:
проверял на WinXP Professional: http://img203.imageshack.us/img203/7199/l5hn.png --- vahe-91 по поводу юникода: http://img844.imageshack.us/img844/9172/eeuv.png |
Для убидительности проверил и на SP3 (Windows XP Home Edition)
http://dropi.ru/qMy.jpg Все образы с MSDN. Баг реально есть и именно на Home Edition. ссылка на оригинальные образы http://yadi.sk/d/OOa1SUsk7oKs0 |
Ещё раз об определении архитектуры процессора. Был предложен плагин, но можно и так (когда то уже было...) :
Код:
OutFile "PROCESSOR_ARCHITECTURE.exe" |
kotkovets, когда ожидать фикс?
|
Цитата:
неправильно возвращается значение, возвращаются в стек два значения: Professional и Home Edition с учетом этого факта подправил winver2.nsh p.s исправлена работа в юникодной версии NSIS |
Друзья, заколебался:((( Не понимаю что делать:((
Вот бесполезный код, собранный специально, чтобы посмотреть в каком порядке идет обработка кода. Мне нужно, чтобы при наличии окон в коде, у меня он обрабатывался последовательно. Т.е. сначала цикл 1, потом вложенный в него цикл 2, потом уже переходил к циклу 3 в следующей функции, у которой роль обрабатывать заданное в 1 и 2 цикле. В первом и втором цикле задаются массивы. Помогите, пожалуйста, или направьте на нужную литературу, да хоть на английском. Может пойму... Код:
!include nsDialogs.nsh |
Цитата:
2. В созданном диалоге разрушать, скрывать или создавать в цикле дочерние элементы диалога.. 3. Функция test1 выполняется при закрытии (выполнении) функции test0 |
kotkovets, огромное человеческое спасибо!
|
Разнообразные параметры ОС (версия, Build, SP и пр. )можно определить и с помощью WMI хедера.
Например : Код:
;http://nsis.sourceforge.net/WMI_header |
Цитата:
Код:
|
MKN
Цитата:
точнее гибридно.. |
Цитата:
Цитата:
Вопрос, по какому действию скрывать и показывать другие? По нажатию кнопки Next? Как наиболее коротко это сделать? В голову приходят идеи создания отдельной функции, но может есть команды в одну строку? |
Цитата:
Но что мне не нравится в WMI - подтормаживает... Пока всё определит... Может это издержки хедера ? И может можно как то ускорить его работу ? |
Цитата:
апи неверно работает в win8 - поэтому вынужден на WMI перейти --- Цитата:
т.е если нужно по условиям предыдущей странички не показывать следующую.. что то, можно так объявить: Код:
Page custom test0 test1 |
Цитата:
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 файлы. Укажите, куда копать, пожалуйста. Потому что вот с вложенным фором у меня проблемы возникли... Ну тут что-то типа массива второй степени получается, то бишь матрицы. Узнал уже кучу |
alexfinik, т.е. вам нужно реализовать что...если я правильно понял:
Конструкцию, при которой пользователь сам решит, сколько страниц показывать (странички будут с одинаковым содержимым уже известным вам или как?) и далее, "дублирующее" действие, на следующих страничках, пользователь опять же сам укажет количество нужных для показа страничек? хм, я бы сделал это всё управлением переменных, т.е. к примеру: 1. В одну переменную кидаем количество нужных страничек - 4 Переходим ко второму диалогу, где читаем значение этой переменной и понимаем, что будем показывать 4 раза один (либо в теории с помощью функций менять содержимое элементов в зависимости от нумерации странички) 2. Когда "вторая" страничка будет подходить к концу показа (пользователь сделал там всё, что было необходимо) в конце функции после команды nsDialogs::Show мы плюсуем +1 к значению переменной (создаём ещё одну переменную), в которой мы указывали общее количество страничек, сравниваем значения и, если нам ещё нужно показывать странички (значение меньше 4), то перепрыгиваем меткой в начало функции (перед командой nsDialogs::Create), что поможет нам инициализировать создание второй странички в пределах одной функции, если же значение 4 (все необходимые странички были показаны), то завершаем функцию и идём дальше В теории, таким способом можно создать неограниченное количество страничек, вроде бы, решение вашей проблемы. Это просто набросок реализации, я сам понял, что написал, потому что в своё время много заморачивался со страничками на InstallOptions, а уловили ли вы мою идею, я не знаю :biggrin: В любом случае, пишите больше подробностей, если что - поможем |
определяю значение ,консервирую в переменную $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' возможно ли это? |
K.A.V., кажется что-то понял:). Спасибо. Попробую повозиться с метками.
Не очень понял относительно nsDialogs::Show. Если у нас есть Код:
Page custom test0 test1 Upd.: Поэкспериментировал. В моем случае, если 2 функции в странице участвуют, Goto не срабатывает если переход относится к другой функции. Кажется пока сам разбираюсь. Изврат полный, но получается... |
alexfinik, держите
Код:
!include "MUI2.nsh" Цитата:
|
Вложений: 1
Может, кому пригодится...
Плагин делает окно инсталлятора прозрачным. Инструкция и пример в архиве |
почему так работает
CreateShortCut "$SMPROGRAMS\mod\mod.lnk" "$INSTDIR\mod.exe" а так нет? RMDir /r /REBOOTOK "$SMPROGRAMS\mod" пишу CreateShortCut "$SMPROGRAMS\очистка.lnk" "$INSTDIR\mod.exe" "/O" получаю ярлык с таким именем Тихая.lnk" в чём причина? |
icq99999999,
перед созданием ярлыка, нужно создать папку ярлыка, иначе ярлык может не создаваться: CreateDirectory "$SMPROGRAMS\mod" CreateShortCut "$SMPROGRAMS\mod\mod.lnk" "$INSTDIR\mod.exe" Цитата:
SetOutPath "$SMPROGRAMS\" RMDir /r /REBOOTOK "$SMPROGRAMS\mod" Цитата:
|
нужно распознать значение из ini
то есть в ini в секции Setting параметр (I)D будет значение например $EXEDIR вытяну значение ReadINIStr $1 "$INSTDIR\mod.ini" "Setting" "(I)D" но в переменную $1 будет скопировано сам текст $EXEDIR а мне нужно чтоб а но распознавалось и вместо текста $EXEDIR был путь exe ну то есть PHP код:
а мне нужно чтоб был путь exe то есть например сообщение с текстом: "вы запустили exe из С:\1.exe" |
icq99999999, не знаете команду сравнения строк?
Прочтите сначала Справочник по NSIS Код:
Section "MainSection" SEC01 |
K.A.V., Первую часть читал. Сидел ночью часа полтора и построчно "проходил" код, записывал как изменяются переменные. Забавно.
Код:
Function nsRkeeperIni Форум читал - Ну страниц 50-80, наверное. Интересно:). Не помню, кажется первую часть читал. Некоторые вещи просто сносят крышу и вызывают вопросы "как это работает??", но практически для меня неважны были всё равно. KAV, жалко ваших потраченных усилий, когда сам разобрался... Но спасибо. У вас способ короче намного, конечно. Пока в код досконально не всматривался. Но я так понимаю, что вы предлагаете перехватить управление кнопкой Next. На будущее возьму на заметку. Цитата:
|
Цитата:
Ну, а то, что сами разобрались - это тоже хорошо, голова работает логически, в программировании это очень важно Цитата:
Цитата:
Цитата:
Если будут вопросы или проблемы с кодом, спрашивайте, не стесняйтесь :) |
icq99999999, Вот с таким mod.ini всё работает
Код:
[Setting] Цитата:
|
Цитата:
то есть с начало копирую в переменную ReadINIStr $1 "$exeDIR\mod.ini" "Setting" "(I)D" потом MessageBox MB_OK "$1" как итог будет сообщение с текстом "$PROGRAMFILES\не известное значение пришедшее в голову пользователя" нужно сообщение с текстом: "C:\Program Files\не известное значение пришедшее в голову пользователя" |
Цитата:
Код:
MessageBox MB_OK "$PROGRAMFILES\$1" |
Цитата:
подхватываю значение 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\имя придуманное пользователем" |
Цитата:
Делайте по принципу замены всех возможных переменных в прочитываемой строке, пример: Код:
${StrRep} $1 "$1" "$$EXEDIR" "$EXEDIR" |
Цитата:
|
Помогите пожалуйста с Uninstall. Как мне сделать при запуске uninst.exe выдать сообщение с кнопками ОК, Отмена и текстом: "Внимание! Вместе с программой будет удалена ваша база. Продолжить?".
Кажется нужно использовать MessageBox MB_OKCANCEL "Внимание! Вместе с программой будет удалена ваша база. Продолжить?" а как не знаю |
Цитата:
А конкретно по вашему вопросу, в справочнике смотреть по пути: Справочник по NSIS => Перевод справки NSIS => MessageBox Приходите с хорошим настроением и с прочитанными страничками нашего справочника :) |
Как правильно расширить изображение в шапке инсталлятора на всю ширину?
|
Цитата:
|
Друзья, а как можно ли определить номер объекта, создаваемого с помощью
Код:
${NSD_CreateText} 0 50u 100% 13u "" Код:
GetDlgItem $2 $HWNDPARENT НомерОбъекта$Text Код:
${OpenBox} "Search for a ZIP file" "Zip-file (*.zip)|*.zip||" 1 "$EXEDIR" 3 ${VAR_6} |
Цитата:
Код:
${NSD_SetText} $Text "test" Код:
${NSD_GetText} $Text $6 |
Цитата:
|
1) Dозможно ли сгенерировать exe-файл на борту. Т.е. есть ли возможность включения встроенного компилятора NSIS в скрипт?
2) Правильно ли я понимаю, что жесткие ссылки можно создавать только из UnTGZ_plug-in? |
Цитата:
Суть вопроса насчет 2-го пункта не понял |
K.A.V.
1) Спасибо. Ну думаю, овчинка выделки не стоит тогда. Неудобно будет. 2) тут вопрос знаете ли вы что такое жесткие ссылки. Если нет, то это файлы, которые расположены в разных местах диска, но физически занимают одну и ту же область диска. И меняя один - у меня, конечно, меняется и другой. Хотя вопрос отменяю. Только что сообразил, что fat-флешка поддерживать не будет эту систему всё равно. Т.е. на занимаемом месте сэкономить не получится. |
нужно скачать файл из интернета, но перед скачиванием спросить у пользователя качать или нет
если файла на сервере не существует или нет подключения к сети: выключить программу |
Цитата:
Код:
inetc::get "http://file.file" "$INSTDIR\file.file" IfFileExist - это для если файла нет |
Кстати, присоединяюсь к вопросу насчёт скачать. У меня inetc выдает ошибку в win7 и Win embedded, а inetload в unicode NSIS не работает. Читал на другом форуме про wget еще.
Что можно использовать для скачивания ftp с авторизацией, в принципе. Я где-то задавал тут вопрос, но почему-то не смог найти это сообщение... |
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Вот, только что скачал DrWeb согласно кода : Код:
OutFile "inetc-test.exe" Код:
inetc::get "ftp://myuser:mypass@mywebserver.com/public_html/pft/_public_/update/upd_App.exe" "$EXEDIR\setup.exe" /end |
Цитата:
|
Цитата:
|
InetLoad plug-in не пробовали?
Не знаю, как он работает по подключениям с паролями, но насчет скачки с ним проблем никогда не было (по крайней мере у меня), в своём SFX Creator я именно этим плагином произвожу обновление изменённых файлов |
Цитата:
http://forums.winamp.com/showthread.php?t=346710 |
Всем привет. Ребят, может кто знает почему на некоторых операционках инсталлер НСИС выглядит вот так как ниже на скрине? А именно увеличивается площадь инсталлятора, из-за чего обрезается картинка и выглядит обрезанной по правому краю и снизу.
![]() |
Цитата:
Цитата:
Разбирал примеры всякие - если там меняю nsis.bmp - та же фигня. P.S. Где можно найти просто море *.nsi, кроме как в дистрибутиве? |
alexfinik, а я наоборот думал что у меня вопросы специфические и никого кроме меня не интересуют :).
Что-то я не совсем понял, а если не менять nsis.bmp, то всё ОК?) Я так понимаю Вы сами эту проблему видите, подскажите, пожалуйста, а как себя ведёт картинка приветствия/финиша установки? Там тоже подобная обрезятина происходит? Мне просто скрин прислали пользователи и сам я не могу проверить. А также хотелось бы узнать на какой конкретно версии Винды происходит эта проблема? |
Aster, левые или правые концы заводских картинок NSIS заканчиваются белым, поэтому такого с заводскими картинками не наблюдается...
|
Цитата:
|
Вложений: 1
Цитата:
Я открывал картинку в Gimp, просто мазал кистью и пересохранял - получалось белое пятно вместо картинки в установщике. Пробовал с другим файлом изменить ppi на 72px, как в оригинале - не помогло 71,9836 × 71,9836 ppi у оригинала... Цитата:
Цитата:
C:\Program Files (x86)\NSIS\Unicode\Contrib\Graphics\Header\nsis.bmp Файл 106021 Желающие попробовать, скопируйте оригинал nsis.bmp и положите в соотв. папку мой файл... Может кто скажет в чем ошибка?.. |
тут 72 × 72 ppi. Изменил на 71,984 × 71,984 ppi - не помогло. Сменил на индексированный 256 цветов - не помогло. У оригинала, однако 71,9836 × 71,9836 ppi, но в Gimp такая мелочь не выставляется:))
Aster, Такая фигня на протяжении всего установщика. У меня win7 x64, но сомневаюсь, что это от винды зависит... |
Вложений: 1
Цитата:
|
Интересует такой вопрос : каким образом поместить-вписать в созданное произвольное окно на кастомной странице - окно, принадлежащее другому процессу ( любому запущенному стороннему приложению ) ? Чтобы выглядело , как уже реализовано для NSIS, при помещении в окно кастомной страницы - окна WEB браузера или флеш анимации.
Предполагается запуск приложения из самого скрипта. |
Limonica, Это для кнопки Next 1. Для Back, вроде 2. 3 - надпись между кнопками (ее только изменить можно и не этими операторами)
Код:
GetDlgItem $0 $HWNDPARENT 1 Цитата:
Что примечательно, с другими *.bmp из стандартной папки, всё работает. |
Цитата:
Цитата:
|
Цитата:
|
Вложений: 1
Aster, красным обозначено то, что работает. Черным - измененный рисунок
Ниже - простейший код, где показывается или НЕ показывается изображение слева. Значок слева наверху у вас отсутствует из-за измененного или отсутствующего значка (это оценочное суждение, только предполагаю) в папка ../icons (относительно Header). По-видимому отсутствует или изменен файл modern-install.ico http://forum.oszone.net/attachment.p...1&d=1383215681 Код:
!include MUI2.nsh |
Цитата:
|
Определяем букву CD/DVD привода и есть ли в нём диск.
Букву дисков можно конечно определить с помощью штатной команды GetDrives, но и этот код может пригодиться : Код:
OutFile "GetCDVolume.exe" |
Цитата:
Я думаю эта информация потом и для справочника NSIS будет полезна. Цитата:
|
4.8.1.29 ManifestDPIAware
notset|true|false --- начиная от версии 3.0 Alpha 0 пишется вне секции и функции --- это команда масштабирует только текст (элементы диалога), что бы текст не размывался, при изменении DPI т.е к растровое изображение не масштабирует.. так гласит справка.. |
Цитата:
1. Ставите 2. Запускаете хотя бы и мой пример, указанный выше (сохраняя файл в *.nsi). 3. Можно изменить картинку по указанному пути, можно взять указанную мной и положить ее по указанному пути. |
Уважаемые! Определяю наличие главного окна программы через FindWindow. Есть ли возможность найти дочерние окна по типу\названию и определить HWND и, очень важно, - видимое оно, в данный момент, или нет?
|
Цитата:
Код:
StrCpy $0 "hwnd" Цитата:
или EnhancedFindWindow Вот код, перечислит все видимые окна : Код:
!include LogicLib.nsh |
MKN, Спасибо! Обошелся поиском всех видимых окон и последующей фильтрацией... Как всегда, что-нибудь упустишь! Нужно еще определить размер окна и его расположение на мониторе...
|
Цитата:
Код:
;Функция GetWindowRect извлекает размеры рабочего прямоугольника определяемого окна. Код:
OutFile Rect_test.exe |
MKN, Вы меня, прямо, балуете, спасибо... Я не лентяй, просто у меня еще нет навыка в поиске информации. Буду изучать и, если что, рассчитываю еще на Ваш опыт...
А можно заставить окно инсталлятора открываться не в центре экрана, а по координатам, которые я укажу в той же системе, что и в вашем примере выше? |
Цитата:
Код:
!include "MUI2.nsh" Цитата:
|
Цитата:
|
kotkovets, подскажите пожалуйста как такой батник выполнить командами nsis:
Код:
@Echo Off |
Цитата:
Насчет команды запуска *.msp файлов на примере msi Код:
ExecWait 'msiexec /i "$R9" /norestart /qn' $R1 В общем допиливайте опытным путем до рабочего состояния - примерно так... --- p.s и в конце предложите перезагрузиться.. |
kotkovets, пересматриваю ваш код по установке устройств, но есть странная особенность установка\обновление идет только в том случае если устройство уже установленно, если же оно не установленно ничего не происходит. Тестировался нижеследущий код XP Professional - все ок, XP Home - установка не проходит, в чем может быть проблема, непонятно, буду благодарен если посмотрите...
Код:
!define ERROR_NO_SUCH_DEVINST -536870389 |
kotkovets, спаибо большое, и еще один вопрос, в справке сказано о команде nsExec::Exec для скрытного запуска консольных утилит, cmd и bat файлов, так вот можно запустить cmd файл, но только в видимом режиме и с невозможностью закрытия окна консоли, то есть что бы окно закрывалось уже когда батник завершит все свои дела. Можно воспользоваться ExecShell "open", но тогда как решить проблему невозможности закрытия окна cmd до завершения процесса?
|
Цитата:
Цитата:
Код:
ShowWindow $HWND 0 |
Добрый день. Как отключить функцию перетаскивания для окна инсталлятора?
|
Цитата:
Код:
Outfile ostart_.exe |
|
Цитата:
http://forum.codenet.ru/q72348/Как+з...#answer_379693 Но не для NSIS... |
Цитата:
для установки драйверов.. изучайте ключи запуска - в сети туча примеров - DPInst /? Цитата:
|
|
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 |
Цитата:
И в сети ранее уже "писалось" :) по поводу перетаскивания - должно перестать действовать, если удалить заголовок окна. Но есть "но" - этот способ работает не на всех окнах и по сути не оч корректный... Пробуй... Limonica, Для установки драйверов для одной не новой программы, есть хедер... Кстати код похож, на тот, что и у kotkovets Если ещё есть интерес , выложу. Хотя DPInst - лучший вариант. |
Как переименовать файл ffg.exe в ffg_old.exe перед установкой
Пишу Цитата:
Подскажите куда нужно поместить этот код |
YoraG, А смысл? Сформулируйте цель. Что мешает сделать файл сразу ffg_old.exe?
Могу предложить создать некоторый файл, в который будет класться информация с некоторым индексом i, который будет каждый раз меняться при запуске файла. Ну т.е. есть файл index.ini. При первом запуске его нет и он создается, после чего туда записывается цифра 1. Содержимое строки падает в переменную $R0. Файл в конце переименовывается в Код:
Rename $INSTDIR\ffg.exe $INSTDIR\ffg_old($R0).exe |
MKN, выложи пожалуйста, интересно будет посмотреть...
|
Цитата:
|
Цитата:
Хедер установки драйверов : |
Цитата:
Открываешь EXE с ресурсами диалогов (modern.exe), переходишь в диалог "105", удаляешь стили окна: WS_CAPTION и WS_SYSMENU По вкусу, можно добавить другие стили окна, для придания некой формы, например добавить WS_THICKFRAME для толстой рамки или WS_BORDER с тонкой...Инфы в гугле много по стилям окон WS_* |
K.A.V.,
Нее... Это как то в лоб и не по NSIS_совски... :) А ежели кодом, то это как ? |
Цитата:
Скажи мне, в чем разница, что ты вырежишь стили окон из EXE, что ты вызовишь API функцию, которая это сделает при инициализации граф. интерфейса? Разве что усложнишь себе задачу |
Цитата:
Редактирование ресурсов посредством кода - это другое дело. Метод прямого редактирования ресурсов - явно не программистский, а какой то любительский что ли... :) Конечно, большинство нас здесь, по сути, любители, но всё же... :) |
Цитата:
А если вам предлагают решение и вы уже выбираете, нравится вам или нет - дело ваше Я, например, не программист и не знаю ничего, кроме NSIS. Да, могу писать плагины для NSIS мелкой функциональности с простенькими командами, поэтому лично для меня проще дать решение, которым бы я сам воспользовался. Да, способ любительский, но я и никогда здесь не говорил, что я программист и буду давать мегакоды с плагином system (которым не пользуюсь, мне проще dll написать). Я самоучка... :) А если ты хочешь "кодом", то гугли по функциям API, которые устанавливают стиль окна, например SetWindowLongPtr, этой функцией в своём плагине я удалял кнопки "скрыть, развернуть" и оставлял лишь кнопку "Закрыть" в шапке окна. |
MKN, тоже на Home Edition не работает, но спасибо.
|
K.A.V.,
Согласен со всем тобой сказанным. И я не программист. Но уж очень интересно было бы воспроизвести и опробировать именно код. Цитата:
|
Цитата:
Код:
!include MUI2.nsh |
kotkovets,
Можно чуть подробнее о манипуляциях перед GetWindowLong и перед SetWindowLong ? |
Цитата:
--- Необходимые логические манипуляции с числами: битовая логика (Битовые операции) И :) что бы из окошка убрать указанную циферку - из полученой общей циферки (стиля окна) http://ru.wikipedia.org/wiki/Битовые_операции |
Цитата:
|
Вопрос так и не решился как выполнить команду
Код:
nsExec::Exec '"${NSISDIR}\какой то.cmd"' По совету K.A.V., не получается http://forum.oszone.net/post-2247687-702.html Так окно при каждом новом запуске окно получает новый дескриптор..и если писать так Код:
nsExec::Exec '"${NSISDIR}\какой то.cmd"' Мож есть какой то еше способ? |
Цитата:
Кому нужно пользуйтесь: Цитата:
|
Цитата:
Цитата:
Код:
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE SHOW |
Не ну серьезно, неужели нельзя установить новое устройство средствами NSIS?
|
Цитата:
|
Возвращаясь к вопросу о скачивании файлов без плагинов.
Это можно сделать с помощью функции URLDownloadToFile Код:
OutFile "URLDownloadToFile_test.exe" |
Цитата:
Код:
include "MUI2.nsh" |
Цитата:
Код:
outfile cmd-test.exe |
Каким образом с помощью NSIS, реализовать Drag-and-drop для файлов-папок и самое интересное - для разных объектов-форм (кнопок и пр ) ?
|
Цитата:
Только там вроде drag работает только на еденичный файл/папку, группой не получится перетащить |
Сравнение времени создания файлов c помощью функции CompareFileTime
Код:
Section Eсли $R0 создан раньше $R1 - возвращается -1, Если $R1 создан раньше $R0 - возвращается 1 |
как сделать, чтобы инсталер не ждал окончания выполнения батника, командой nsExec::Exec ? Или есть другая команда для выполнения батника в скрытом режиме, с помощью которого инсталер не будет ждать его завершения ?
|
|
Цитата:
Код:
System::Call "kernel32::WaitForSingleObject(ir1, i-1)" |
Цитата:
Автор: K.A.V. На этой страничке я предоставлю вам код, с помощью которого вы сможете сгенерировать случайное число, указав необходимый диапазон чисел В начале кода: Код:
!define Rnd "!insertmacro _Rnd" |
Цитата:
|
Цитата:
http://nsis.sourceforge.net/Rnd http://nsis.sourceforge.net/Random А также: Код:
System::Call kernel32::GetTickCount()i.r1 |
Всем привет , у меня есть вопрос ! Можно ли разбить на тома инсталлятор как в Inno Setup ?
|
Делаю патчер с проверкой MD5 файла. При каких-либо отличиях выводятся свои сообщения. При наличии измененного этим патчем файла (сооб.1) и при несоответствии оригинального файла (сооб.2). Возврат к поиску другой папки после Сооб.2 оправдан. А вот после Сооб.1 приходится выполнять лишнее действие. Даже два, так как приходится щелкать еще и в окне запроса подтверждения отмены установки.
Можно ли закрыть программу инсталляции сразу после вывода сообщения 1, а не возвращаться для отдельной отмены установки? Код:
|
Цитата:
|
Возможно ли в NSIS реализовать мониторинг создания ключей реестра, какой либо программой ?
Т.е. перехват обращений к реестру. Вроде как для этого есть функция CmRegisterCallback... Вскользь про это было здесь : http://www.xakep.ru/magazine/xa/102/114/1.asp |
Цитата:
А нужно ли это установщику? |
Цитата:
То что эти ключи и данные остаются в реестре - полбеды. В ряде случаев именно из-за их наличия, не возможно повторно установить программу, либо программа просто не станет работать... Поэтому полная зачистка реестра от этой заразы, как перед установкой, так и при деинсталляции ПО, была бы очень полезна. Поэтому есть смысл мониторить образование таких ключей Цитата:
|
Когда то рассматривался вопрос об использовании в качестве картинок - файлов формата Jpg
Есть код, позволяющий использовать Jpg и Gif файлы, а также изменять их размер : Код:
!include MUI2.nsh |
При создании на стандартной финишной странице отмеченного чекбокса ( MUI_FINISHPAGE_RUN ), для запуска после установки (т.е. после закрытия PAGE_FINISH) чего либо ,
чтобы этого запуска не было, сначала надо снять отметку с чекбокса, а потом кликнуть Finish. Иногда это не преемлемо и мешает управлению событиями... Но на FINISHPAGE можно активировать кнопку "Cancel", нажатие которой, закроет страницу без запуска чего либо, даже если чекбокс отмечен. Код:
OutFile "FinishCancelEnabled_test.exe" |
Не помню спрашивал или нет :unsure: Можно как-то упростить создание деинсталера, чтобы вручную не указать что, где нужно удалять ?
|
Цитата:
http://nsis.sourceforge.net/Talk:Uni...nstalled_files и http://nsis.sourceforge.net/Advanced...og_NSIS_Header Но по моему, это не серьёзно... Годится только для частных случаев... Кто лучше самого создателя инсталлятора, может лучше знать что, как и когда удалять, условия и нюансы удаления ? |
Цитата:
|
Автоматическая смена заголовка окна сообщений
Занятное решение... Код:
OutFile "MB_Title.exe" |
kotkovets, здравствуйте. Можно что-нибудь придумать с WinVer2.nsh для юникодовой версии NSIS? Желательно для последней альфы.
Используя ${WinVersion} не хочет последнюю цифру рассказывать, получается просто "6." |
Цитата:
Для 99% практических надобностей, этого достаточно и не надо никаких WinVer.nsh А получить эти циферки можно или как всегда : Код:
outfile GetOsVersion.exe Код:
outfile GetOsVersion.exe |
MKN, первый вариант не катит, потому что в реестре кто угодно может поменять эту информацию, а хочется, чтобы всё было как надо.
Второй вариант заинтересовал, благодарю, попробую. И дело вовсе не в 8.1 (чтоб её), на Windows 7 та же беда. Надеюсь ещё услышать мнение kotkovets. |
Цитата:
В конце концов можно установить сответсвующие права на эту ветку... |
Цитата:
|
Цитата:
-- С последней 3 версией NSIS никаких проблем, скрипт сохранял в любом юникоде http://forum.oszone.net/showpost.php?p=2239933 |
kotkovets, используется версия 3.0a1, юникод включен, на выходе что-то непонятное... Причём, на ANSI всё работает нормально.
|
Begin2Fly, косяк есть исправил:
http://forum.oszone.net/showpost.php?p=2239933 |
kotkovets, спасибо большое, теперь всё отработало корректно. Только подправьте расширение файла, а то скачивается с .nsi, а не с .nsh
|
Цитата:
|
*Тихо ненавижу 8.1*
Кто-нибудь знает, как можно зарегистрировать .dll, находящуюся в Program Files (x86) на 64-битной Windows 8.1? Пробовал всякое, но процесс просто висит в фоне. |
Подскажите что не так делаю, при использовании плага Nsis7z, после выполнения команды
Код:
Nsis7z::ExtractWithDetails "Test.7z" "Распаковка: %s" |
diakov, пакуй в LZMA, а не LZMA2.
|
Цитата:
Если нужно делаем перенаправление: подробности в файле ..\NSIS\Include\x64.nsh |
Цитата:
|
Цитата:
|
подскажите как запустить через execcmd или execdos приложение с параметрами. я не понял как это сделать
|
Vincent7,
Код:
ExecCmd::exec '"$SysDir\cmd" /c NET START PFNet' "" "" |
Добрый день... Не думаю, что получу ответ, но... Применял с успехом код для поиска открытых окон приложений:
Код:
!include LogicLib.nsh |
Цитата:
|
Цитата:
И такому поведению есть место, например, у меня тоже NSIS скрипт не находит через FindWindow окно "Kaspersky Internet Security" когда запущен антивирь, в то время как программа "InqSoft Window Scanner" явно даёт понять, что данное окно всё-таки существует и в своём списке его отображает... |
Цитата:
|
Цитата:
Может прграмма построена, так , что игнорируются API вызовы, "направленные" на её оконные формы и пр ? Всё же это антивирус... А вышеприведённый код, ведь API_шный... Можно попробовать подойти к такой задаче по другому - или искать окно, принадлежащее процессу или использовать WMI |
Цитата:
Я не думал, что это слово вызовет затруднение... :) или искать окно, принадлежащее процессу - поподробнее можно, пожалуйста. |
Цитата:
|
Цитата:
Если перебрать все окна ,созданные всеми имеющимися в данный момент, процессами, то сделать снимок процессов, разобраться с ним и для каждого использовать функции EnumThreadWindows() и EnumThreadWndProc. Как то так. Это много кода и гемора. Подробности знают наши гуру. :) ps Найти "Window Title", зная имя процесса, можно с помощью малюсенькой утилитки CProcess. Она уже упоминалась здесь. |
Ещё раз о запрете перетаскивания окон-страниц.
Китайские "NSISадмины" для этого, обезглавливают окно одной строкой в CUSTOMFUNCTION_GUIINIT (или PAGE_CUSTOMFUNCTION_SHOW) : Код:
OutFile "NoWindowTitle.exe" Что бы это значило ? ps offtop По заявлению IT-corp AOL - скоро будет закрыт проект winamp и сайт winamp.com, тогда что, и форум закроют ? Т.е. мировой центр NSIS разработки и общения NSIS_овцев... Тогда на белом свете останется только forum.oszone NSIS... Сюда потянутся пользователи со всего света, мировая NSIS дискуссия, Нью-Nsis Васюки.... :) |
Цитата:
Последний параметр в функции устанавливает стиль окна, там суммируются разные стили по кодам стилей, вот и всё (SetWindowLong) Корректней было бы сначала получить стиль своего окна с помощью GetWindowLong, из этого стиля удалить необходимые стили и использовать "обрезанный" стиль как 3-ий параметр в SetWindowLong, как показал вам ЗДЕСЬ уважаемый Вячеслав :) Цитата:
|
Можно пример скрипта определения раскладки клавиатуры или языка ОС, и если он англ. - завершение работы скрипта. Спасибо!
|
Цитата:
Код:
OutFile "LocaleINFO.exe" Не путать с текущей раскладкой, которая вышеприведённым кодом НЕ определяется ! С логикой "если бы, да кабы" - разберёшься сам. Примеров тьма. |
Возник такой вопрос.
известно, что в 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 ? |
Подскажите пожалуйста как можно отправить сообщение в командную строку? И можно ли в ней же эмулировать нажатие клавиши enter?
|
Цитата:
Насчет отправки сообщения в консоль не знаю, с консолью особо не было нужды работать, возможно, Вячеслав вам подскажет :) |
не работает эмулирование... а если использовать execdos плагин с параметром /DETAILED- так информация из командной сроки будет выводится в окне установки, можно ли будет в это окно послать сообщение? будет ли оно воспринято консолью?
|
Цитата:
А в консольное окно, отправить нечто можно так : Код:
outfile consol.exe |
Вложений: 1
Цитата:
Хотите сказать, мой предоставленный код не рабочий? Может, вы делаете что-то не так? Смотрите прикреплённый файл. Специально для вас, запустил виртуалку и проверил на XP (не, ну мало ли, чтобы уж наверняка) C другим софтом да, возможно и не будет работать, но в командную строку лично у меня нажатие клавишь отправляет корректно Кто-нибудь, протестите мой пример кода и скажите, работает ли у вас посылка нажатия "enter" в командную строку Цитата:
Цитата:
|
Ну да,нажатие работает,извините моя ошибка. однако в моем коде нужно чтобы нажатие эмулировалось во время выполнения консольной программы, а не после
Код:
section "f" |
Цитата:
И как вы копировали мой код, если удалили из команды нужную переменную? Цитата:
Цитата:
Цитата:
Код:
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" И, если вы хотите, чтобы ваш код с командной строкой работал на всех системах, я вам уже говорил в отличии заголовков окон в WinXP и Win7 (в Win8 не помню как), так что вам сначала нужно определить ОС и в зависимости + типа учетной записи менять искомый заголовок командной строки... Лень сейчас писать вам код, подумайте хоть чуток сами... |
спасибо большое!
|
С этим разобрался. Теперь нужно считать информацию из командной сроки... Как? :)
|
Цитата:
Умеете пользоваться поиском? Ищите команды для работы с консолью типа тех, что вам дал MKN, а то тут получается, что ваших кодов ещё никто не видел, а готовые решения получаете Я, например, чтобы считать все данные из консольного приложения (оно выполняется и отображает прогресс действий строками) пользуюсь плагином ExecDos plug-in, который позволяет в качестве выходных данных указать функцию, которая будет получать каждую строчку из консольного приложения в момент его выполнения либо HANDLE, в который будут посылаться данные. Пример по выходным данным в фунцкию смотрите на страничке описания плагина внизу странички (ключ /TOFUNC) Дальше пробуйте и разбирайтесь сами, если что не получится - пишите и показывайте, как вы пробовали реализовать нужный вам функционал. И не забудьте прочитать Справочник по NSIS |
Цитата:
Из какой такой строки ? Если из команды из скрипта, то например, с помощью плагина http://nsis.sourceforge.net/ExecCmd_plug-in Можно с открытой, можно со скрытой консолью. Только зачем вообще нужно окно консоли ? Там что то надо дополнительно делать ? Если из введённой тобой внешней команды ( опять же, смотря откуда вводить - из консоли, из строки ввода в окне твоего инсталлятора, или вообще из какого либо иного приложения и т.д. ) - тут иной расклад, но тоже решаемый... |
окно консоли нужно чтобы эмулировать нажатие кнопки и посылать туда данные. Разве со скрытой командной строкой такое возможно?
|
Цитата:
Зачем эмулировать нажатие клавиши в консоли? Зачем посылать данные в командную строку? Если вы бы с самого начала описали, что имеете в наличии (программы/средства и т.д.) и что конкртено со всем этим нужно сделать - мы бы уже сидели и думали, как это реализовать, так проще, поверьте, чем по кускам пытаться набросать код сомнительного функционала... Цитата:
Звучит, конечно, глупо, но для программирования - это норма :biggrin: |
Vincent7,
зачем изнасиловать командную строку ? может есть более легкий способ решения твоей задачи ? :unsure: |
уважаемые, подскажите как присвоить файлу атрибут "скрытый" после его создания?
пример взят из хелпа: Цитата:
Цитата:
|
Цитата:
Код:
SetFileAttributes "$INSTDIR\имя_файл.exe" ARCHIVE|HIDDEN|SYSTEM|READONLY Цитата:
|
Код:
section "f" |
Цитата:
Ещё раз повторюсь, скачайте и прочитайте наш Справочник по NSIS, если реально хотите подружиться с NSIS Сейчас вам учиться гораздо проще, много инфы, да и мы поможем если что... А по коду. Опять же, читайте справочник :) Смотрите, вы указываете запуск cmd Код:
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 Дальше продолжать не буду, ибо нет смысла - читайте справочник и изучайте команды, переменные и т.д. --- Цитата:
Есть ещё флаги "r" - открытие файла для чтения и "a" - вроде как добавление данных в файл Но лично я работал только с флагом "w", так что о том, как работать с другими флагами я не описывал в файле справки Вот выдержка команды FileOpen из справки NSIS Цитата:
|
А как найти скрытое окно и отправлять туда сообщения? В справочнике примеров нет
|
Можно ли управлять (установить постоянным) размером и положением окна выбора папки установки?
В общем, у меня отображается так: ![]() а хочется, чтобы так: ![]() Если знаете где обсуждалось, пожалуйста, ткните в ссылку. |
Цитата:
Читайте описания всех команд в разделе "Перевод справки NSIS", сколько я вам уже дал примеров команды FindWindow ??? Цитата:
Код:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer Перед запуском инсталлера или перед показом диалога выбора каталога можно подсунуть промежуточную функцию и записывать нужные значения в реестр :) |
Зачем мне читать описания всех команд если мне нужны только конкретные? А в описании команды findwindow нет примера поиска скрытого окна.
|
Цитата:
Цитата:
Цитата:
Я вам для чего давал пример в этом сообщении? Для забавы ради? :read: Мне кажется, там пример довольно яркий, когда вам показывается окно, туда помещается текст, затем окно скрывается на пару секунд и затем снова появляется, но уже с почти полностью заполненным текстом в окне |
подскажите, как назначить иконку (со ссылкой на файл shell32.dll за № 16) для созданной директории?
Цитата:
|
Цитата:
2. Создаёте в директории файл Desktop.ini (скрытый, системный) 3. Прописываете содержимое (читайте описание команды WriteINIStr в разделе "Перевод справки NSIS => Работа с INI файлами" в справочнике): Код:
[.ShellClassInfo] Код:
WriteINIStr "$INSTDIR\Моя папка\Desktop.ini" ".ShellClassInfo" "IconFile" "%SystemRoot%\system32\shell32.dll" |
K.A.V., директория создаётся, но значок стандартный
Цитата:
|
Возможно ли c помощью NSIS, организовать замену в файле, одних байт на другие ? ( Т.е. - заменить в файле по такому то адресу, имеющееся значение - на другое)
Если нет, то вопрос не совсем в тему - есть ли для этого, какой то утиль командной строки ? |
Цитата:
Цитата:
Код:
SetFileAttributes "$STARTMENU\Документы" SYSTEM Код:
FileOpen $0 "$STARTMENU\Документы\Desktop.ini" w Код:
WriteINIStr "$STARTMENU\Документы\Desktop.ini" ".ShellClassInfo" "IconFile" "%SystemRoot%\system32\shell32.dll" --- Цитата:
|
Цитата:
|
Уважаемый K.A.V, не получается у меня..
Код:
System::Call 'kernel32::GetStdHandle(i -11)i.r0' |
Цитата:
Команы FileReadByte и FileWriteByte не то в оригинальной справке к NSIS? Я просто инглиша не знаю, а гугл не особо помогает в техническом переводе правильно понять смысл... Я, честно сказать, вообще не в теме, т.к. такими вопросами не занимался...HEX, байты и т.д. мне не интересны :) не то?, там наш коллега amel27 советует DD --- Цитата:
Если вам банально лень - то мне тоже лень сидеть и писать для вас готовые коды, в которых вы даже не желаете разбираться, ctrl+c => ctrl+v всем нравится Чтобы вам писать в уже существующий процесс, вам нужно вызывать дополнительно AttachConsole и посылать этой функции PID процесса Это последний готовый код для вас от меня, до тех пор, пока у вас не появится желание самому что-то делать, разбираться и пока не научитесь не писать всё подряд в свой код я лучше пойду |
Цитата:
нужно пересчитывать различные адреса, суммы, хэши - отсюда громоздкий километровый код и это только в теории, а на практике - врядли.. -- Vincent7, хорош флудить здесь - код работает.. |
Код:
section "f" |
Vincent7, а с чего работать будет, с какого перепуга?
ExecDos отработает и усё - нет никакого окна после плага, видимого и невидимого :read: нужно, запускать не в режиме ожидания выполнения процесса.. Код:
Section Вообще для чего это нужно, озвучьте? |
Цитата:
Цитата:
Цитата:
Цитата:
Разве в моём примере было так? :( --- Цитата:
|
Цитата:
Цитата:
значит не судьба Vincent7 :not-me: |
Код:
section "f" |
Цитата:
Вы хотите что сделать, чтобы запустить консоль, отправить туда текст, а потом чтобы ваше консольное приложение его прочитало и отобразило в NSIS окне? :o Пожалуй, я воздержусь в дальнейшем от ответов на ваши сообщения, сидите тут пудрите нам мозги откровенно говоря, нет чтобы четко и ясно разъснить, что вы хотите сделать Цитата:
:shot: |
плагин execDos с параметром /DETAILED отправляет содержимое командной сроки окну установщика
|
Vincent7, скажу просто: не тупите!
а то цирк уехал, а клоуны остались.. |
Вызов диалогового окна выбора файлов
Пример для '*.nsi;*.nsh' Код:
Caption "Диалоговоое окно выбора файлов" |
Цитата:
Есть замечательные плагины типа Dialogs plug-in, которые позволяют сократить количество строк в коде до пары (1 строка вызов команды + ваш остальной код) Неужели вас страшит лишние пары десятков Кб из-за добавления DLL плагина в пакет? :) Я, конечно, понимаю, что WinAPI это хорошо, но мне кажется только тогда - когда это необходимо и нечем заменить нужный функционал А использовать тонны кода для простеньких задач это как-то не айс, тем более кто лично в этой теме реально понимает, что ты написал? ;) Ты, я, Вячеслав и ещё возможно пара человек, которые реально хотят кодить на NSIS и которые полностью прочитали наш справочник, включая описание System.dll и сидящие на MSDN для изучения WinAPI функций, есть вообще такие здесь? Я, честно признаюсь, раньше не использовал System.dll по одной простой причине - сложно было понять англ.доки по нему и читал описание данного плага из нашего же справочника :biggrin:, благодаря переводу Вячеслава я совсем недавно уже начал иногда применять system.dll в своём же "креаторе", мне раньше было проще написать dll, сейчас уже практически всё наоборот Ты бы лучше взял и оформил все свои примеры, которые здесь выкладываешь, в стиле нашего справочника, редактить html не так уж и сложно через визуальные редакторы, я , к примеру использую лёгкий NVU - вполне сходит для создания и оформления лёгких страничек для справочников :) |
Цитата:
Я тоже не люблю жирных кодов и без нужды не использую. Но любой такой жиряга - это и есть внутренности плагинов и хедеров, которыми все с удовольствием пользуются, потому что этот жиропродукт в итоге позволяет обойтись парой строк кода... :) Цитата:
|
Скажите, можно ли через NSIS сделать выбор типа/режим установки, ПЕРЕД выбором компонентов
![]() чтобы при выборе одного из режимов у него был свой независимый набор файлов / секций / свои настройки деинсталлятора / иконок можно ли это сделать стандартными средствами (пока не удалось найти как)?, если да/нет то в какую хоть сторону копать? |
Цитата:
2. » Логические конструкции в скриптах NSIS в справочнике 3. » Создание своего инсталлятора на NSIS. Секции и выбор компонентов 4. » Читаем про свойства флагов секций: скрытие, переименование, отметки изменяем флаги (свойства секций) в зависимости от отметки радиобутонов естественно все это делаем до показа странички компонентов. Код:
Section |
Можно ли в стандартном окне мессадж-бокса
MessageBox MB_YESNO|MB_USERICON|MB_TOPMOST заменить надписи "да" и "нет" на кнопках на свои? Мне например нужно, чтобы отображалось "32" и "64". Не могу найти ничего по этому вопросу. |
Цитата:
|
Ещё раз об индикации PrоgressBar_ом - реального процесса установки. Т.е. - сколько чего установилость - столько и отобразилось.
Метод вставки в код, команд приращения прогресса - громоздкий и не точный. А если сделать так : Зная объём устанавливаемых данных и вычислив объём свободного пространства на целевом диске - контролировать в процессе установки изменение объёмв целевого диска. И исходя из этого изменения - изменять длину полосы индикатора PB. Как это лучше реализовать на практике ? |
В справочнике имеется код создания лога установки... можно ли его переделать чтобы он считывал данные из командной строки и выводил их в окне установки файлов? exec dos плагин не может одновременно работать с параметрами /tofunc и /detailed... помогите.
|
Цитата:
Разве что ты постоянно будешь знать количество уже скопированных данных либо сколько осталось скопировать, но думаю это тоже будет проблемно контролить Цитата:
Если бы подключался там интерфейс - можно было бы брать прогресс из существующего прогресса, который контролит сам инсталлер А у тебя как? Подключаешь граф интерфейс? Цитата:
В функции при "/tofunc" вы можете вручную "кидать" данные в лог установки, который отображается на страничке прогресса установки, через использование сообщений Windows, а именно через LB_ADDSTRING Небольшой пример, как добавить данные в ListBox прогресса установки (этот код у меня в моём проекте, поэтоме переменные менять не буду, а описание сообщений Windows читайте в MSDN) Код:
SendMessage $R8 ${LB_ADDSTRING} 0 `STR:$2` $2 - текст строки, которая добавляется $3 - количество уже существующих строк |
Цитата:
|
Если на время работы инсталлятора необходимо автоматически переключить(установить) языковую раскладку клавиатуры, то для этого существует макрос :
Код:
outfile KeyboardLayout.exe |
Товарищи правильно ли я понял, что макросы редиректора WOW64
${EnableX64FSRedirection} ${DisableX64FSRedirection} на системе windows 8.1 не работают? |
Цитата:
|
K.A.V., боюсь что мне все таки нужен код логирования без использования /tofunc ... как я вам писал, после нажатия enter ничего не отправляется в окно установки...
Код:
Function LogFunction |
Цитата:
Цитата:
Я вам в миллионный раз повторяю, читайте наш Справочник, читайте MSDN для знакомства с сообщениями Windows (в предыдущем посте я вас натолкнул на решение вашей задачи) Но, видимо, вам всё ещё лень сидеть, читать и разбираться Так что я боюсь, что вам всё-таки нужно перестать здесь выпрашивать готовые коды и начать читать справочник, смотреть примеры и вникать в смысл написания NSIS-инсталляторов А "помогать" лично вам, лично у меня уже нет желания, потому что: 1. Вы упорно отказываетесь читать и изучать то, что вам советуют 2. На протяжении всего времени по поводу вашей задачи вы так и не объяснили суть того, что нужно сделать: какой софт имеете, какие задачи стоят и какой функционал реализовать в какой последовательности А насчет лички у меня одинаковое отношение ко всем - читайте подпись Цитата:
|
а я и говорил'так не хочу', 'то не хочу' ... просто у меня не получается сделать задуманное... я с nsis худо бедно работаю а msdn вообще темный лес...
|
Vincent7, ну не судьба, зачем насиловать себе мозг и K.A.V. ?
|
Цитата:
например: ${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 |
Цитата:
Сообщения WM_SETTEXT почему то не передаются в консольное окно (у меня так, может чего не учёл...) Говорят, можно использовать WM_COPYDATA или SendMessageTimeout, не пробовал, да и возиться неохота... Но можно "набрать" команду в консоли с помощью WM_CHAR. Лажа вообщем то, но работает... Например, пошлём в консоль и выполним команду DIR : Код:
OutFile ConsoleWindow.exe |
MKN, я делаю так
Код:
!include "WinMessages.nsh" |
Цитата:
Цитата:
Код:
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe" Цитата:
Цитата:
|
Код:
Caption "PressKey.exe" |
Цитата:
Цитата:
Очки наденьте :read: тяжелый случай, у меня не хватит терпения, я пожалуй пас... Цитата:
|
Vincent7, после первой строки === Hello, Vincent7 !!!== поставьте кавычки ( " ). Дальше - не знаю, т.к. приведенный огрызок даже не скомпилируется.
|
Цитата:
Он бы уже давно справился со своей задачей с нашей помощью, но ему нужен готовый код и как можно скорее, поэтому и пытается максимум это скопировать готовые строки и перемешать их местами для имитирования того, что в чем то пытался разобраться... Вот мой код и очень даже рабочий... 817 |
Цитата K.A.V.:
Цитата:
Цитата K.A.V.: Цитата:
Цитата:
|
Прошу помочь в написании скрипта для чтения ini-файла, и исходя из его содержимого
создание ярлыков (либо в Меню Пуск - Все программы, либо на Рабочем столе). итак, при запуске надо обратиться к файлу settings.ini, находящемуся по адресу $WINDIR\MYPROGRAM\ и если его нет, то завершить работу. Если settings.ini есть по указанному адресу, то поочередно обработать его секции для создания ярлыков. при этом settings.ini может редактироваться... вот примерное содержимое ini-файла: Цитата:
|
Объясняю. Имею консольную программу распаковщик. Туда нужно вводить команды, нажать' enter' он и начнет распаковывать. С помощью nsis я хочу все это автоматизировать и упростить, сделать GUI к этой программе.
P.S. извиняюсь за криво скопированный код K.A.V.'а, копировал с мобильного телефона т.к. был на работе, а копировать с оперы мини неудобно. P.P.S. Я поменял строки в своем коде на правильный порядок, но все равно не работает. |
Цитата:
Там же есть примеры создания ярлыков. Цитата:
Вот и сделай свою страницу с элементами соответствуюшими задачам и командам, и оформляй сообразно фантазии. |
Это я и пытаюсь сделать...
|
Vincent7,
Попробуй сам реализовать хотя бы такой примитивный сценарий : На кастомной странице создай пару обзорных кнопок - одну выбрать файл для распаковки, вторую - указать целевой путь для распакованного. Можешь добавить текстовые поля для ручного ввода путей. Путевые данные из переменных включи в команду распаковки. А саму распаковку запускай (можешь с помощью уже известных тебе плагинов) ещё одной кнопкой. Для начала всё. Потом уже добавляй нюансы распаковки, наверняка задаваемые разными ключами. И назови в конце концов, что это за такой у тебя рапаковщик и чего он должен делать... Ежели чего не будет получаться, вот тогда - код в студию и только тогда есть смысл тебе помогать дальше и что то разжевывать... По моему, именно отсутствие вышеназванных таких твоих действий и возмущает коллег... |
Я хочу для начала разобраться с отправкой в консоль команд, а потом уже все остальное прокручивать. Но пока не выходит :(
|
Цитата:
|
А как же тогда делать? Ведь программа консольная... вот, посмотрите http://cs.rin.ru/forum/download/file.php?id=13154
|
Цитата:
Цитата:
Ваша задача решается за 1 минуту без "необходимых" вам извращений в коде Создайте bat-файл следующего содержания: Код:
sisInstall Что такое bat-файл читайте также в интернете, готовый вам давать не буду |
K.A.V., а на что мне этот bat файл если мне нужно gui создать..
|
Цитата:
Цитата:
Вы не знаете, что в итоге получите от запуска вашего приложения в таком виде (через bat-файл) и уже спрашиваете, зачем это делать Теперь я буду уговаривать вас здесь неделю найти различия и почитать, что такое консольное приложение? Здесь тема по помощи в скриптах NSIS, а не в обучении совсем новичков (как вы, которые не знают, что такое консольное приложение и для чего оно нужно) и здесь мы не разжевываем знакомство с миром перепаковки с самого начала. 1. Научитесь искать информацию в интернете 2. Научитесь слушать и прислушиваться к тем, у кого сами просите помощи, по крайней мере в этой теме - всё, что вам здесь будут советовать просто так не пишется, во всём будет смысл. Если я вам сказал, что вам нужно сделать bat-файл и запустить его в папке с вашей программой - значит это не просто так Наше дело - дать вам советы, если вы чего-то не знаете или не понимаете, ваше дело - отказаться, но тогда какой смысл просить помощи, если вы не зная результата уже можно сказать отказываетесь?? |
kotkovets, прошу прощения за беспокойство, снова проблема с WinVer2.
Windows XP x86 со старой версией библиотеки определялась нормально - как "WinXP", теперь же это "Win32s". Баг? NSIS 3.0a1, Unicode. |
K.A.V., от этого батника мне пользы никакой нет. Я же писал- хочу автоматизировать и упростить процесс распаковки. Понимаете, в процессе программа будет просить нужные файлы, просить второй диск, а я хочу заранее в nsis задать все нужные данные в переменные, и исходя из сообщений распаковщика автоматически посылать их программе, чтобы вводить ничего не нужно было в процессе распаковки.
|
Цитата:
Здесь, я думаю, кроме меня есть и другие люди, которые читая ваши сообщения недоумевают с вашей твердолобости и упрямости |
Цитата:
Код:
unicode true |
Цитата:
|
Цитата:
Если разберусь, отредактирую свой пост. Спасибо. |
Цитата:
|
Воспроизведение MP3 файлов
MP3 можно проигрывать с помощью известного кода : http://nsis.sourceforge.net/Play_Sound или с помощью bass.dll, что гораздо удобнее и более гибко (если знать вызов всех команд...) Код:
!define BASS_DLL "bass.dll" |
Цитата:
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, за себя отвечайте
|
Цитата:
Что касается вашего высказывания - посмотрите, кто в данной теме (и чей ник в авторстве справочника NSIS) постоянно отвечает пользователям и помогает писать NSIS скрипты, а потом посмотрите на ваши сообщения в этой теме и попробуйте что-то сказать про себя, посмотря на все свои сообщения со стороны. А вообще, наверное, нужно игнорить подобных "уникумов", которые не прочитав справочник от страницы до страницы, приходят сюда и задают вопросы, которые уже там описаны, мы здесь всем пытаемся помочь по возможности, но я уже в этой теме много раз говорил - поможем, если у вас у самих есть желание что-то изучать и делать, в противном случае, если: 1. Я не знаю что это и что мне это даст, но это мне не нужно 2. Дайте полностью рабочий код 3. Не хочу ничего читать 4. Просто нужен такой функционал то данная тема не для вас. |
Цитата:
|
Цитата:
Консольные приложения имеют командную строку (команды), которые передаются непосредственно в момент запуска этого приложения и команды сопровождаются ключами/параметрами/значениями и т.д. То, что вы посылаете текст в консольное приложение, а не исполняете его через его командную строку говорит о том, что вы мало чего понимаете в этом, вот мой вывод. |
Функция NetWkstaGetInfo возвращает информацию о конфигурации рабочей станции (имени домена, локального компьютера, информацию о OC)
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx Код:
Outfile "NetWkstaGetInfo_test.exe" |
K.A.V., но ведь для выполнения команды нужно напечатать например' C:\папка_с_манифестом'
|
Цитата:
Писать как попугай и объяснять всё по миллион раз мне надоело, я вам просто тонну инфы уже выложил, а вы как умолишенный (простите, но со стороны это выглядит именно так) упёрлись в ваши "знания" и пытаетесь с их помощью что-то сделать. На все ваши вопросы я уже ответил, либо идите с самого начала читать все мои ответы, либо прошу модератора избавить уже эту тему от издевательских сообщений от данной личности. Раз Два Три |
K.A.V., да не отвечай на вопросы, ибо на его писательство не стоит попросту обращать внимания
убрать оффтоп - дело техники модератора |
Попробовал применить скины к инсталлятору с помощью ISSkinEx (MKN)
На некоторых скинах BrandingText выгладит неопрятно. ![]() Например: скин tiger Можно ли что-нибудь сделать? В Справочнике NSIS есть пример изменения цвета BrandingText. В стандартном примере скрипта (WelcomeFinish.nsi) - прекрасно работает. В различных примерах со скинами (см. ссылку MKN выше) - нет. И что самое обидное ( :lamer: ) в моем, вполне рабочем скрипте без скинов, самодельных окон - в общем, довольно простеньком - тоже не работает. Хотя особой надобности что-либо делать с BrandingText нет - отображается вполне прилично. Есть ли ограничения применения этого примера? Или что необходимо учитывать? |
Цитата:
Самый удачный "кожезаменитель" для NSIS, по моему - это SkinH.dll. Для однокнопочных конструкций можно сделать забавный фейс инсталлятора - в виде круга. Функция , проделывающая это, уже описывалась ранее. Код:
!include nsDialogs.nsh Но у меня не получилось - полностью закрасить круг. ( с прямоугольным окном получается). Как это можно сделать, у кого какие соображения ? |
Цитата:
Код:
Function mypagecreate |
Цитата:
а можно убрать у окна заголовок, удалить стиль заголовка, но переместить окошко тогда не удасться |
Цитата:
Самое простое - запускать вместе со скриптом утилитку для этого (типа MoveInactiveWin). Но так не интересно... В то же время пишут, что можно сделать так : http://computista.ru/030600.shtml или использовать сообщение WM_NCHITTEST, которое есть даже в WinMessages.nsh. Только как это сделать на практике ? |
Цитата:
|
Цитата:
|
Никто не знает как в скрипте NSIS вызвать LaunchAdvancedAssociationUI для заданной программы?
(How to call LaunchAdvancedAssociationUI). |
Цитата:
Был такой код по теме : Код:
!include LogicLib.nsh ( http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx ) А ты, как мне кажется, хочешь замутить канитель, именно применимо к ассоциированию в Win8 ? (а для других ОС и мутить нечего - всё ясно и традиционно...) |
Цитата:
!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 Цитата:
|
Цитата:
|
Цитата:
Применил данной способ в своей сборке Light Alloy. http://forum.oszone.net/post-2277381-247.html Интерфейс открывается только на Win 8, и только если при выборе компонентов была выбрана хоть одна ассоциация (и не в тихом режиме). Можешь познакомиться для интереса. |
Цитата:
А ковыряться с выбором ассоциаций после установки - это лажа. |
Друзья, вчера вышла новая версия NSIS( NSIS 3.0a2 ), обновляемся
|
Цитата:
Цитата:
|
Сам был в шоке, полез за сорцами, а там новая версия висит :)
|
Страница-фейс инсталлятора в виде круга.
С появлением рождественского подарка от винамповцев, библиотеки для перемещения окна за любую точку - можно завершить и затею с круглым фейсом. Выглядит это так (ессно, как вариант) : Код:
!addplugindir . Правда хотелось таскать фейс с рисунком в качестве фона, но что то у меня перетаскивание при этом не работает... Ну да и ладно... |
Всем привет!
Кто-нибудь собирает себе NSIS из исходников? Вопрос вот в чем. Пробую компилировать NSIS в среде MS Visual Studio 2008 (все настройки по умолчанию). Все чудесно, все собирается, но... не могу понять, почему размеры файлов с шаблонами диалоговых окон (в папке ..NSIS\Contrib\UIs\) у меня получаются больше, чем в официальном релизе? Оригинал ![]() Моя компиляция ![]() А у вас как? Случаем не знаете, что нужно сделать, чтобы размеры получались меньше? Или не заморачиваться по этому поводу? Другой вопрос. На сайте загрузки есть архив с названием nsis-3.0a2-strlen_8192.zip. Как надо изменить исходный код программы, чтобы сразу компилировать это "strlen_8192"? |
Цитата:
|
Цитата:
|
Цитата:
По правде сказать, я не знаю. Просто решил попробовать и посмотреть что получится. Делаю все так, как написано у разработчика в рекомендациях по сборке NSIS. Установил Python, SCons, Zlib, WxWidget и Microsoft Visual C++. Потом просто в командной строке, из под каталога с исходниками NSIS, набираю scons dist-installer и нажимаю [Enter]. Выполняется компиляция и создание дистрибутива. А про Debug или Release там ничего не сказано. Но судя по вашему вопросу, подозреваю, что сборка выполняется Debug. Чтобы знать наверняка, надо будет сценарии scons просмотреть. Спасибо за наводку! |
Здраствуйте.
Вопрос такого рода: как добавить к инсталятору дополнительные ключи тихой установки, потипу: /S /RU устанавливается русская версия программы, /S /EN английская соответственно. |
Цитата:
|
K.A.V., ну да, это как хочешь узнать из учебника географии про Японию, но тебя для этого посылают читать весь учебник =)
ну а если серьезно.. я читал справку, даже полную справку читал, но я не смог разобраться как это все устроено. И собственно вопрос: может есть посты, где можно об этом почитать, тема, раздел, кто нибудь из людей поможет... 2ой вопрос: в кастомной странице (nsDialog) добавил картинку, потом сделал так чтобы картинка менялась при переключении радиобутонов.. все хорошо все меняется, но взял я скомпилированный exe файл и запустил на другом ноутбуке и там нет картинок (но появились когда я их положил рядом с exeшником). Как интегрировать их в ехешник? 3ий вопрос: проблема касается переменных, а в данном случае $DESKTOP. В моей системе папка Десктоп перенесена на диск Д (D:\Desktop), но переменная определяет старый путь (C:\Users\SateneX\Desktop). Это как нибудь лечится? или придётся извращаться с выдиранием значения пути рабочего стола из реестра? |
Цитата:
Цитата:
Вам нужно читать команды (для обработки ключей) "Перевод справки NSIS => GetParameters" "Перевод справки NSIS => GetOptions" А как вы там уже будете это обрабатывать - не знаю, либо вызов определённой функции (в функции Перевод справки NSIS => Стандартные функции => .onInit) в зависимости от указанного ключа, в которой будет происходит распаковка нужного файла локализации...не знаю, смотрите сами Цитата:
"Перевод справки NSIS => File" Цитата:
|
Как сделать что бы программа (к примеру "Starus FAT Recovery") запускалась от имени администратора?
ExecWait "$EXEDIR\${APPDIR}\${APPEXE}" |
Цитата:
|
Цитата:
Код:
Function .onInit UPD. RequestExecutionLevel (юзер, админ, хайт) вот что было нужно |
добрый вечер всем.
Не подскажите как сделать так чтобы на этапе инсталляции файлов при установки определённого компонента появлялось маленькое окошко например с таким содержанием "установка директХ" и соответственно когда компонент установился окошечко закрывалось. |
Цитата:
Код:
!include "WinMessages.nsh" Код:
Section "Установка DirectX" |
K.A.V., благодарю.. а иконку нельзя убрать в диалоговом окне?
|
Цитата:
Код:
Banner::show "Подготовка к установке..." Код:
!define MUI_UI "файл ресурса.ехе" |
Вложений: 1
Доброй ночи =)
kotkovets, вот тут вы выкладывали модификацию плагина InvokeShellVerb столкнулся с проблемой или неисправностью данного.. приступим к описанию: Имеею 2 рабочие (x86 и x64) и 1 виртуальную (x86x64) машины. Прописываю дефолтный путь установки InstallDir "$PROGRAMFILES\...." ну и вставляю в код ${PinToTaskBar}, все хорошо прикрепляется и исправно работает в 32 и 64 битных системах. Далее изменяю путь на InstallDir "$PROGRAMFILES64\..." затем вставляю в код ${PinToTaskBar}, компилю.. на 32 битной системе все хорошо открывается, а на 64битной создается значок на панели инструментов, но при открытии приложения через него (ну или само приложении из директории) они не стакаются, т.е стоят в панели 2 иконки 1ого приложения одна мертвая 2ая запущенная.. прикрепил картинку: 1ое свойства ярлыка 2ое свойства процесса 3 возможность прикрепления хотя пути нахождения программы одинаковые.. и так со всеми программами из данной директории з.ы. иконка оживает только в том случае если через нее запустить приложение от администратора |
Цитата:
Попробуйте так: Код:
InvokeShellVerb::DoIt "$ProgramFiles64\папка программы" "файл запуска" "5386" если проблема осталась.. то, остается у вас косяк или в плагине. |
kotkovets, и так тоже пробовал как вы описали.. даже находил похожее проблемы на забугорных форумах..
проблема только в х64 винде при попытки установки в обычный program files (без х86.. воссоздать проблему легко достаточно сменить дефолтный путь установки в c:\program files\XXXXx скорее всего дело в плагине( |
Удалено
|
Цитата:
|
K.A.V., я в курсе, забыл тебя предупредить..
|
Друзья, нет повода для шума... А вот то, что справочник давно можно было и дополнить и расширить виноваты мы все... И я есно тоже... Ленивы однако... :)
|
Цитата:
Попросите модератора изменить автора темы Справочник по NSIS на себя или на Krinkels, удалите меня из авторов, чтобы не нужно было в будущем меня даже информировать об изменениях в справочнике И удачи вам в развитии справочника, в этой теме я больше не появлюсь |
Ну вот, договорились... Причастные к недоразумению - надо что то срочно делать... :) Жаль не в одном городе живём. Устроили бы рождественскую встречу и всё мирно разрешили.
|
K.A.V.
Не нужно горячиться, я лишь хотел сделать как лучше. Но если никому мой труд не нужен я могу спокойно все удалить, и отредактировать свой пост, как будто и ничего не было. |
|
Цитата:
![]() Во всем документе есть несколько таких мест |
Цитата:
Цитата:
Кто автор справочника? kotkovets? Он всего-лишь со-автор статей, большого количества статей в справочнике, поэтому я и указал его ник на главной странице справочника, т.к. пока я отдавал долг родине - он дополнял справочник информацией. Видимо, не нужно на главной странице было указывать никого, кроме себя, чтобы не было проблем с "двойным авторством" С чего вы вообще решили, что kotkovets главный автор и если он говорит "разрешаю" (допустим, так и было) - то вам разрешено? Кто автор публикаций новых версий справочника здесь и здесь? А то, что вы на свой ник в справочнике установили ссылку на свой сайт, на котором распространяетчся варез - это во-первых нарушение ОПК, во вторых - все ссылки ников должны идти на профили участников на данном форуме. И вам никто не давал право распространять "вашу новую версию справочника" по сторонним ресурсам, в т.ч. и через ваш варезный сайт, на каком основании это всё сделано? Пропиарить ваш варезник засчет справочника? --- |
K.A.V.
Справочник удален, и все что с ним связано. Но раз такое отношение, я теперь палец о палец не ударю чтоб хоть как то его улучшить или сделать более красивым. З.Ы. Если уважаемый K.A.V., либо кто то еще, более достойный чем я, соберется добавить подсветку в справочник, то пусть пишет в л.с., я скину все свои наработки и расскажу что стоит доделать/исправить. |
Цитата:
Цитата:
Нужно делать всё правильно (возможный вариант развития событий я написал выше в скрытом тексте), а не так, как вы: захотели, сделали и выложили И вы ещё говорите о "таком отношении", а у меня к Вам какое отношение после этого должно быть, как вы думаете? Вам будет приятно, если кто-то взломает ваш сайт и изменит на нём оформление по своему вкусу, вбив на главную страницу сайта свой ник и ссылку на свой сайт, при этом сказав, мол, "мне так нравится, смотрите, что я сделал"? |
NSIS x64 инсталлятор
Друзья! Подскажите пожалуйста, есть NSIS скрипт инсталлера, собственно он собирает 32 битный установщик, работает хорошо, все отлично, но тут встал вопрос - нужно пересобрать установщик под х64, ибо 32 битный инсталлер, ставит нужные мне файлы не в system32,а в C:\Windows\SysWoW64. По этому у меня возник вопрос - придется все
заново переписывать, или есть хитрый способ пересобрать готовый скрипт под х64? Какие подводные камни могут встретится на этому пути? пытался пошерстить по сети, но путного мало чего нашел, в основном описываются х32 случаи. Буду рад любой помощи! Спасибо за внимание. |
Читай здесь:
Цитата:
Пример использования PROCESSOR_ARCHITEW6432 в батнике: Цитата:
|
Код:
!include "x64.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 можно задавать ассоциирование файлов "в лоб", когда в реестре сначала удаляются существующие системные связи, а затем создаются вновь с нуля. Этот метод хотя и работает, но явно не правильный... |
MKN Спасибо
|
Цитата:
Вообщем, у меня получилось заменить в файле по hex смещению одни байты на другие, при открытии файла мы не можем открыть его для перезаписи определённых байт, а только добавить, у меня получилось произвести именно замену байт без смещения :tongue: Вообщем, может кому пригодится, делюсЯ Код:
FileOpen $0 "C:\Users\APTEM\Desktop\123.exe" a Если указанного файла не существует, то он будет создан с этими строками. Код:
FileOpen $0 "C:\Users\APTEM\Desktop\123.exe" a |
Цитата:
http://www.cmake.org/Wiki/CMake:CPac...enerators#NSIS |
Кто нибудь может подсказать можно ли как-то определить букву логического диска на котором записан сам nsis скрипт? И еще интересует можно ли получить путь к файлу скрипта. В справочнике в GetDrives не нашел такого.
|
Цитата:
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х битный инсталлер, в чем тут кроется причина? где я ошибаюсь? Спасибо, премного благодарен за внимание. Цитата:
|
Цитата:
|
Цитата:
Цитата:
Код:
${GetRoot} "C:\Program Files\NSIS" $R0 |
Цитата:
Например: !define pkgdir "D:\NSIS". Но при запуске из под разных ОС, расположенных на разных логических разделах буква диска определяется по разному, и приходится править скрипт перед запуском |
Цитата:
В частности, не привязывать плагины к конкретному местоположению. Достаточно в скрипте указать : !addplugindir . ( или указать иной уровень вложения) и "положить" нужные плагины рядом со скриптом. |
Цитата:
По сути можно воспользоваться обычной командой StrCpy по отсеву первых 2-х символов в строке пути, о команде StrCpy написано в нашем справочнике Цитата:
Цитата:
Код:
!addincludedir ..\include Цитата:
Код:
!addplugindir myplugin |
Определение кодовой страницы
Функция 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" |
Подскажите, как установить ограничение на количество вводимых символов в текстбокс?
|
Цитата:
|
Цитата:
${NSD_SetTextLimit} $Password_Text 5 ${NSD_SetTextLimit} $Password_Confirm 5 А точнее, используй http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html Код:
${NSD_SetTextLimit} control_HWND limit |
Спасибо. А как сделать чтобы в текстбокс можно было вводить только цифры?
|
Цитата:
Код:
${NSD_CreateText} 0 0 100% 12u "1234567890" |
Благодарствую.
|
Ввод цифрового пароля (в примере - это 77777 ) с сопроводительными сообщениями можно организовать и так :
Ессно можно ещё расширить параметры проверки пароля - проверять количество вводимых символов, разбивку на группы (если надо ), сразу вызывать сообщение , если ввод не верный и т.д. |
Появился новый "шкурный" проект для NSIS : VCL Styles for NSIS
http://theroadtodelphi.wordpress.com...yles-for-nsis/ Но размер NSISVCLStyles.dll явно велик, что не есть хорошо... |
Цитата:
Вот парни написали скрипт (может, и девушки), а написать инсталлер своего же скина нормально не смогли, сидел тупил сейчас пару минут, хотел сразу после установки скомпилить скрипт примера, а мне компилятор такой говорит Цитата:
Вообщем, у кого ОС 32-bit, бегите за файлом плагина в папочку C:\Program Files (x86)\NSIS :biggrin: кстати, пока бродил по папкам увидел редакторы скинов, запустил, посмотрел пару минут - вроде всё выглядит довольно серьёзно и на первый взгляд - подход разрабов нравится |
Цитата:
А с установкой автор действительно промахнулся... У меня эта DLL вообще никак и никуда не попала. Пришлось просто извлечь её из установщика. |
Цитата:
Сейчас же, этот мегабайт особого веса не придаёт, если учесть сжатие и объёмы данных, которые пользователям вообще приходится качать в наше время...К тому же, что это за установщик на 100К? Распаковать пару своих фоток? ;) Всё равно, для альтернативы пойдёт (к тому же, если присутствует встроенный редактор скинов), хоть какое-то разнообразие в поддержке скинов+составление конкуренции другим разрабам подобных плагинов |
Цитата:
|
Проигрывание WAV-файлов
Код:
!define SND_ASYNC 1 Минимум ОС: Win2000 |
Скажите, почему в onclick функции не срабатывает abort?
Код:
${NSD_OnClick} $button click |
Код:
Function func |
Код:
!include "nsDialogs.nsh" |
Цитата:
У меня ваш скрипт отрабатывает корректно, т.е. Первое сообщение есть, второго сообщения нет, потому что срабатывает команда Abort abort - прекращение выполнения команд ниже данной команды, а вы какой функционал от неё ожидаете? |
Я жду закрытия программы. А на что еще нужен аборт?
|
Цитата:
Попробуйте "Quit". |
Цитата:
Команда для закрытия инсталлятора - quit abort - прекращение выполнения команд ниже данной команды |
Ясно, спасибо. Совсем забыл про quit
|
Как ни странно, но с Quit результат такой же как и с Abort.
|
Цитата:
Не знаю, может как-то решается это дело в скрипте, кто пишет на nsDialogs может и подскажет вам, я пишу диалоги на IO Для решения вашей проблемы могу посоветовать использовать не команду quit, а посыл сообщения Windows на закрытие окна инсталлера, вот пример кода: Код:
!include "nsDialogs.nsh" |
Спасибо,работает. А как сделать вот такое- если в текст боксе вводят число меньшее, чем уже заданное там число, то выходе из текст бокса, это число автоматически менялось на заданое изначально число?
|
Цитата:
Цитата:
Цитата:
Цитата:
|
K.A.V., при выходе из контрола, то есть при наведении курсора на любое другое место на странице
|
Цитата:
|
Цитата:
Если так, то это можно организовать с помощью GetCursorPos с последующим определением GetClassName для места нахождения указателя и дальнейшей логикой сравнения - если GetClassName=Edit, то курсор мыши находится в области текстбокса, если нет, то посылаем в текстбокс нужные циферки. Где то такой код уже был... |
|
добрый вечер.. имеются 2 страницы созданные с помощью nsDialog.. нужно чтобы при активации CheckBoxa на 1ой странице пропускалась 2ая, ну и соответственно наоборот если CheckBox не отмечен, то отображается 2ая страница
|
Код:
function page 2 |
Цитата:
Цитата:
Цитата:
Либо так: Код:
Function func Код:
Function func |
Цитата:
|
Цитата:
2. Запутанно 3. Увеличение числа команд, которые мало того, что создают некрасивую, запутанную конструкцию, да ещё и используются все возможные команды, без которых нужно было обойтись, если вы предлагаете if конструкцию --- Цитата:
Правда в такой ситуации, что, создавать только таймер и по нему определять, внесено ли в поле изменение? Или как? Я, к примеру, никогда не печатаю держа курсор на элементе - он меня смущает :biggrin: Какую тогда логику в коде строить? Проверка через X-секунд, вводилось ли значение в поле и потом определять, находится ли курсор над тексбоксом? Как-то не очень стабильно мне кажется... |
Vincent7, K.A.V., блогодарю сделал по аналогии
Код:
Function page1Destroy |
Цитата:
Но для начала на запрос : Цитата:
Мне вот стало интересно решение этой задачи в совсем другом ракурсе практики... Ну да ладно. Если взять ранее предлагаемый пример с вводом пароля, то отследить нахождение указателя можно, добавив в Function EditNotify такой код : Код:
System::Alloc 8 PS Также меня интересует, каким образом отслеживать клики нужных кнопок мыши и как организовать комбинированные нажатия на кнопки, совместно с выбранным символом клавиш. ( Например, на странице есть кнопка, нажав которую совместно с цифрой 1 - запустится или получится одно действие, а нажатие той же кнопки, совместно с цифрой 2 - другое. И т.д. для любых сочетаний символов, в том числе и без нажатия кнопок - только с клавиатуры... Вроде как для этого можно использовать GetAsyncKeyState... Только не получается... |
Цитата:
Цитата:
Цитата:
Если юзать GDI32, как у меня сейчас в коде (тоже не знал как делать, после твоего первого сообщения с упоминанием PtInRect полез по MSDN), то там создаётся регион от размера элемента (так сказать "невидимые границы"), и потом вызов функции проверки, находятся ли указанные координаты (в нашем случае положение курсора мыши) в пределах этих "невидимых линий", вроде бы тоже работает, если мне не показалось :) Цитата:
Цитата:
|
Цитата:
Код:
Function func |
Цитата:
Цитата:
Цитата:
зы Пока калякал, ты уже нашёл этот пример. :) |
Цитата:
Если нажать кнопку и отжать - возвращается 1 (была нажата) Если не была нажата кнопка - 0 Цитата:
Она сразу возвращает статус всех кнопок, только вот в функцию передавать нужно массив, а как это сделать - я не в курсе, может, Вячеслав подскажет Либо наверное, придётся юзать в таком случае плагины NSIS для работы с массивами, не знаю даже |
Привет, други.. :)
Пошарился тут по заказникам разрабов, но так толком и не нашел нормального описания по работе с ртф файлами.. Интересуют редактирование текста, кодировка, стилистика и т.д.. Что-нить по этой теме есть вообще с возможностями редактирования приближенными к редактору ?! |
Цитата:
Может, какие и консольные приложения есть для работы с RTF, не интересовался таким функционалом |
Цитата:
Цитата:
Только RTF формат давно морально устарел. Если уж форматы Microsoft Office 1997-2003 (.doc, .xls, .ppt) уже считаются архаичными (http://habrahabr.ru/post/152427/), то кому нужно это бесполезное старьё RTF... |
Эм...
Цитата:
Цитата:
|
Цитата:
Я же вам дал наводку, RTF файл это тот же текстовый документ, но с особым содержанием, хотите разобраться - читайте доки в инете по типу той, что я вам указал в ссылке про формат файла А для "создания и редактирования" RTF файлов есть софт, NSIS никак не связан с файлами любого типа, его задача - упаковать и распаковать, всё. Максимум - показать RTF файл в виде информации или лицензионного соглашения |
Цитата:
Специализация заключается в подсветке синтаксиса программного кода и наличия специальных стилей-шаблонов, ну и конечно инструментов поиска-замены, создания макросов операций и пр. удобства, очень ускоряющие работу. В частности для написания NSIS скриптов. Таких редакторов много ( http://ufprograms.ru/pages/text/besp...redaktory.html ). А лучший , на мой взгляд, - Notepad++ . Выбирай сам на свой вкус. А RTF здесь и рядом не валялся. :) Цитата:
RTF и тут вообще не при делах... |
Цитата:
Спрошу иначе, есть ли в Нсис возможности, для создания форматирования текста в файлах ртф. для txt-файлов точно есть команды, прописываемые в строку по тексту... а здесь? Цитата:
Например есть определенный код, в нем: пишу команду создания файла а далее, построчно или абзацами закидываю текст на 8 языках с его форматированием: размер, обычный, курсив, жирный, разрядка, выравнивание, шрифт и цвет текста. закрываю запись в файл сохраняю. В итоге, в каталоге инсталл будет требуемый файл *.rtf Notepad++ я и так использую ибо работаю с ЮТФ версией Нсис.. |
Цитата:
Цитата:
|
Цитата:
И потом, как же не игнорировать, если спрашиваю про возможности Нсис для форматирования текста в ртф, а в ответ получаю рекомендации на тему редактирования этих файлов внешними текстовыми редакторами и прочее... ?! Т.е. тот код по вашей ссылке внешне похожий на Си(вроде как) отработает в инсталлере или нет, если его указывать? Пример хотя бы увидеть какой, дальше сам разберусь. |
Цитата:
Цитата:
Откройте любой RTF файл через текстовый редактор, сколько ещё раз нужно это повторить, чтобы вы попробовали это сделать? Цитата:
Вот пример RTF файла, в котором написано: Windows 7 Ultimate Код:
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fnil\fcharset0 Calibri;}} |
Цитата:
Спасибо. :) |
Всем привет, при написание инсталлятора столкнулся с проблемой добавления нужных записей в реестр, делаю все по справочнику:
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. Буду благодарен за помощь :) |
TretyakRoman, скорее всего у вас всё переадресуется в Software\WoW6432Node. Перед командами записи в реестр напишите такое: SetRegView 64
|
Помогло, буду дальше развивать свои навыки в NSIS. Спасибо большое.
|
На странице компонент пользователь отмечает нужные. Как для каждой из них указать свою директорию?
Понимаю, что вопрос туп, справочник и руководство причитал. Спасибо. |
Цитата:
|
Цитата:
Как при отметке определённого компонента изменить каталог установки? Или как создать для каждого компонента отдельное запоминание папки? |
K.A.V, нужно чтобы для каждого выбранного компонента пользователь мог сам выбрать путь, просто записать его в скрипте нельзя.
MKN, я так понял это примерно то что нужно, только код приведенный там не компилируется. PHP код:
|
Код:
var Component1Dir |
я так понимаю, что мы объявляем две константы времени компиляции. В эти переменные заносится результат возвращаемый Component1Dir например, вызывается макрос и вываливается ошибка в самом макросе:
PHP код:
|
Цитата:
Код:
var Component1Dir |
Спасибо, все работает. Если можно еще пару вопросов, просто хотел бы разобраться:
1. PHP код:
2. Попробовал переделать функции таким образом: PHP код:
|
Цитата:
Справочник по NSIS => Перевод справки NSIS => SectionGetFlags + Справочник по NSIS => Перевод справки NSIS => StrCmp Цитата:
Справочник по NSIS => Перевод справки NSIS => Section У вас секции без индексов (в ссылке, данной MKN изначально код не совсем рабочий), а в моём коде там поправлено, смотрите внимательней Было (без указаний идентификаторов секций, как у вас сейчас): Код:
Section Component3 Код:
Section TEST3 Component3 |
По моему, идея использовать стандартные страницы PAGE_COMPONENTS для выбора INSTDIR - не удачная...
Ладно, когда компонентов 2-3, а если 10 или более ? Задолбаешься страницы перелистывать и вообще забудешь для какого компонента чего выбрать и уже выбрал... Такие вещи надо делать на кастомной странице, где всё удобно и наглядно. |
Читал и то и другое, я так понял, что полсле опрератора должны идти метки, типа isless, isequal и т.п.
А такая форма StrCmp $R0 "1" +2 0 означает, что если R0==1, то пропускаем следующую строчку? Но тогда мы просто попадаем на EndFunction, каким образом в этом случае срабатывает механизм отмены показа страницы? По SectionGetFlags вопросов не было. Да, идентификаторы я не заметил, а как они влияют на выполнение функций? Мы то вызываем SectionGetFlags ${Component1}, т.е. по имени обращаемся? MKN, подскажите каким образом это сделать? Про кастом пайдж прочитал в справочнике, но как реализовать не совсем понятно. |
и вдогонку, перед !insertmacro MUI_PAGE_COMPONENTS пишу !insertmacro MUI_PAGE_WELCOME - свал,
Error: resolving install function "Nsis2Io" in function "mui.WelcomePre_23.5.9" Error - aborting creation process |
Цитата:
Число +2 здесь означает, если значения равны, то пропустить одну команду, относительно команды StrCmp Цитата:
Цитата:
Цитата:
Ищите проблему в своём скрипте, при добавлении строки Код:
!insertmacro MUI_PAGE_WELCOME Цитата:
Или вам опять персонально из справочника примеры со странички nsDialogs скопировать сюда? p.s. здесь не чат, если вам ещё не ответили на ваше сообщение, редактируйте его, добавляя информацию |
Цитата:
Примеров тьма и в теме и в сети. |
не злитесь.
за помощь спасибо |
Доброго времени суток Ув.Форумчане!
Вопрос по NSIS, возможно ли сделать так как здесь: http://fixila.com/download/FixilaPlus.exe кто не хочет качать объясню с радостью. При запуске инсталлятора на странице приветствия есть ссылка на лиц соглашение. 1ый Вопрос - Возможно разместить ссылку в описании на странице приветствия? Далее идет необычный выбор компонентов, а именно, после приветствия на след странице можно ставить, либо не ставить галочку для установки программы, нажимаем - NEXT похожая страница, только уже другое название программы. Тобишь, страница выбора компонентов разделена на несколько страниц, вместо одной. 2ой Вопрос - Возможно ли такое сделать в NSIS (несколько страниц выбора компонентов, только на одной странице одна галочка)? Так как я не знаю в чем собран данный SETUPник ну и 3ий Вопрос - Можно ли установить фон, на страницАХ выбора компонентов. Спасибо! |
Цитата:
Цитата:
Приведу сразу пример кода, т.к. вроде бы не видел ещё данной необходимости у кодеров, может, ещё кому пригодится для других нужд Цитата:
Читали? Походу нет Цитата:
|
Цитата:
1. По поводу ссылки, я имел ввиду вообще ссылку на что то )(Это для справки) Это у меня кстати частично получилось: http://nsis.sourceforge.net/Add_link...come_page_(MUI) Единственный минус в том что нужно вводить квадрат видимости ссылки который перекрывается страницу, то есть - Текст Ссылка - сделать можно, а Текст ССылка Текст - не получается, белый фон перекрывает текст что ниже ссылки.(по крайней мере у меня) 2. Читал справочник, и по nsDialogs, но я пока не могу разобраться в назначении действий, Т.е - чтобы при нажатии на чекбокс выбиралась программа для установки, а не просто "клацалась" галочка, чтобы при нажатии кнопки "Назад" выполнялось соответствующее действие. Еще Я пробовал через HM NSIS Edit создать страницу, создал, все в точности как мне нужно, кнопки расположенны в нужных местах, но я не пойму как кнопке назначить действие - назад , вперед и тд(как выше описано). (Делал кстати по справочнику Обучение IO собственные странички) В общем смысл таков что у меня в принципе получается создать похожее на то что я хочу, но я не могу назначить само действие. 3. Кстати вопрос назрел, переместить кнопку, тоже через nsDialogs можно? |
Цитата:
|
Цитата:
Вы просили ссылку в тексте, как в указанном вами установщике - я вам дал готовый код Цитата:
Код:
${NSD_GetState} $CheckBox $R0 Код:
${NSD_CreateCheckBox} 0 45u 100u 10u "Можно отметить флажком" Цитата:
Воспользуйтесь поиском в теме по фразе "nsDialogs", много примеров здесь найдёте Цитата:
Код:
.\NSIS\Contrib\UIs Код:
!define MUI_UI "путь к exe файлу" |
Цитата:
Спасибо за полезные ответы, очень признателен. |
Почему-то после установки NSIS 3.02 HM NIS Edit 2.0.3 не может открыть скомпилированный файл.
--------------------------- Win32 Error. Code: 2. Не удается найти указанный файл. -------------------------- Вручную файл нормально запускается. |
Цитата:
Я вообще через NIS Edit отучился запускать инсталляшки, т.к. уж очень часто редактор сваливается в краш с закрытием всех открытых файлов, когда пишу "креатор" - открытых файлов может быть штук ~10, и уж очень неудобно потом вспоминать, где был курсор в каждом редактируемом файле, так что я компилю через контекстое меню, а NIS Edit - просто редактор, пока лень брать другой, не особо много уже пишу на NSIS |
Ну если вы не "особо много пишете", то значит я вообще ничего не пишу :) А где взять версию 2.0.1? Я как-то привык к HM NIS Edit.
|
Цитата:
|
Здравствуйте господа. Такой вопрос, можно ли декомпилировать эти плагины как нибудь чтобы узнать как ими пользоваться? взяты из nsis установщика.
http://gfile.ru/a5twO |
Цитата:
Список функций: Например, можно распаковать файлы из RAR архива вот такой командой: Код:
nsisUnRar2::Extract "$DESKTOP\plugins.rar" "$DESKTOP\TEST" И команда не отработает в .onInit функции, плагину нужен графический интерфейс инсталлятора (может, покопаетесь и получится, я не стал сидеть разбираться), поэтому конкретно данная команда отработает только в секциях |
Цитата:
Подскажите, как в инсталляторе отобразить еще одну страничку, не обязательно после странички с лицензионным сообщением, в которой текст из rtf/txt файла будет отображен на том языке, который был выбран в начале установки, т.е. подобно странице лицензии? Создавать кастомную страницу или можно обойтись штатными средствами? И еще. Нужно предоставить пользователю возможность запуска программы после её установки на финишной странице инсталлятора. Нюанс в том, что инсталлятор универсальный: для х86/х64. Программа, устанавливаемая на 64-разр. ОС имеет одно имя, а на 32-разр. - другое. Собственно, разница в именах небольшая, но она есть: WinSnap64.exe и WinSnap.exe? Путь установки по-умолчанию одинаков для систем обеих разрядностей - C:\Program Files\WinSnap. Может здесь кто-нибудь уже решал подобные проблемы? Ткните носом, пожалуйста? |
Цитата:
Цитата:
Код:
!define MUI_LICENSEPAGE_TEXT_BOTTOM "$(^ClickNext)" ; меняем текст под элементом отображения текста информация (за место инфы о принятии соглашения будет просто "Нажмите кнопку далее") Функции для скрытия/показа текста в шапке Код:
Function TextInfoPage Код:
Function RunProgramFunc |
Цитата K.A.V.:
...не получается изменить текст в шапке.. » Это называется "заработался". Я на этом тоже подорвался :) Поэтому и спрашивал. Чтобы заменить текст, нужно для строк 1-4 использовать LangString А для последней, пятой - LicenseLangString Код:
!define MUI_PAGE_HEADER_TEXT "$(info_title)" ;1. где "Лиц. соглашение" |
Подскажите, как сделать чтобы при при отмене на странице установки файлов, установщик переходил на финишную страницу. А у меня при отмене почему то выполняется скрытая секция, мне это не нужно.
|
Цитата:
в функции abort отрисовываем нужную страничку или прыгаем на стандарт, подбирая циферку Код:
!include "MUI2.nsh" http://nsis.sourceforge.net/Go_to_a_NSIS_page#Modern_UI |
Код:
!include "MUI2.nsh" |
Цитата:
1 warning: install function "Exit" not referenced - zeroing code (260-264) out Переводчик вам в помощь. |
но она ведь вызывается. разве нет?
!define MUI_PAGE_CUSTOMFUNCTION_ABORT Exit |
Цитата:
Вам показали: Цитата:
Цитата:
|
Столкнулся с такой проблемой: не могу через макрос
${GetOptions} $CMDLINE "/D=" $0 прочитать значение ключа "/D=" в командной строке. Устанавливается флаг ошибки, и в переменной пусто. Причем для любой другой буквы параметр читается, а для "D" нет. Понимаю, что этот ключ специфичный, но нужно из функции .OnInit прочитать значение, или хотя-бы проверить на наличие ключа. Кто нибудь может дать подсказку? |
wolkow70, а если пойти другим путём и вместо проверки самого ключа посмотреть на то, за что он отвечает?
То есть в данном случае за смену папки установки, поэтому, как вариант: Код:
${IfNot} $INSTDIR == "%ПАПКА УСТАНОВКИ ПО УМОЛЧАНИЮ%" |
Цитата:
Var CmdInstallDirectory InstallDir "$INSTDIR" Function .OnInit StrCpy $CmdInstallDirectory "$INSTDIR" ; здесь разный код, в том числе переназначение $INSTDIR по нужным условиям ; ${If} "$CmdInstallDirectory" == "" ${Else} StrCpy "$INSTDIR" "$CmdInstallDirectory" ${EndIf} FunctionEnd Получается, что если нет ключа /D= , то $INSTDIR меняется в функции, а если ключ /D= присутствует, то значение $INSTDIR восстанавливается в конце функции из ключа /D=. |
Цитата:
![]() Оригинальный AquaGraphite ![]() Переделанный мною скин Перекрасил на изображении скина все, что нужно... и не нужно (обведено красным) :) Но так и не избавился от серого фона окна. Может кто подскажет, где и что отвечает за цвет фона окна? В редакторе скинов просмотрел все вкладки - ничего похожего на значение цвета или ссылку на изображение скина не нашел. А может быть не заметил? P.S. У меня на Win7 (x64) с этими шкурками противно мерцает полоска прогресс-бара. На ту же тему. В редакторе скинов SHeditor (SkinSharp) для создания нового скина нужно загрузить изображение скина и прописать (установить в визуальном редакторе) координаты всех элементов (гемор еще тот). "Подсунуть" редактору измененное изображение скина можно, но тогда он теряет значение всех координат. Т.е. возвращаемся к тому, с чего начинали. Нет ли способа попроще? Изображение готового скина можно экспортировать (только *.bmp). Допустим, я разукрашу это изображение так, как мне нужно. Работка тоже не из простых, но где-то и поработать не грех :) Формат и итоговый размер изображения можно настроить. А вот как узнать, хотя бы в том же hex-редакторе, в каком формате изображение было в коде и где этот кусок кода находится? |
Цитата:
Код:
Function .onInit |
Цитата:
В общем, работает так: 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 |
K.A.V., в моем случае не помогает код который дал kotkovets, ни те что в представленой им ссылке. Все дело в плагине nsisunrar2, при его использовании он создает ' свою' кнопку отмены, при нажатии которой прерывается только секция в которой используется этот плагин. А затем уже кнопка отмена возвращается в свое обычное состояние, и нужно нажимать ее еще раз. Как быть?
|
Цитата:
просите автора ещё и сделать глобальное прерывание :), так сказать на выбор.. |
Цитата:
Код:
nsisUnRar2::Extract "$DESKTOP\plugins.rar" "$DESKTOP\TEST" Если к примеру, указанного архива не существует, то в переменных будут следующие данные (опять же смотря на переменную $1 - что там возвращается я не в курсе, видимо коды возврата именно плагина, о которых знает только разраб) Код:
nsisUnRar2::Extract "$DESKTOP\plugins.rar" "$DESKTOP\TEST" |
Цитата:
![]() А вот перекрасили: ![]() И теперь цвет фона окна будет - черным. Цитата:
Цитата:
|
Возвращаясь к "шкурному" вопросу при помощи SkinSharp, то вот перечень всех функций, которые поддерживает библиотека SkinH.dll (описание API в исходном коде библиотеки - перевод с китайского):
Код:
/*************************************************************/ Код:
# Настройка оттенка, насыщенности и яркости стиля. ![]() Таким образом не обязательно создавать новый стиль, можно просто подобрать желаемые параметры цвета для одного из готовых стилей и указать их в сценарии. |
По-моему, чернее не бывает...
Красил в первую очередь, т.к. "явно" указывало - Client. ![]() P.S. А этот просмотрщик скинов как отдельное приложение доступен? С наскоку не нашел. Пусть было бы в хозяйстве. Код:
/**********Функция SkinH_Attach *********************/ |
При использовании функции 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. Маленькая, да удаленькая. :) |
Спасибо, сейчас и проверю.
|
Цитата:
У себя никакой разницы не заметил. Все равно, для нормальной работы требуется skinh.she. Цитата:
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 такой дефект присутствует в поле описания компонентов и то только при первом наведении мыши на эту область. Если щелкнуть по компоненту и снова навести указатель в поле описания, "эффект" уже не проявляется. На бренде его и не было. ![]() ![]() |
K.A.V., спасибо, но я сделал по другому, в скрытой секции добавил код подсчета распакованных файлов, если их меньше чем должно быть-аборт
|
Цитата:
Цитата:
![]() Поэтому с такими "дефектами" приходится мириться или применять стили, где они не так явно проявляются. Возможно все же есть какое-то другое решение, но я его не знаю. Цитата:
|
Цитата:
Цитата:
*В примере идёт удаление стиля у надписи "Nullsoft Scriptable Install System" Код:
!include "mui.nsh" Код:
Function RemoveDISABLEDStyle |
Цитата:
Код:
Function onGUIInit Цитата:
|
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. Странно, что долго искал :( |
Цитата:
Ищем диалог, в котором располагается искомый элемент, в нашем случае это диалог 104 - выбор компонентов Ищем нужный нам элемент и смотрим его ID - 1043 Теперь, чтобы выполнить взаимодействие с данным элементом при работе графического интерфейса инсталлятора (убрать/присвоить стиль, поменять текст/цвет и т.д.) - нам нужно узнать его дескриптор, дескриптор своего рода уникальный идентификатор каждого элемента в графическом интерфейсе любой программы, надеюсь, понятно объяснил, если что - гугл :) Чтобы узнать этот самый дескриптор, нам нужно знать ID элемента, который прописан в UI файле (мы уже узнали, это 1043) Но т.к. наш элемент находится в дочернем окне графического интерфейса ("внутри основного", посмотрите диалоги в ресурсах и всё поймёте), нам нужно сделать немножко другие манипуляции. Теперь в коде выполняем команду: Код:
GetDlgItem $0 $HWNDPARENT 1043 $HWNDPARENT - дескриптор окна инсталлятора 1043 - соответственно, ID элемента, дескрпитор которого нам нужно узнать Это пример получения дескриптора элемента по идентификатору в ресурсах диалога Чтобы удалить стиль конкретно обсуждаемый "WS_DISABLED", нужно выполнить команду: Код:
${NSD_RemoveStyle} $0 0x08000000L 0x08000000L - даёт понять команде, какой стиль удалять, в нашем случае это "WS_DISABLED" Цитата:
Теперь о проблеме...Посидел, посмотрел, выводы такие: Если вы хотите изменить цвет текста описания компонентов, то вы должны указать и цвет фона для этого текста, иначе получите глюки при отображении описаний (возможно, решаемо, но не хочу копаться :)) Если цвет текста изменять не надо - будет дефолтный цвет (черный по-умолчанию, ну, в зависимости от настроек темы оформления и т.д.) Т.к. речь идёт о кастомизации интерфейса, то делаю вывод, что цвет текста всё-таки менять нужно, иначе получится не очень привлекательно :) реализовать можно так: 1. Если нужно просто убрать стиль на элемент описания, то воспользуйтесь примером из пункта 3, удалив те участки кода в моих примерах, которые выделены жирным шрифтом Сдеюущие примеры для того, чтобы убрать стиль и назначить цвет текста и фона элементу описания секций 2. Не красиво, нужно редактировать главный файл настроек интерфейса MUI, но удобно назначать описания секциям, не внося никаких изменений в главный файл скрипта вашего инсталлятора Можно, например, просто скопировать указанный ниже файл и в ту же папку и изменить его имя, и за место Код:
!include "mui.nsh" Код:
!include "C:\Program Files\NSIS\Contrib\Modern UI\My_System.nsh" Ищем Закомменитруем строку EnableWindow $MUI_TEMP1 0, которая делает элемент с текстом описания неактивным Ищем: Меняем на: 3. Второй способ. Изменения вносятся только в ваш скрипт инсталлятора. Из плюсов - не нужно редактировать главный файл настроек MUI интерфейса. Минусы - нужно будет писать собственную функцию обработки показа описаний и нужно назначать описания секциям по порядковым номерам начиная с 0, т.е. в том порядке, в каком они прописаны в вашем скрипте. Для начала Функция Пример двух секций с присвоением им описаний + функция для обработки показа описаний При использовании второго метода не забудьте удалить старые строки описаний компонентов, типа таких: вроде ничего не забыл |
Цитата:
Со способом номер 1 еще не разбирался. |
Если необходимо просто избавиться от дефекта, появляющегося на элементах с текстом фирмы и описания компонентов при использовании некоторых стилей SkinSharp, то вариант, предложенный K.A.V. можно намного упростить. Как мы уже выяснили ранее, данный дефект проявляется на элементах, у которых имеется свойство WS_DISABLED, т.е. говоря простым язык - элемент отключен.
![]() Чтобы избавиться от дефекта, данные элементы необходимо включить, и тогда текст примет свойства заданные самой темой. Включаем элемент с текстом фирмы (брандинг). В функции onGUIInit, перед командой применением стиля, указываем следующие команды: Код:
; Получаем дескриптор элемента управления с надписью бренда Код:
; Функция включения элемента с описанием компонентов Код:
# Функция включения стиля для элемента с описанием компонентов Код:
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN ![]() Полный код сценария (используется NSIS v3.0a2): Код:
# Поддержка Unicode |
Flix, подскажите, пожалуйста, правильный синтаксис написания параметров для функции SkinH_AttachExt. Я так понимаю, что тогда не нужно будет прописывать отдельную функцию настройки оттенка, насыщенности и яркости SkinH_AdjustHSV. Желательно, пример в вашем же скрипте.
|
Цитата:
Нужно Код:
!include "nsDialogs.nsh" Код:
!define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description ; Команда отключения стиля текста Код:
Цитата:
|
Цитата:
Код:
; При помощи функции SkinH_AttachEx загружаем файл стиля с именем 0011.she Код:
; При помощи функции SkinH_AttachExt загружаем файл стиля с именем 0012.she |
Цитата:
Ниже приведены сценарии, которые можно сразу скомпилировать и посмотреть результат. Так сказать, работа над ошибками :) В первом я объединил два совета K.A.V. для branding-текста и текста описания компонентов. Т.е. цвет branding-текста, текста подсказки и текстов описания компонентов становится красным, стили текстов отключаются. Скрипт от K.A.V. А этот вариант предложил Flix. Решает те же задачи. Надеюсь, что ничего не переврал. Я попытался переделать вариант Flix, использующий скины SkinSharp, в инсталлятор с функцией удаления. Чтобы деинсталлятор тоже был "одет". И стили branding-текста и описаний также отключались. Но запутался окончательно. То uninstall function "***" not referenced, то Function named ".onGUIInit" already exists. То еще чего-нибудь. Вот все, что у меня получилось. Прошу не бросать на пол-дороги! :) Применение скина SkinSharp в инсталляторе и деинсталляторе. |
Цитата:
|
Теперь, когда такие чайники, как я, будут "доставать" форум подобными вопросами, можно просто указать ссылку. :)
Еще раз спасибо. |
Ребят, пожалуйста подскажите, если кто знает - возможно ли на кастомной страничке создать кнопку заданного цвета (например красного) без использования скинов и не подгружая битмап, как в SkinnedButton? Может быть это возможно как-то реализовать через WinAPI? Сам я пока в этой теме не сильно разбираюсь и буду очень благодарен, если кто-то поможет.
|
Столкнулся с такой ситуацией, что нужно запустить exe файл на стадии Function .OnInit, то есть на этой стадии файл уже должен быть в папке $PLUGINSDIR , а добиться этого никак не могу. Кто-нибудь поможет?
|
Цитата:
|
Цитата:
Цитата:
А почему такая боязнь загрузки битмапа ? |
Цитата:
Function .OnInit ; InitPluginsDir SetOutPath $PLUGINSDIR File "DTOOLS\SPTDinst-x86.exe" ExecWait '"$PLUGINSDIR\SPTDinst-x86.exe" add /q' FunctionEnd Файла в папке нет. |
wolkow70, попробуйте так:
Код:
Function .OnInit |
Цитата:
|
Цитата:
Код:
Function .onInit Если на вашей системе драйвер не установлен, то вы получите стандартное окно исталлятора драйвера. |
Цитата:
|
Цитата:
Цитата:
PS В любом случае, спасибо за ответ! |
Цитата:
Цитата:
Недостатки: - кнопка не имеет фаски (окантовки); - отсутствует визуализация нажатий и установки фокуса как у обычной кнопки; - отсутствует центровка текста в элементе (и по высоте, и по ширине). Для решения этих моментов элементу необходимо каждый раз отправлять сообщение DrawItem (отрисовка элемента - WM_DRAWITEM), которое в свою очередь передает указатель на DrawItemStruct. Это довольно сложно реализовать языком NSIS. Если бы этот способ был универсальней и элегантней, то наверняка бы никто не городил все эти плагины для скинизации интерфейса. Хотя, можете попробовать, а вдруг у вас получится ;) . |
Цитата:
Тем не менее, весьма полезен для расширения NSIS-кругозора. :) Цитата:
|
Цитата:
|
Вложений: 1
Цитата:
Не знаю, конечно, где такое может пригодиться, но вдруг у кого-то возникнет такая потребность (типа шутки - красная кнопка с надписью "Не нажимать!" :lol: ). Во вложении файл сценария и его скомпилированный пример. |
Цитата:
( это я не смеюсь , а восхищаюсь - полёту мысли и фантазии... :) ) Может когда дождёмся , что кто нибудь и нормальный плагинчик для кнопок напишет. И не только для кнопок... А то давненько для NSIS ничего интересного не появлялось ( а что и появлялось, приходилось клещами вытаскивать у винамповцев... :) ) |
Цитата:
Можно поиграться задержкой (sleep) в функциях обработки кликов для достижения желаемого эффекта. Вот как это выглядит: |
Flix,
Всё это хорошо, но громоздко в коде + известные недостатки... Кстати о плагинах. Как то совсем забыли про botva2.dll для InnoSetup... Всего одна строчка кода (загрузка картинок не в счёт), и на тебе - кнопка... Лишь надо картинку раскрасить по вкусу.. System::Call "botva2::BtnCreate(ir0,i0,i0,i100,i30,t'$PLUGINSDIR\pict_button.bmp',i0,i0)i.R0" Только неизвестно как там решить вопрос с калбэком при нажатии... |
Цитата:
|
|
Цитата:
Код:
ClearErrors Код:
ClearErrors Код:
KeyExists (check if registry key exists) |
может кому пригодится - конвертация размера файла из KB в MB :
Код:
OutFile "Size_test.exe" |
Пользовательские иконки из DLL - в MessageBox
Уже был макрос для этого , но можно использовать и такой вариант : Код:
outfile MessageBoxIco_test.exe Номер ID_ICO необходимой иконки из DLL - смотрим в любом редакторе ресурсов. |
Есть такой плагин WPatch
Вместе с ним идет пример сценария. Код:
; WPatch - Sample script В примере также имеются папки с файлами dir1 и dir2. Соответственно, первая - с исходными файлами и папками, вторая - с измененными. После запуске батника создается файл отличий *.pat и WGenPatDir.nsh, который в дальнейшем будет использоваться для пропатчивания. Если я правильно понял вторую строку, то содержимое папки dir1 должно скопироваться в папку dir_to_patch во время компиляции сценария? Созданный патч Sample.exe после запуска "натравливается" на содержимое этой папки dir_to_patch. В реальности, папка dir_to_patch удаляется, а такая же, с исходным содержимым папки dir1, не появляется. В чем прикол? В русскоязычном Руководстве о параметрах команды !system написано не очень много и не совсем по-русски. Практически же, я в InstallDir прописываю путь к нужной мне (исходной) папке, содержимое которой дублируется в папке dir1 для создания данных патча , а выделенные красным строки игнорирую, как комментарий. |
Цитата:
!system - компилятор задействует системные ресурсы (приложения) Цитата:
2 копируется содержимое каталога dir1 в каталог dir_to_patch (этот каталог создается заново, для того, что бы не попали в проект файлы предыдущей компиляции) Цитата:
|
Используя в сценарии этот код
Код:
На Win7 ярлык нормально отображается в меню Пуск. Как правильно написать и для Win 8? Разрядность ОС - только х64 |
Kopejkin, если во всем сценарии нет ошибок, то все ярлыки будут созданы согласно указанным командам. По крайней мере у себя я таких проблем не наблюдаю (пользуюсь NSIS v3.0a2). Вот проверил на виртуалке:
|
Flix, поделитесь этим тестовым сценарием, пожалуйста. Попробую сам разобраться, а для этого потребуется 100% рабочий.
|
Цитата:
CreateDirectory "$SMPROGRAMS\МОЯ ПРОГРАММА" CreateShortCut "$SMPROGRAMS\МОЯ ПРОГРАММА\УДАЛИТЬ_ТЕСТ.lnk" "$INSTDIR\Uninstall.exe" И в секцию "Uninstall" их удаление Delete "$SMPROGRAMS\МОЯ ПРОГРАММА\УДАЛИТЬ_ТЕСТ.lnk" RMDir "$SMPROGRAMS\МОЯ ПРОГРАММА" Потом сделал копию файла WelcomeFinish.nsi, переименовал его в WelcomeFinish_rus.nsi (имитация русификатора) и соответственно изменил в нём название файла деинсталляции (Uninstall_rus.exe) и имя ярлыка (УДАЛИТЬ_RUS.lnk). На этом все. |
Добиться отображения ярлыков и в Приложениях и в Установке/Удалении на Win8 мне не удается.
Отключаю блок Установка/Удаление - ярлык "Удалить русификатор..." отображается в Приложениях. Включаю - ярлык "Удалить русификатор..." в папке с ярлыками программы присутствует, а Приложениях - не отображается. Может я что-то упускаю, подскажите, пожалуйста. Тренируюсь на этом сценарии: Код:
########## ПРИМЕР ############## |
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. Аналогично и для секции деинсталляции, чтобы корректно удалить записанные ключи. Еще подумайте, что произойдет, если пользователь запустит ваш инсталлятор на 32-бит системе. Полагаю, что необходимо выполнять проверку битности и соответственно ей выполнять те или иные команды установки. |
Flix, спасибо за ответ, но так... тоже не работает.
Если устанавливать в C:\Program Files (x86), все происходит точно также: ярлык деинсталлятора отображается в Приложениях только после "скрытия" блока Установки/Удаления. :blink: Цитата Flix: Еще подумайте..» Как раз с этим проблем не было. K.A.V. подсказочку подарил, правда по другому поводу... Код:
Function .OnInit |
как в NSIS создать проект *.exe имея архив 7z, иконку, бантик, файл txt с настройками для sfx. Обычно делал до этого кнопкой (button), небольшие репаки прог и портабле.
Может есть какой то инструмент чтобы с нуля скрипт не писать (я этого делать не умею), а потом только вписать правельные название файлов, версия... |
Цитата:
простенькое IDE встроен в nisedit2.0.3 проект давно не развивался, но простых задач сойдет. |
Цитата:
![]() |
Цитата:
|
сделал, не помогло. ось хр стоит. не пойму как язык туда прикрутить чтобы не ругался.
|
Цитата:
|
erd-zelen, вам же говорят: сначала установите NSIS. Как вариант, после установки NSIS, попробуйте переустановить nisedit2.0.3 или сменить его версию на предыдущую.
На всякий случай: NSIS и nisedit2.0.3 - это не одно и то же ;) |
вот теперь понятно! что надо переустановить. бывалым то понятно в чем глюк, а новичку поди разберись... :)
|
Друзья,
Пока не разобрался с командой Команда из пакета Dialogs.nsh Там есть стандартная программа, Код:
!include "dialogs.nsh" Код:
Processing script file: "D:\Desktop\examples\OpenBox-2.nsi" Не понимаю что значит Invalid command: dialogsEx::FileBox Интернет и форум молчит... Спасибо. |
Цитата Kopejkin:
но так... тоже не работает » Тогда сделайте вот так: Соберите инсталлятор по этому примеру и проверьте. У меня на виртуальной оси Windows 8.1 ярлык деинсталлятора исправно создается. Проверить на реальной системе нет возможности, но думаю там также должен создаваться. Если у вас и после этого не будет работать, то тогда я не знаю, больше ничем помочь не могу, идеи все закончились. :) Цитата:
|
Flix, спасибо за терпение и советы.
Но.. не работает. Тренируюсь тоже на виртуалке, причем специально установил 8.1 (до этого стояла 8). Буду считать, что у других ярлык будет создаваться или откажусь от создания ярлыка в Установке/Удалении :sorry: |
Обновился AccessControl plug-in Version: 1.0.8.0 (24th March 2014)
http://nsis.sourceforge.net/AccessControl_plug-in |
Цитата:
|
Ребята, у кого-нибудь получалось в NSIS создать ярлык сразу с правами администратора?
|
Цитата:
С помощью громозды из кода : http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag С помощью правки HEX в самом ярлыке (придётся править заранее, т.к. внятного NSIS кода для этого, пока нет... ) С помощью изменения данных в реестре для запуска конкретной программы (это не оч корректно, но можно... ) |
MKN,
Первые два варианта понравились. Работает. |
Определение у пользователя прав администратора :
Код:
OutFile "Admin_privileges.exe" |
Оффтоп, но http://nsis.sourceforge.net/ не пашет, да? У меня на всех устройствах белый экран. При том, что домен 2го уровня работает.
|
|
Цитата:
|
Друзья, а какие-либо массивы работают в не unicode версии? Смотрю, что стандартные версии известных скриптов выдают ошибку. Можно, конечно, написать разработчику, только, сдается, через год он мне и ответит:).
Либо вопрос, какие zip плагины работают в unicode версии? zipdll у меня не заработал там точнее это не работает в Unicode Код:
ZipDLL::extractall "$6" "$INSTDIR\distr" версия 2.46 Ansi |
Упс-упс-упс. Простите, установил 3.0, оказывается... Совсем сырая, видать. С установкой 2.46 проблемы исчезли.
|
Привет народ... :)
Цитата:
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 Спасибо. Цитата:
|
Цитата:
Для автоматизации изменения даты и времени у созданного файла инсталлятора после компиляции, необходимо добавить в сценарий следующую команду: Код:
// Изменение временных атрибутов файла инсталляции Судя по переписке разработчиков, в версии 3.0 присутствуют определенные проблемы, которые еще не решены. Они рекомендуют для ответственных проектов пользоваться версией 2.46. |
Цитата:
Спасибо. :) |
Flix,
Об читался весь, об смотрелся и на тестился, не хотит эта сволочь фурычить, мысли какие есть ?! запускал так: Код:
... |
MaGoth, а как у вас с правами доступа к файлу? А может в это время данный файл занят другим процессом? У меня все работает. Вот смотрите простенький пример. Сделали пустой документ RTF (License.rtf). Сделали для него инсталлятор. После завершения установки изменяем его временную метку.
Попробуйте свою задачу разбить на отдельные узлы. Отладьте каждый из узлов, удостоверьтесь, что он выполняет возложенную на него функцию. А потом сведите все в окончательный файл сценария. Возможно инсталлятор нужно запускать с правами Администратора или делегировать эти полномочия на файл утилиты timestomp.exe. |
Цитата:
Может саму утилиту запускать с правами админа, вопрос только, как ? Цитата:
В логе постоянно выводятся ерроры по параметрам даты: 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 Потом еще массово за тестирую... |
kotkovets, http://www.markelov.net/articles.php?lng=ru&pg=39 ссылка нерабочая
Друзья, я нашёл кучу всего на форуме про кодировку, но что-то ничего не работает, что пробовал. Кто-то приводил пример наподобие MultiLanguage.nsi - у меня не заработал Решил перейти на ANSI NSIS с UNICODE, ибо тут больше плагинов работает, чем там. Например авторизация с последующим скачиванием с ftp. Вот только не решил вопрос с русским языком, а в мануалах ничего подобного не нашел. Киньте ссылку, если у кого-нибудь есть, пожалуйста! |
Цитата:
Цитата:
Авторизация тоже должна работать, если я правильно помню, а что за плагины юзал для фтп ?! |
MaGoth, да, пример был бы очень неплох. У меня многомодульный инсталлятор, поэтому наверное, лучше пример от тебя - и тебе легче, чтобы не копаться с моим кодом, и мне, наверное.
Спасибо за отклик!!! P.S. Мне только русский нужен Наверное следует упомянуть мои модули... Код:
!include nsDialogs.nsh |
А код этот пробовал. Кажется он принадлежит kotkovets
Код:
!include "MUI2.nsh" |
Цитата:
Код:
FileOpen $0 "$EXEDIR\file.exe" a И ещё для этой задачи возможно подойдёт : http://nsis.sourceforge.net/Touch_File если код подкорректировать не для текущей, а для назначаемой даты. |
Всем привет. Не подскажите есть ли готовый скрипт инсталятор? Просто с нуля я врят ли напишу, а готовый я бы под себя переделал.
|
Цитата:
|
Может кому-то будет интересно: NSIS 3.0 CVS 9.04.2014 Revision 6459
Обновился сегодня с сервера c исходниками NSIS и выполнил компиляцию с параметрами: NSIS_MAX_STRLEN=8192 и NSIS_CONFIG_LOG=yes. Список обновлений по сравнению с декабрьским релизом я давал ранее (здесь). Кто будет использовать, будьте внимательны, команда создания ярлыка CreateShortCut изменилась на CreateShortcut . |
Ещё раз об изменении/установки временных атрибутов файлов. Т.к. с чистым API не всё ясно, то при использовании плагина
http://nsis.sourceforge.net/Time_plug-in всё предельно просто : Код:
!include "Time.nsh" |
Здравствуйте. Я новичок. Нарисовал свою страницу в NSIS Form Designer, форма сохранилась в двух файлах. Как теперь показать её?
|
Цитата:
Цитата:
Вам сначала нужно выбрать, каким способом вы хотите создавать странички, в NSIS есть 2 разных плагина для этих целей. 1. Старый способ. InstallOptionsEx - чтобы создать страничку с использованием данного плагина вам необходимо сначала создать INI файл с параметрами странички и необходимыми элементами (что и делает ваша старенькая программка) 2. Новый способ. nsDialogs. Чтобы создать страничку с использованием данного плагина вам необходимо прописать команды на создание каждого элемента управления (текст, галочка и т.д.) в коде скрипта. В этом вам поможет NSIS Dialog Designer - NSIS В справочнике есть примеры: Обучение IO: собственные странички Описания плагинов => nsDialogs: Создаем собственные страницы инсталлятора |
K.A.V., Я сильно извиняюсь. Перепутал названия. Я начал использовать dialog designer. Справку читал. Я только не смог понять dialog designer создает два файла. Это их надо подключить к скрипту или нужно код который создает дизайнер скопировать в мой скрипт?
Спасибо с этим разобрался. Скопировал код из dialog designer в свой скрипт. Только почему-то к моей форме добавляется лишние кнопки снизу. Да и еще. Как можно моей форме задать размер? |
Друзья, может всё-таки кто-то знает почему данный код может не работать?
Вот сам программа http://forum.oszone.net/post-2334376-1127.html В логе компилятора смущают строки: Код:
LangString: "WELCOMEPAGE_TITLE" 1049 "ДОБР*Рћ ПОЖАЛОВАТЬ!" Код:
MakeNSIS v2.46 - Copyright 1995-2009 Contributors |
Цитата:
А лог компилятора такой: Код:
Command line: |
Цитата:
|
Исходные данные:
TXT файл с одной числовой строкой. Задача: Проверить есть ли запись в этом тестовом файле, если нет, то крутится в цикле ожидая появления. Решение: Вот собственно с решением трудновато, сталкивался кто нибудь из форумчан, с проверкой записи в файле? |
Цитата:
Цитата:
Цитата:
Перевод справки NSIS => LineRead: читаем содержимое строки по номеру |
K.A.V., с лету не нашел, онлайн общение всегда приятней ;) спасибо.
|
Исходные данные:
TXT файл с одной изменяющейся числовой строкой. Задача: Проверить есть ли числовая строка в этом тестовом файле, если нет, то крутится в цикле ожидая появления. Решение: Читаем строку, заносим в переменную, ну а дальше как сравнить появилось число или нет? Цитата:
Содержимое id.log: Цитата:
|
Цитата:
Цитата:
Справочник NSIS -> Примеры кодов -> Работа со строками; Справочник NSIS -> Примеры кодов -> Замена строки в текстовом файле; Попробуйте подогнать под свои цели. А не получится - неработающий код сюда. По крайней мере, так будет более понятно, что вы хотели сделать. |
Цитата:
Следовательно, вам нужно самому фильтровать строку и вытаскивать значение из строки. Опять же, пока вы не научитесь пользоваться стандартными командами NSIS и включать логическое мышление - вы будете постоянно стопориться на таких простых задачах. Имеем: строку вида "ID=какое то число" Вопрос: как получить значение, которое идёт после символа "=" Ответ: вспоминаем стандартную и простую команду StrCpy (описание есть в справочнике) В нашем случае мы используем её для отсеивания первых трёх символов строки, чтобы получить значение "типа параметра ID" Код:
${LineRead} "id.log" "1" $1 Код:
Function LineReadFunc |
Не в тему, но давно хотел спросить о работе текстового редактора форума.
Почему при редактировании сообщения слетает форматирование? |
Цитата:
Цитата:
|
Здравствуйте.
Начал разбираться с NSIS и тут же уперся. Банальная, думаю, задача. Надо прочитать номер версии файла, поместить результат в name и в инсталлятор. Делаю так: Код:
!define PRODUCT_NAME "MyProg" А с записью информации о версии в инсталлятор совсем ничего не выходит, пока не укажу номер версии явно. |
Цитата:
Если да, то...зачем? Можно 1 раз указать версию файла в скрипте и потом использовать везде переменные Код:
!define PRODUCT_VERSION "2.3.4.5" Цитата:
|
Цитата:
Цитата:
|
Цитата:
Код, который вы прописали, будет срабатывать тогда, когда пользователь запустит ваш пакет инсталлятора, соответственно, исходя из вашего кода, ваш пакет инсталлятора при запуске будет читать версию файла по пути "D:\4inst\prog.exe", это есть изначальный баг вашего кода, т.к. данного файла у пользователя на компе просто напросто не будет. Если же вы распаковали указанный файл и потом проверяете его версию - другой разговор. А судя по вашему текущему коду, у меня складывается такое впечатление, будто вы думаете, что в процессе создания EXE-файла пакета инсталлятора версия указанного файла "зашивается" в код вашего пакета инсталлятора и запоминается - это не так. |
Цитата:
|
Цитата:
Прописываем полный путь к файлу, у которого будет определяться версия В константу PRODUCT_VERSION (в коде при необходимости использовать как ${PRODUCT_VERSION}) будет помещена версия файла в формате X.X.X.X Также будет автоматически генерироваться имя выходного файла с версией в формате "setup_X.X.X.X.exe" и информация о версии файла инсталлятора (в коде выделено жирным) Код:
|
Цитата:
У вас 32бита винда.Может у меня проблема из-за 64бита? |
Цитата:
Попробуйте скомпилить под виртуалкой или на другом компе. |
Товарищи, кто-нибудь знает как при выполнении функции замены фразы в текстовом файле (StrFunc.nsh) сделать так, что бы временный файл для обработки создавался не в папке с самим инсталлятором, а в другом месте, например во временной папке $TEMP?
Выполняются команды: StrCpy $_FindInFile '' ; Заменяем строки в этом файле StrCpy $_LineReplace '' ; Ищем и заменяем ЭТУ строку StrCpy $_LineToInsert '' ; На что будем заменять Call ReplaceLinesInFile |
Цитата:
Только не забудьте после отработки функции вернуть значение обратно, иначе проблем можете повидать с неправильными путями и с некорректной работой установщика Код:
|
Цитата:
|
Цитата:
Цитата:
c ней то и работает StrFunc - а значение $TEMP уже подкорректировано.. перед использованием |
Задача, проверить по какому интерфейсу раздаётся интернет и вывести MessageBox:
Цитата:
|
Limonica,
Цитата:
http://nsis.sourceforge.net/IpConfig...erConnectionID http://msdn.microsoft.com/en-us/library/aa394216.aspx |
А как однозначно проверить входит ПК в домен или нет, и вывести MessageBox:
Цитата:
|
Цитата:
Код:
outfile GetComputerNameEx_test.exe ps Ранее я ещё приводил пример : Функция NetWkstaGetInfo возвращает информацию о конфигурации рабочей станции (имени домена, локального компьютера, информацию о OC) http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx Код:
Outfile "NetWkstaGetInfo_test.exe" |
Давно не следил за темой и извиняюсь заранее если такой вопрос уже обсуждался.
После выхода новой версии появилась ли возможность создавать пакеты размером больше 2Gb или NSIS все еще на это не способна? |
Цитата:
Хотя в то же время в анонсе : Installers can be as large as 2GB http://www.filehorse.com/download-nsis/ Только, по моему, создавать такие огромные NSIS инсталляторы - верх извращения. Почему бы не манипулировать из скрипта , отдельным архивом любого типа и размера ? И практично и удобно... |
Иногда после запуска-закрытия приложения, остаётся висеть его процесс или даже появляются несколько его одинаковых дублей-процессов ( после нескольких запусков-закрытий ).
Причины такого размножения в данном моменте не столь существенны, но надо закрыть-убить ВСЕ эти возникшие процессы, количество которых заранее не известно и не предсказуемо. Каким образом это лучше сделать в NSIS ? Например, вижу в диспетчере задач - 10 процессов App.exe. Хочу запустить скрипт, убивающий на раз всю эту ораву клонов... |
Цитата:
PHP код:
|
Цитата:
(В моём случае, прога постоянно запускает процесс модуля соединения с интернетом, при его отсутствии - не успеваю закрывать процессы. Потому и нужен технологический скрипт "убийства" этого безобразия ) |
MKN, тебя как-будто подменили, ей богу, сначала о вопросе, который есть в справочнике (Примеры кодов => Работа с процессами), а теперь ещё и это :)
Цитата:
|
Цитата:
Цитата:
|
|
BuZzOFF, http://rghost.ru/54979826
|
Добавил в шапку: Определение всех ОС WINDOWS (winver2.nsh) >> Расширение функциональности
|
Задача, вывести MessageBox "WinName" - "WinType" или "WinServerName" если эта серверная ОС, в примере неправильный вывод, где то нарушена логика, прошу совета.
Цитата:
|
Цитата:
Код:
Function .OnInit |
Спасибо за пример, при дальнейшем копании выяснилось, что winver2.nsh конфликтует с nsExec плагином:
Код:
!include "WinVer2.nsh" Код:
--------------------------- Код:
--------------------------- |
Цитата:
Либо просто определяйте ОС до выполнения команды с плагином, на переменные вы не жадный же? ;) Код:
Function .OnInit |
Цитата:
в доках пишут то так: Код:
nsExec::exec 'calc.exe' |
NSIS v3.0 перешла из стадии альфа в стадию бета. Новости здесь. Загрузить релиз можно с оффсайта. Отчеты об ошибках сообщаем на форум NSIS.
|
Цитата:
Поставил, будем обкатывать, пока что после первых компиляций заметил уменьшение размера всех выходных файлов по сравнению с 3.0a1 В Release notes как-то мало инфы по мелким изменениям даже, как-будто ничего не делали |
Расшарить папку и задать права доступа можно с помощью такого кода :
Код:
;создать общий ресурс с полным доступом для всех Удалить шару : Код:
outfile "NetShareDel.exe" |
Как запустить ExecWait в режиме SILENT?
|
Цитата:
есть плаги: http://nsis.sourceforge.net/ExecCmd_plug-in http://nsis.sourceforge.net/ExecDos_plug-in |
Определение статуса компьютера в сети
Код:
OutfFle "NetGetJoinInformation.exe" |
Цитата:
Код:
ExecWait '"$INSTDIR\batch.bat" /SILENT' |
Цитата:
Вам же выше ответили... Цитата:
Описание плагинов => nsExec: запуск консольных утилит Код:
nsExec::Exec '"$INSTDIR\batch.bat"' |
Цитата:
Запуск (в данном примере, батника) с скрытым окном консоли Код:
outfile WinExec_test.exe Ессно указываем стиль, необходимый для конкретной задачи) То, что запуск скрытый и работает, можно легко проверить, использовав, к примеру, 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' |
MKN, а этот способ:
Код:
System::Call 'kernel32.dll::WinExec(t "$EXEDIR\My.bat", i 0) i.r0' Задача №2: проверить домен на доступность. Реализация: ? |
Цитата:
Про проверку доступности домена , не знаю... Что конкретно ("технически") предполагается проверять ? |
А какое отличие ansi проекта от unicode?
|
kotkovets, в Unicode проекте не правильно работает WinVer2.nsh как минимум на Windows XP, nsis 3.0b0
|
Как привязать реестр к выбору языка?
!include "MUI.nsh" !insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "English" WriteRegStr HKCU "Software\QWERTY" "Language" "Russian" WriteRegStr HKCU "Software\QWERTY" "Language" "Ukrainian" |
Цитата:
Код:
;Remember the installer language |
Я пишу скрипт для портативной программы. Мне нужно что бы при запуске программы вылазило окошко с выбором языка интерфейса. Какой язык пользователь выберет, тот параметр реестра должен прописаться.
|
Цитата:
или со своим сообщением http://stackoverflow.com/questions/1...in-oninit-mui2 или делаем свою страничку с выбором языка и последующей логикой |
Цитата:
Для начала нужно подключить нужные вам языки командами с указанием языков, например для русского и для английского: Код:
!insertmacro MUI_LANGUAGE "Russian" Код:
!insertmacro MUI_LANGDLL_DISPLAY Цитата:
Какой ID соответствует конкретному языку, можно посмотреть в файле языка по пути (пример файла русского языка): Код:
\Program Files\NSIS\contrib\Language files\Russian.nlf Цитата:
Код:
Function .onInit |
K.A.V., вот что получилось:
Прога не запустилась. Что ещё необходимо? Ваш код вставил полностью. |
AlekseyPopovv,
Попробуй предельно упрощённый код : Код:
OutFile "Select LANG_ID.exe" |
MKN, тоже самое почти, но программа уже запустилась.
Надо создать как то эту страничку, а как понятия не имею. |
Цитата:
Когда будете понимать значение команд и что в них написано (как в моём примере команда закрытия инсталлятора, т.к. это всего-лишь пример) А что вам ещё необходимо от этого примера? Я дал вам пример кода и предоставил вам информацию, по аналогии которой можете сделать связь других языков с их ID... Код:
Function .onInit может, так всегда новичков проверять, читали они справочник перед заходом в эту тему или нет? :biggrin: тогда и перестаните писать подобные предложения Цитата:
|
Озадачился вроде как простым вопросом - как на кастомной странице изменить цвет текста в поле чекбокса ?
(${NSD_CreateCheckbox} 25u 80u 150u 10u "цвет текста") Через SetCtlColors меняется почему то только цвет фона, на котором находится текст... И с прозрачностью пробовал играться... Без результата. (Можно конечно рядом с чекбоксом просто поместить цветную Label-надпись, но это как то не правильно...) Или я что то не так делаю ? |
Цитата:
Даже в инсталле моего SFX Creator уже давно сделано так, как ты написал... Цитата:
|
Цитата:
Тогда для чекбокса сможете указывать командой SetCtlColors какой угодно цвет текста. :) |
Доброго времени суток! Подскажите,пожалуйста,почему в "Установке и удалении программ" (xp) или в "Программах и компонентах " (7) не отображается размер установленной программы? Имя,сайт,комментарий и т.д всё отображается,а размер нет.Просто пустое поле.Что нужно сделать?
|
Цитата:
Если после изменения информации в существующем пункте нет эффекта, удалите раздел Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Management\ARPCache\Имя_Раздела_в_Uninstall Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall Код:
WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Имя_Раздела_в_Uninstall" "EstimatedSize" "900000" |
Спасибо! Помогло! Теперь в и ХР и в 7 размер отображается корректно!
Скажите,а можно в элементе "text" разрешить ввод только латинских символов? Я знаю,есть флаг "OnlyNumbers",а нужно,чтобы можно было писать цифрами и английскими буквами. |
Цитата:
Если бы все подробно читали описание команд и знали их возможности, то таких бы вопросов не возникало :( Код:
${StrFilter} "Артем 123 TEST" "2rus" "" "" $0 Строка, которую проверяем на наличие русских букв 2rus Указываем команде, что нужно оставить только русские буквы в строке, если они есть, то в переменную $0 будут помещены только русские буквы, так мы проверим, есть ли в строке русские буквы $0 Переменная, в которую поместятся русские буквы, если они есть в строке После этого командой StrCmp (описание опять же, есть в справочнике) проверяем значение переменной, если в переменной пусто - русских символов нет в строке |
Ох спасибо огромное! Всё здорово работает! :up Русские буквы вычисляет как надо! :)
|
Цитата:
При установке для фона текста - transparent - фон устанавливается стандартного цвета... Что можно сделать ? Также интересует вопрос - как перетаскивать окно без заголовка ( с использованием плагина MoveAnywhere.dll ), если фон страницы - bmp изображение ? С таким фоном перетаскивание не работает... |
Вложений: 1
Цитата:
PS Закрытие окна Alt+F4 |
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 никак нельзя обойтись ? |
Цитата:
А мой скомпилированный экзешник работает? |
Цитата:
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 |
Цитата:
Однако главное, что в конце-концов все получилось! Цитата:
|
Вложений: 1
Цитата:
Код:
; ------------------- Checkbox 1 ----------------------- |
Здравствуйте, нужно получить имя группы администраторов, как это правильно сделать?
Код:
System::Call 'netapi32::NetLocalGroupAddMembers |
Цитата:
или, зная 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 |
MKN, как получить имя группы S-1-5-32-544 с помощью LookupAccountSid, нужен пример кода...
Узнать имя группы администраторов и вывести в MessageBox UserMgr плагин тоже не оперирует SID идетификаторами |
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)" |
Оказывается есть интересный приём для перемещения окна за любую точку (без плагина)
Используется идея отслеживания нажатия ЛКМ и посыла соответствующего сообщения окну - ${WM_SYSCOMMAND} с похоже, что, не документированным параметром SC_MOVE 0xF011 ( на http://msdn.microsoft.com/ru-RU/libr...(v=vs.85).aspx такого нет... ) Код:
!include MUI2.nsh |
winver2.nsh определяет редакцию Windows 8 Single Language:
Код:
Windows 8 Single Language Так же не определяет редакцию Home Premium французкой Windows 7 64-bit, пустое значение. Ещё просьба сохранять winver2.nsh в UTF-8. Спасибо за плагин |
Цитата:
Цитата:
Что мешает вам добавить в ваш скрипт небольшой код, который будет сам обрезать строку после определения ОС? Код:
${WinType} $1 Цитата:
Цитата:
С текущим количеством текстовых редакторых с их возможностями, которые есть сейчас - думаю не проблема сохранить текстовый файл в другой кодировке |
COMPONENTSPAGE и PAGE_DIRECTORY на одной стандартной странице.
Такое сочетание более практично и удобно, чем раздельное листание страниц (хотя лучше это делать с помощью nsDialogs ) Код:
!AddPluginDir . WndProc.dll - плагин комплект во вложении : |
Периодически необходимо перемещать или копировать файлы в папку, в которой уже имеются сотни файлов , в том числе и одноимённых (т.е. таких же, которые я копирую), которые потом нужно или удалить , или сравнить, или ещё чего...
Оказалось, сделать это удобно с помощью функции 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" Для копирования установить флаг 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" FO_DELETE = 0x0003 - Удалить файлы FOF_ALLOWUNDO = 0x0040 Удалить файлы в корзину. FOF_NOERRORUI = 0x0400 - Не показывать сообщения об ошибках, которые могут возникнуть в течение процесса. FOF_NOCONFIRMATION = 0x0010 Отвечает "yes to all" на все запросы в ходе операции, т.е. не спрашивать у пользователя подтверждения удаления. если сообщение всё же желательно - этот флаг ессно не применяем ( Если надо удалить файлы вместе с папкой - не используем *.* ) |
Интересен код использования функции BitBlt. Можно рисовать рядом с окном инсталлятора (или в любом другом месте экрана) изображения, например, для наглядной демонстрации, при выборе компонентов или выборе скинов , тем, шаблонов и т.д.
Код:
outfile BitBlt_test.exe Есть правда досадный момент - изображение почему то не разрушается при закрытии инсталлятора (хотя DeleteObject предусмотрен в .onGUIEnd ) И изображение можно разрушить любым помещённым на него объектом... Может кто подскажет, как это устранить ? Пример во вложении : |
Цитата:
Насчет разрушения не могу точно сказать, т.к. изображения сами разрушаются, но в описании DeleteObject сказано, что нужно передавать функции Цитата:
Код:
System::Call `gdi32::DeleteObject(i $hBitmap)` |
Цитата:
|
Иногда желательно обратить внимание пользователя на какое-либо сообщение программы. Сделать это можно сопроводив сообщение звуковым сигналом встроенного PC speaker_а (Beeper_a)
и функций winmm или kernel32 Код:
OutFile "Beep_test.exe" ps Ессно бипер должен физически присутствовать в ПК и быть включен в : [HKEY_CURRENT_USER\Control Panel\Sound] "Beep"="yes" и в "Non Plug and Play Drivers" |
Есть полезный код, перечисляющий все дисковые устройства и их тип :
Код:
outfile GetLogicalDrives_GetDriveType.exe |
Цитата:
Код:
Function .onInit |
Цитата:
|
Всем привет, как определить дату модификации файла с помощью NSIS?
|
Цитата:
или с помощью GetTime : http://nsis.sourceforge.net/Docs/AppendixE.html#E.1.6 |
Доброго времени суток
Прошу не судить строго, NSIS занимаюсь не очень давно. Не могу найти ответ (хотя перечитала многое), на такой вопрос: Можно ли на NSIS сделать инсталляцию (тихую), которая во время установки будет считывать данные с другого файла (т.е. exe одна, а в файле можно, например, изменить путь (или/и другие параметры) и при тихой инсталляции новый путь (параметры) будет учитываться (без пересборки exe))? Нашла варианты считывания с .ini - но не подходит, т.к. считывает в момент сборки, и нет реакции если внести изменения(( |
natasha_82, конечно можно и кстати с ini файлами как раз будет работать, просто не надо этот ini файл подключать в инсталятор, а считывать например из рядом лежащего файла:
Код:
ReadINIStr $0 "$EXEDIR\file.ini" "Section" "Param" |
natasha_82, больше конкретики, что имеем, какой формат файла, что нужно сделать (читать значение определённой строки в файле или читать значение параметра в INI файле), либо читать из ключа в реестре? Пишите конкретней, чтобы мы не давали вам размытые ответы, вроде вот этого :)
Справочник по NSIS читали, надеюсь? Изменить путь установки можно в любом месте кода, достаточно присвоить перменной $INSTDIR нужный путь Если меняете путь установки в silent архиве (тихая установка), то лучше всего менять путь установки в .onInit функции, например чтением из файла формата INI Пример установки нового путя чтением из INI файла в момент запуска вашего установщика: Код:
ReadINIStr $INSTDIR "$EXEDIR\settings.ini" "TEST" "InstDir" Код:
installer.exe /D=C:\Program Files\Моя папка |
Всем привет, как перевести HeX значение в string?
|
Otlanta, с помощью плагина Registry?
|
K.A.V., неа, почему то отображает не весь текст а лишь первое слово, значение хекс достаточно длинное, есть ли альтернатива?
|
Цитата:
Попробуйте у себя проверить вот этот код: Код:
${registry::HexToStr} "c5f1ebe820e2fb20f7e8f2e0e5f2e520fdf2eef220f2e5eaf1f22c20e7ede0f7e8f220e2fb20ebe3f3ed20e820e220e2e0f8e5ec20eaeee4e520e4eeeff3f9e5ede020eef8e8e1eae02120cff0e8e2e5f220eef2204b2e412e562e2c20f320eaeef2eef0eee3ee20e2f1b820f0e0e1eef2e0e5f220eff0e5eaf0e0f1edee203b29" $1 |
Цитата:
( nsis-2.46-strlen_8192 или nsis-3.0b0-strlen_8192 ) |
Уважаемые, возможно ли сделать так что бы установщик переименовал сам себя? Например был файл скомпилированный в nsis file.exe после запуска он в той же директории переименовал себя в file1.exe и продолжал выполнять постановленные задачи?
Ну или как реализовать альтернативный вариант (более закрученый): установщик запущенный из одной директории, путь его расположения помещается в переменную, установщик копирует себя в папку скажем темп, по старому пути удаляется и продолжает выполнять задания по пути из переменной. С первым пунктом можно сделать установщик в установщике, но хотелось бы проще. |
Цитата:
1. Переименовать файл активного процесса нельзя Соответственно, нам нужен внешний EXE, который этим займётся Создаём простой EXE, данный файл будет распаковываться в вашем основном инсталляторе, ваш инсталлятор передаст свой полный путь и при запуске EXE считает его через параметры, затем переименует файл и перезапустит инсталлятор (зачем вам вообще такие извращения?). Код, который нужно добавить в код основного кода пакета инсталлятора: Код файла, который будет переименовывать основной файл пакета инсталлятора: 2. Код |
Цитата:
И можно обойтись без внешнего EXE... Вот так у меня работает : Код:
OutFile "file.exe" |
Цитата:
Ниже мой пример идёт уже по копированию инсталлера Представь, что инсталлер весит порядка 1 Гб+файл на флешке и ты такой запускаешь инсталлер и наблюдаешь странную картину... Вообще не понимаю, зачем инсталлятору такой функционал, больше напомнило на разработку некого подобия зловреда |
profcom, K.A.V.,
Спасибо ограмное - я не много запуталась с ini файлом, уже справилась. K.A.V., /D - для меня не подходить((, т.к. в момент инсталляции указывается 2 не зависимые директории зато теперь мучаюсь с UAC |
Как сгенерировать рандомное значение по типу:
D-346-3464-4364-3466 |
Цитата:
Извлекаешь из рандомной строки и заносишь в переменные (например в $1 $2 $3 $4 $5 ) - сначала первый символ из рандомного значения, в следующую - со второго по четвёртый символ (или как надо) и т.д. Затем всю эту компанию помещаешь в "конечную" переменную StrCpy $R0 "$1-$2-$3-$4-$5" |
Возникла проблема, WriteRegBin не работает с переменными. Бинарное значение большое более 2000 символов, берем http://nsis.sourceforge.net/Special_...#Large_strings, далее берем плагин Registry:
Код:
${registry::Write} "HKEY_CURRENT_USER\Software\Test" "ID" "3765685853358583585583" "REG_BINARY" $7 Код:
${WriteRegBin} "HKCU\Software\Test" "ID" 5383358853855868358558538 Для полноты картины по пробовали и плагин RegBin тоже ошибка. Проверка версии показывает: Код:
--------------------------- Тестировалось на Windows XP. UPDATE: Команда: Код:
nsExec::exec 'reg add "HKEY_CURRENT_USER\Test" /f /v "ID" /t REG_BINARY /d "447454574574574545"' |
Вложений: 1
Otlanta, c большинством плагинов идут исходники, много плагинов давно не обновлялись и в исходниках у них жестко прописано ограничение в 1024 символа, в данном случае нужно взять исходники плагина Registry, установить Visual C++ 6.0 и поменять всего одно значение в исходниках, и "новый" плагин без ограничения в 1024 символа строки готов
Держите готовый Registry.dll, выставил ограничение строки в 8192 символа |
Цитата:
|
Цитата:
|
Привет народ, :)
alexfinik, Цитата:
Цитата:
AlekseyPopovv, Цитата:
Мои вопросы: - обойден ли лимит в 2ГБ? - исправлен ли косяк с иконкой и свойствами файла, при размере инсталлера больше ~350 МБ? Спасибо.. ,) |
K.A.V.
Попробовал твой пример "Проигрывание WAV-файлов" у себя, ничего не вышло.. Загнал его в .onInit Код:
... |
Цитата:
WinXP 32-bit Win7 32/64-bit Win8 32-bit На всех системах у меня работает данный метод, проигрывает файлы из любой директории Насчет юникода ничего не скажу Может, в пути у вас ошибка или формат WAV файла не тот? |
K.A.V.
Цитата:
Цитата:
Как пример, для Юникода и файлов *.mp3 и их воспроизведения, я использую такой код: Код:
Function .onInit А что с форматом, и каким он должен быть? В справке ничего не указано на этот счет, я использую "DVI IMA ADPCM", а нужен "RAW PCM", или еще какой ?! :unsure: |
Доброе время суток. Можно ли как нибудь узнать какие команды который прописаны в инсталляторе. например регистрация DLL?
|
Цитата:
|
Вложений: 1
Цитата:
Насчет формата файла точно не скажу, уже не помню, тестировал я или нет, но данной командой пользуюсь в SFX Creator для проигрывания звуков Пример моего WAV файла во вложении, попробуйте его проверить. Система без проблем у вас? Драйвера все установлены? Потому как я указал, тестировал на виртуалке во многих системах и нигде проблем не возникло Цитата:
|
Цитата:
|
habib2302,
▫ Чем я могу распаковать инсталлятор, созданный в NSIS? K.A.V., Цитата:
Цитата:
Цитата:
И.. музыка играет.., :yahoo: но не долго..! :angry2: Пока исполнение когда не дойдет до закрытия сплеша: Код:
newadvsplash::show 3500 1500 1500 ffffff "$TEMP\${MOD_NAME_BASE} Installation2\bgi_ground\Splash.bmp" Соответственно вопрос, есть ли какой другой метод/способ кроме спуска функции воспроизведения звука, ниже кода этого сплеша? Или может какой аналогичный сплеш по-новее есть, но без подобных глюков ? :sorry: Спасибо.. ,) |
Цитата:
В своё время для сборки контры я использовал mpg123.exe для проигрывания mp3 файла сразу после запуска установщика, но там вес файла был ~350 Кб |
Цитата:
|
Цитата:
Цитата:
Зы, .. Хм, а кто ее разработчик? что-то все ссылки ведут на трешевые свалки длл.. Для Нсис есть ее описание примеры в работе на сайте ничего не нашел..? |
Приветствую, подскажите решение, в скрипте nsi всего одна секция, но она разрослась, используются все стандартные переменные начиная от $0 и до $R9, и накладываются друг на друга, стала появлятся ошибка, каким образом лучше всего можно оптимизировать эту структуру?
|
Цитата:
Секция сама разрослась? Нет возможности добавить в код дополнительных переменных? Нет возможности раскидать код по функциям? Ошибка? Какая? Каким образом? Какую структуру? Вы с такими вопросами лучше к гадалке сходите, которая ещё и в NSIS при этом шарит, она сразу и вашу всю секцию увидит, и вашу "структуру" и посоветует, как лучше код оптимизировать |
а как завершить процесс с помощью плагина System?
где можно найти ProcessFunc работающий с 3 версией NSIS'a? |
Цитата:
Цитата:
|
Не хотелось бы использовать плагины для этой задачи, можно же наверно средствами WinApi...
|
Цитата:
Код:
System::Call "kernel32::OpenProcess(i0x0001, i0, i1160)i.r0" |
K.A.V., а по имени процесса можно?
|
Цитата:
|
Всем привет!
Цитата:
Код:
XPStyle on Спасибо. |
Цитата:
Там же доки (полезные тем, кто разбирается в программировании) На русском : http://www.tiflocomp.ru/games/design...games/bass.php Применимо к NSIS много полезного в известном хидере Bass.nsh by Diego Pedroso (под рукой сейчас нет, но в сети навалом) PS вот пример : https://yadi.sk/d/gzFnjE_JZSNEw Цитата:
|
Спасибо, буду пытаться разобраться. Но сравнив код, который наваял я, и который показан в примере MKN, у меня возникает множество вопросов. Ясный перец с наскоку здесь не разберешься, особенно если в программировании полный ноль. Справку к плагину System я смотрел, но через переводчик гугл. Только понял, что для передачи в функции целых значений надо использовать литеру "i", для строки - "t", а если это логическое значение, то тогда как? Потом очень неясный вопрос с параметром HWND. Откуда его брать? В общем пока тупик. Понимаете, не хотелось бы тупо копировать часть кода, т.к. нет маневра. Изменяешь условия примера и ничего не работает. Ладно, не буду вас отвлекать.
|
Возвращаясь к библиотеке bass.dll. Просидел всю ночь за мануалами и выявил следующие недостатки при использовании её в NSIS:
- при включении в сценарии параметра поддержки стилей XP (XPStyle on) > воспроизведение не работает; - при включении в сценарии параметра компиляции юникодной версии (Unicode true) > воспроизведение не работает; - при использовании в сценарии графической оболочки MUI или MUI2 (директива !include "MUI.nsh" (!include "MUI2.nsh")) > воспроизведение не работает. При тестировании использовалась последняя версия bass.dll и NSIS v3.0b с официальных сайтов разработчика. Вот немного переделанный рабочий сценарий, предложенный MKN (Пост 872 стр 88 ): При передаче в функцию строки с именем файла, который необходимо воспроизвести, согласно документации System, можно указывать тип строки: t - TCHAR text, ANSI string или w - WCHAR text, Unicode string. То есть, если я правильно понял, то при компиляции юникодной версии инсталлятора команду PHP код:
PHP код:
Еще в функции BASS_StreamCreateFile есть флаг BASS_UNICODE, который указывает, что имя файла задано в кодировке Unicode. Но установка этого флага не дает положительного результата PHP код:
Это проблемы библиотеки bass.dll или NSIS? Можно ли как-то решить все эти вопросы? Или может быть я что-то делаю неправильно? |
Цитата:
В каком месте играть музыке, выбираешь сам. Про Unicode не знаю, нет в нём надобности. Но скорее всего будет работать, т.к. библиотека эта в каком только ПО не применяется... |
Цитата:
Что мешает проверить работу библиотеки bass v2.4.10.0 в юникодной версии инсталлятора? То что Вам нет надобности использовать использовать юникодную версию не значит, что эта надобность не возникнет у другого пользователя, например, MaGoth (сообщение 1263) интересовался этим вопросом. ;) Добавлено: Все ребята, отбой. Проблема была в моей системе (спасибо MKN за наводку). Переустановил. Теперь все путем - все воспроизводится. Прошу прощения за причиненные неудобства. |
Цитата:
Цитата:
Кому надо - сам пусть для себя и проверяет, в чем вопрос то? Как будто здесь кто-то кому-то обязан...Руки есть, интернет есть, качайте что нужно и тестируйте сами Цитата:
Я, например, ни разу ничего не тестировал в уникодной версии NSIS даже будучи автором справочника, т.к. Цитата:
|
Blok,
То что библиотека работает и в UNICODE - 100% Но, в доке : "в структуре BASS_DEVICEINFO значение по умолчанию ANSI" Т.е. надо это дело подружить с NSIS. Каким образом, надо думать... |
Цитата:
|
Цитата:
|
Цитата:
Если в справке будет развиваться это направление, то возможно смогу чем-то помочь... :) |
Определение SID пользователя
( в справочнике немного по другому) Код:
OutFile "sid-Test.exe" |
Адаптировал ProcessFunc.nsh под 3 версию NSIS
--- как пользоваться читаем внимательно в справочнике по NSIS (ссылка на справочник в шапке темы) |
kotkovets,
Согласно справочника Цитата:
И возвращаясь к перечислению дисковых устройств с занесением их всех в переменную : Код:
Function .onInit |
Цитата:
Цитата:
Либо, как я предлагал здесь давныыым давно (не помню уже для чего, но вроде бы тебе тоже код предлагал), хранить несколько значений в одной переменной и считывать данные из "подпеременных" командой ${GetOptions} Хотел, кстати, добавить небольшую статью-пример с хранением нескольких значений в одной переменной в справочник, да что-то передумал, идея вдруг показалась бредовой :blush2: |
Цитата:
|
раз поправил сообщение, дополню
Цитата:
Цитата:
Если делать отдельными переменными, то там просто заносить данные не совсем удобно (если на каждую букву диска делать сравнение), так не пойдёт? В итоге, в одной переменной $var_Drives будет хранится инфа о всех найденных устройствах и их типы, а в переменной $var_Sum общее количество найденных устройств Формат данных будет такой: Код:
/1=C:\ /1_type=2 /2=D:\ /2_type=4 Код:
${GetOptions} "$var_Drives" "/1=" $1 в переменной $2 - тип устройства |
Цитата:
-- добавлю еще одну функцию к хидеру: запуск любого процесса скрытно, с ожиданием и без ожидания, ну если нужно кому то :) |
Подкиньте, пожалуйста, примерчик как с помощью nsis создать портативную версию программы. Спасибо!
|
Цитата:
1. Распаковка файлов (если требуется) 2. Если программа требует лицензию, вносим информацию в реестр (если просто файл ключа, то, соответственно, пропускаем пункт) 3. Запуск приложения с ожиданием 4. Удаление следов после использования приложения (временные файлы, настройки приложения в app/local app папках и т.д., записи в реестре) |
|
Как узнать группу администратров и внести название в переменную?
|
Цитата:
Цитата:
Затем продумаем последовательность команд, которые должны будут выполнены, вы знаете, какие команды хотите видеть в скрипте? У нас есть Справочник по NSIS, раз с NSIS не работали - для начала качайте и читайте "от корки до корки" Небольшой пример скрипта запускаемого файла (все описания команд есть в справочнике): |
Цитата:
|
Цитата:
Цитата:
Здесь тема помощи по скриптам NSIS, а не по изучению чего-либо, не связанного с NSIS Вы приходите в эту тему задать вопрос по языку NSIS, а не для того, чтобы вас чему-то научили за рамками скриптов NSIS Цитата:
Соответственно, вам необходимо сначала настроить программу, затем найти ветку в реестре, куда она сохраняет свои настройки (Process Monitor в помощь), затем экспортировать эту ветку реестра в REG-файл и при запуске вашего portable EXE импортировать REG-файл в реестр, чтобы ваша программа после этого подцепила все настройки, которые вы сами выставили. Цитата:
Я не занимался созданием portable приложений и не интересовался этим вопросом, возможно, это всё делается как-то иначе (скажу больше, мне даже лень гуглить по этому вопросу, т.к. 0% интереса) |
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Приходите, когда у вас будут вопросы по NSIS скрипту и когда вы будете сами знать, что вам вообще нужно конкретно от NSIS, остальные обсуждаемые темы уже считается флудом |
Цитата:
А если уж рассматривать методику создания псевдопортабла в NSIS, то вариант, когда приложение после запуска сначала распаковывает файлы куда надо, затем пишет ключи в реестр, далее регистрирует, если надо DLL и т.д. , а после закрытия приложения удаляются все следы установки - это ведь по сути всё равно что запустить обыкновенный классический NSIS инсталлятор, а после окончания работы приложения - запустить обыкновенный Uninstaller для удаления следов установки + всё это в псевдопортабле надо контролировать для автоудаления после завершения работы приложения. Короче получается - дурь полная, а не портабл. Во-первых, вышеописанное - это просто обыкновенный запуск, установка, работа и удаление приложения (установи, поработай и удали - в чём проблема ? ), а это к портаблу вообще не имеет отношения. (разве что за исключением, что всю эту канитель ещё надо ещё контролировать для автоудаления хвостов после закрытия). Т.е. смысла - ноль. Во-вторых, распаковка файлов после запуска приложения - это уже лажа. В нормальном портабле, находящимся в папке на любом носителе, всё уже готово для работы и ничего распаковывать не надо ! Просто запустил исполняемый файл (или загрузчик) - и сразу работай на здоровье. Никаких следов в ОС и реестре не при запуске, не при закрытии, ессно не будет. Об этом заботятся средства виртуализации спец ПО, с помощью которого портабл был создан. Про второй вариант псевдопортабла c помощью NSIS. Это когда ПО не требует установки и все файлы программы находятся в одной папке где угодно, откуда и запускается программа. Повторяю - ничего никуда после запуска не распаковывается и не устанавливается ! Пачкается при запуске только реестр, ну и иногда добавляются в "пользовательские места" некоторые данные (файлы настроек и пр), которые после закрытия программы и чистятся. Организовать в скрипте это не сложно. Собственно про такой псевдопортабл и можно говорить. Всё остальное - лажа, не имеющая смысла. |
Здравствуйте.
Подскажите, пожалуйста, как в NSIS 3b0 создать лог-файл установки? Пример из справки не компилириутся из-за ошибки: !define: "LVM_GETITEMCOUNT" already defined! |
Цитата:
Код:
!define LVM_GETITEMCOUNT 0x1004 |
K.A.V., спасибо за ответ!
После удаления строки скрипт скомпилировался без ошибок. Также у меня возник вопрос по другому примеру из справки: "Кликабельный BrandingText". Возможно что-то неправильно делаю, но сделать брендинг-текст в виде ссылки у меня не получается, ресурс интерфейса подправил как указано в примере. Возможно плагин Linker не работает с 3-й версией NSIS? Если Вас не затруднит, проверьте, пожалуйста работоспособность кода из примера на NSIS 3b0. P.S есть, конечно, аналогичный плагин - BrandingURL, но результат его работы мне не очень нравится, т.к кликабельность ссылки получается на всю нижнюю площадь инсталлятора, а не только в области самой ссылки. |
Цитата:
|
Flix, спасибо. Не могли бы в таком случае выложить ваш правленный modern.exe?
|
Уважаемые, подскажите как на финишной странице создать произвольное количество run чекбоксов (например три), при условии что ф-ция MUI_FINISHPAGE_SHOWREADME уже используется.
|
Цитата:
Код:
outfile "test_FINISHPAGE.exe" |
WimImage plug-in
Цитата:
|
Добрый день.
Подскажите, как можно сделать такое: в момент установки 121.ехе, ехе запускается от пользователя и от администратора, соответственно активны два процесса с одинаковыми именами. Как можно проверить и запретить запуск 3-го процесса с таким же именем? Если запущен один процесс и не запускать второй - это знаю, не подходит((( |
Вложений: 1
Цитата:
|
Цитата:
2. При проверке убивать все процессы, PID которых отличается от сохранённых ранее Всю суть не особо уловил, кто там и что у вас запускает и как вообще всё устроено, но хотя бы с логикой действий вам думаю подсказал... |
Давно интересует такой вопрос - каким образом удалять/устанавливать файлы (в частности DLL) "занятые" ShellExtension не перезагружая explorer ( или подобное ПО, типа TotalCommander и т.п. )?
К примеру, установили ПО из собственного NSIS инсталлятора , в котором при участии какой то DLL , в контекстное меню добавились какие то пункты. Если удалять это ПО, при запущенном explorer_e , то как только процесс доходит до удаления этой DLL - получаем предупреждение, что файл(ы) уже используется. Ессно, если закрыть explorer, то удаление произойдёт нормально. Но это совершенно не интересно. В то же время штатный анинсталлер этого ПО, спокойно удаляет эти же файлы при запущенном explorer_e ! Как это он делает ? Возможно ли решить такую задачу в NSIS ? Есть предположение, что используется функция System::Call 'Ole32::CoFreeUnusedLibraries() v' |
Цитата:
|
Цитата:
DLL занята системой, и хоть тресни никак не освобождается для удаления... |
Цитата:
UPD В общем сработало только при таком варианте кода: Код:
Function myGuiInit |
Цитата:
PHP код:
P.S. На офсайте для ANSI версии плагина Linker v1.2 ошибочно выложена Unicode версия. Поэтому используйте плагин из моего архива (см. сообщение 1309). |
Определить версию ( VerifyOSVersion ) новой Windows 10 (как и предыдущие версии ОС ) можно с помощью StdUtils
автор LoRd_MuldeR http://sourceforge.net/projects/muld...3.zip/download |
kotkovets,
Не выходило случаем еще обновок для winver2.nsh, по части определения версий для Win 8/8.1/9/10 ?! |
Цитата:
|
Встречаем NSIS v3.0b1. :yahoo:
Что нового (изменилось, добавлено) - читаем здесь. Загрузить релиз можно с оффсайта. Отчеты об ошибках сообщаем на форум NSIS. |
Flix, благодарю за готовый скрипт.
Однако, есть баг: Если нажать на ссылку, а потом перейти обратно к окошку инсталлятора, то ссылку "колбасит". На картинке видно что с ней происходит) У меня WinXP ![]() К сожалению с таким багом не смогу использовать кликабельный брендинг-текст в своём инсталляторе. Может быть подскажете возможно ли просто ссылку сделать кликабельной в тексте на страницах установщика? Например текст: Рекомендуем посетить сайт ввв.мояпрога.ру и чтобы текст ввв.мояпрога.ру был кликабелен? Не могу никак с этим плагином разобраться( А сам НСИС текст ссылок в линки не преобразовывает. В справочнике тоже нет инфы о том как ссылки добавлять в текст. Вроде НСИСу уже лет 10, а таких элементарных возможностей почему-то нет... |
Serg866,
Попробуй плагин BrandingURL http://nsis.sourceforge.net/BrandingURL_plug-in Linker плаг всегда странно работал... ( Хотя для этого дела плагин и не оч то нужен. Достаточно ExecShell "open" "http://....." с соответствующей "обвязкой" ) Код:
OutFile BrandingURL_test.exe Цитата:
|
NSIS 3.0b1
Release Notes : http://nsis.sourceforge.net/Docs/AppendixF.html#v3.0b1 Download : https://drone.io/github.com/kichik/nsis/files |
Цитата:
Цитата:
Цитата:
|
Цитата:
Хотя моя ссылка на иной источник и с ( почему то) иным содержанием... |
Цитата:
Цитата:
|
Цитата:
Например на странице лицензии это текст типа: "Для перемещения по тексту..." Цитата:
А также ссылка в брендинг текст кликабельна не только в месте где текст, но и по всей длине инсталлятора. Тоже выглядит как недоработка. В итоге получаем что кликабельный брендинг-текст без косяков сделать невозможно. Цитата:
Я ничего конректного не нашёл насчёт вопроса кликабельности ссылок в тексте на страницах инсталлера. |
Цитата:
|
Вложений: 1
Serg866, немного подкорректировал плагин Linker v1.2, точнее убрал функцию перерисовки элементов при потере окном инсталлятора фокуса. Пробуйте, тестируйте. Если такой результат вас удовлетворяет, то пользуйтесь на здоровье. Может быть еще кому пригодится. Только рекомендую оригинальный файл плагина (ANSI и Unicode) переименовать или сделать его резервную копию, прежде чем использовать модифицированный.
В прикрепленном к сообщению архиве ClickBrandLabel_MOD.zip находятся модифицированные ANSI и Unicode версия плагина Linker v1.2, а также модифицированные файлы GUI, в которых для элемента с брандинг текстом удалено свойство WS_DISABLED. |
Flix, благодарю. Тестил Unicode версию исправленного плагина Linker, пропал глюк со ссылкой после нажатия на неё. Но у меня ХП, нужно ещё чтоб кто-нибудь проверил на Вин7-8.
И тогда, на мой взгляд: всё, что сделано Вами на эту тему (исправленный ресурс, исправленный плаг и готовый код-пример) можно размещать в справочнике NSIS. Точнее обновить имеющуюся там инфу по вопросу кликабельного брендинг-текста. Цитата:
А не знаете что нужно подправить, чтобы плагин BrandingURL заработал на Unicode версии? Обычно у всех плагинов имеется отдельная версия под Unicode, а у этого почему-то только для ANSI ------------------ P.S: А вот тема о том как добавить кликабельную ссылку в тексте на страницах инсталлера так и не раскрыта пока. Тоже в принципе нужная вещь... Может подумаем что сделать можно? Просто в моём инсталляторе ещё на странице финиша задуманы ссылки на несколько сайтов. В формате типа: За предоставленные материалы благодарим администрацию ресурса ввв.такой-тосайт.ру Обновления продукта доступны на сайтах ввв.сайт.ру и ввв.ещёсайт.ру Как-то несолидно когда ссылки не кликабельны. Не помешал бы справочный материал по этому поводу :) |
Вложений: 1
Цитата:
Цитата:
В общем пересобрал проект плагина BrandingURL в Microsoft Visual Studio 2010 и добавил версию Unicode. Кому надо берем архив в аттаче. :) Функциональность плагина осталась без изменений. Цитата:
|
Flix. Дай Бог тебе здоровья. Ещё раз спасибо за помощь!
Юникод версию плагина БрендингУрл завтра проверю и отпишусь. Пока как советовали выше попробовал подправить файл ресурса (modern.exe) и уменьшить длину контрола 1028 в диалоге 105, чтобы кликабельность брендового текста была не по всей длине инсталлера, а только в области самого текста. Так вот это не сработало( Всё равно на всю площадь кликабельность сохраняется. Видимо всё же это сам плагин копать надо, а не оболочку инсталлятора... Как это выглядит на примере: Брендовая ссылка у нас в левом уголке аккуратненько вставлена, а кликабельно при этом всё, что выделено пунктиром. ![]() ------------------ Цитата:
Например есть команда с текстом для финишной страницы: !define MUI_FINISHPAGE_TEXT "Спасибо за установку программы! Обновления доступны на сайтах ww.такой-тосайт.ру и www.ещёкакой-тосайт.ру." Вот как сделать чтобы ссылки были не в виде текста, а стали активными? А про команду MUI_FINISHPAGE_LINK я в курсе. Она просто добавляет линк после финишного текста. |
Цитата:
А касательно гиперссылок в тексте, то самое простое здесь, это использовать плагин nsWeb + html файлик с нужным содержимым. Как это работает в UNICOD_е, не знаю, т.к. не использую за ненадобностью. |
Цитата:
Загрузите файл modern.exe в редактор ресурсов, например Resource Hacker. Перейдите на ресурс диалога 105. В правой половине редактора, в тексте сценария, найдите элемент с номером 1028 - это брандинг текст. Измените в нем значение ширины (W) элемента на желаемое, например 90 (в зависимости от длины вашего текста). Затем нажмите кнопку "Compile Script". После чего сохраните сделанные изменения в файле (меню "File -> Save"). Компилируете ваш проект. Теперь ширина элемента с брандинг текстом будет соответствовать заданному значению. |
Flix, всё, разобрался.
Проверил Unicode версию плагина BrandingURL. Работает. Вопрос с брендинг-текстом можно считать решённым :) Цитата:
|
Цитата:
Цитата:
|
Добрый день, как поместить всё содержимое текстового файла в одну переменную?
|
Цитата:
|
Цитата:
Код:
FileOpen $4 "${__FILE__}" r А вот, если надо тыщи строк поместить в переменную, получится в принципе ? ( для работы с большими rtf , вроде как, придумали LoadRTF.nsh. А для того же txt ? ) |
Цитата:
Цитата:
и с каждым циклом переменная NSIS перезаписывается - по барабану rtf или txt |
Если необходимо, чтобы при отмеченном каком либо чекбоксе на PAGE_COMPONENTS - открывалась кастомная страница (с содержанием, связанным с назначением отмеченного чекбокса), то можно использовать такой код :
Код:
OutFile "IfSelectSection_ShowCustomPage.exe" |
Появился новый плагин - EmbedHTML
http://nsis.sourceforge.net/EmbedHTML_plug-in Открывает страницы (online и offline ) в выбранном окне (сообразно ID) , например в PAGE_LICENSE Работает с движком IE, начиная с IE9 (это Windows 7 и т.д.) ps Кому не нравится использовать внешние html файлы, создавайте их на здоровье сами в скрипте. |
Цитата:
ToggleInstFiles.dll , возможно и ещё какие то. Просто надоело устанавливать...) Плюс ругань на !define PBM_SETBARCOLOR 0x111E (по моему вообще не нужен т.к. уже есть в хедере (хотя и не с такой константой... тоже вопрос... ) А в целом, овчинка, по моему, вообще не стоит выделки... |
Пожалуйста, подскажите как с помощью NSIS переименовать секцию в ini-файле. Чем проще - тем лучше :)
|
Цитата:
2. Можно воспользоваться плагином EnumINI (описание опять же, есть в справочнике), с помощью которого можно перечислить все параметры со значениями в конкретной секции (мы же знаем имя секции) - и просто записать все параметры со значением с новым именем секции, а секцию со старыми именем затем удалить Если INI файл у вас не огромный по количеству строк (а, как мы знаем, у NSIS есть проблемы с чтением строк файла с большим количеством строк, когда скорость замедляется), то можно воспользоваться и первым методом |
K.A.V., спасибо. Реализовал с помощью ${LineFind} --> ${WordReplace}.
|
Здравствуйте.
Подскажите, пожалуйста, как грамотнее реализовать создание чекбокса на MUI_PAGE_DIRECTORY. Отредактировал modern.exe, добавив туда чекбокс, но пока не получается с ним управиться. Есть идеи? |
Цитата:
Цитата:
Если вы любите заниматься с 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 |
Цитата:
Цитата:
Спасибо за помощь, всё делал именно так, но не добавил: Код:
page custom MUI_PAGE_DIRECTORY_POST |
Цитата:
Цитата:
Цитата:
Ессно и то и другое - это результат, а значит имеет право быть. |
Обновился NSIS Dialog Designer до v. 1.3.1 2014-10-27
http://coolsoft.altervista.org/en/nsisdialogdesigner |
Проблемка, как узнать Serial HDD, c помощью NSIS?
|
Цитата:
|
Нужна помощь в таком вопросе. сделал инсталлятор, который позволяет переустанавливать мое ПО поверх текущей версии, т.е. без вызова удаления. В моем ПО есть длл с СОМ-сервером. Поэтому в момент переустановки эта длл может быть занята другим приложением. Мне надо следующее:
1) при невозможности заменить файл длл новым файлом попоросить перезагрузку 2) после перезагрузки удалить старый и скопировать новый файл. 2) после замены файла зарегистрировать эту длл через RegDLL Как это сделать? |
Цитата:
2. Проверяете, есть ли эта dll на диске (если есть, значит занята приложением и не удалена) (команда IfFileExists) 3. Если dll не удалена, пользуемся командами MessageBox и Reboot Цитата:
2. Либо добавляете в свой пакет инсталлятора отдельную функцию, +добавляете обработку ключа командной строки и прописываете в RunOnce исполнение своего же инсталлятора с ключем, в коде инсталлятора в функции .onInit проверяете наличие ключа в параметре запуска (команда GetOptions), если ключ есть - выполняете написанную функцию по удалению dll и копированию нового файла Цитата:
Описание команд есть в справочнике, ссылка на справочник в моей подписи либо в шапке темы блин, похоже, я вас не правильно понял и вы просили готовый код? |
Sann-X!, можно попробовать такой вариант:
Код:
ExecWait 'regsvr32.exe /s /u "$INSTDIR\Sample.dll"' ;Снимаем регистрацию с DLL Можно вывести на экран сообщение о необходимости перезагрузки, если старая DLL до сих пор используется и удалить её до перезагрузки не получилось: Код:
${If} ${FileExists} "$INSTDIR\Sample.tmp" |
Спасибо. Для меня главная трудность была продолжение работы инсталлятора после перезагрузки. Спасибо, что разъяснили, как это сделать.
|
Привет.
Столкнулся с небольшой проблемой по NSIS. Нужно реализовать функцию проверки размера файла (md5) по принципу если размер совпадает с заданным в скрипте, то установка идёт по одному пути (выполняется одно действие), если не совпадает - по другому (выполняется иное действие). Никак не могу что-то продумать эту операцию... Задача в том, что если у юзера установлена заданная версия файла, то устанавливаются одни компоненты, если версия файла не совпадает - другие компоненты. Ребят, помогите, пожалуйста, в этом вопросе. |
Aster, есть такой плагин: http://nsis.sourceforge.net/MD5_plugin
Код:
!include logiclib.nsh |
Уважаемые, подскажите, есть ли плагин или какой-нибудь метод, для упаковки инсталлятором на ПК, на который идет установка, группы файлов в архив (например, ZIP). Плагины - распаковщики есть, а упаковщики?
|
Цитата:
Упаковать папку mydir в архив mydir.zip: Код:
zip.exe -r mydir.zip mydir Код:
zip.exe -r archive.zip script.nsi Упаковать два файла в архив archive.zip Код:
zip.exe -r archive.zip script.nsi script1.nsi Нужно более мощное сжатие - есть консольная версия архиватора 7z и подобные команды. |
Begin2Fly, Хотелось без лишних EXE_шников в пакете обойтись...будем думать. Есть кое-что из Resurs Kit. Файлообменник подсунул параллельно какой-то левый Setap - браузер перехватил.
|
Есть у меня старый проект, который создается инсталлятором Install Aware Express 7 R2. При удалении длл, даже если они используются другими приложениями, эти длл удаляются без перезагрузки. Как мне так же сделать в NSIS? Есть идеи?
|
Цитата:
Как это дело довести до ума, пока неизвестно... Но ,если "по правилам", ситуации, когда при удалении\установки ПО, DLL этого ПО занята чем либо - быть не должно. Раз DLL занята, то следовательно открыто какое то приложение, которое использует эту DLL. А, как известно "из азбуки", перед установкой\удалением любого ПО, сначала должны быть закрыты все открытые приложения ! ( Причины этого не раз рассматривались... ) О чём пользователь получает соответсвующее предупреждение (если ПО написано нормальным программером :) ). В NSIS это легко организовать с помощью LockedList плагина. Вероятно некоторые разработчики при удалении\установки своего ПО принудительно закрывают, именно те приложения/процессы, которые мешают удалению\установке... Что не всегда допустимо... Наверно, правильнее было бы получать сообщение, типа - такая то конкретная DLL не может быть удалена, пока Вы не закроете такое то конкретное приложение. (LockedList, к слову, так не умеет... Но можно привлечь для этого утилитку WhoUses.exe, что не оч интересно... ) Если кто подскажет, как в NSIS организовать именно такое сообщение - будет здОрово и полезно. :) |
Я решил сделать так:
- удалить файл длл - если не удалился, то показать, какие процессы его держат (я написал плагин на Делфи, который в стеке возвращает процессы). Показываю окошко "MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION" - если юзер нажал "Пропустить", то я удаляю файл через "Delete /REBOOTOK", в реестре в "RunOnce" прописываю прогу, которая заменит файлы. Если коротко, то так. |
Цитата:
|
Удалится без перезагрузки. Я, как пользователь, ненавижу эту штуку в инсталляторах. Поэтому в моем случае можно все норм. установить без перезагрузки: юзер видит, какие процессы держат файл, юзер может закрыть их и нажать кнопку "Повтор" - в этом случае длл будет заменена норм, без перезагрузки.
|
Цитата:
Если получает сообщение о том, какой процесс удерживает DLL и закрыть ли этот процесс и удалить DLL ? - то тогда всё нормально, всё понятно. Других действий и не нужно... (закрытие процесса и удаление DLL ведь предполагается нажатием одной кнопки в сообщении ? ) |
Не, плагин только выдает список процесссов, которые держат файл. А в самом NSIS уже вывожу "MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION" и анализирую действие юзера. А так да, в самом сообщении прошу закрыть указанные процессы.
|
Цитата:
|
Ну, юзер выберет из 2х зол меньшее: либо самому закрыть процессы или сделать перезагрузку компа. А разве есть 3й вариант?
|
Цитата:
|
Автозакрытие - это уже будет больше походить на хак. А если это будет какой-нить Word? Тогда слишком усложняется весь процесс инсталлятора: надо всем процессам (приложения и службы) послать команду "закрыть" (как это сделать пока не знаю), а потом ждать закрытия каждого процесса... Долго будет и муторно программировать.
|
Цитата:
|
Хак в том, чтобы инсталлятор закрыл приложение. Я не знаю, как это сделать (WM_CLOSE для приложения, а для службы как, имея хэндл процесса?). Лучше я оставлю как есть. А то больно сложный код инсталлятора получается.
Хотя вот есть плагин KillProcDLL_plug-in |
Цитата:
|
У меня наоборот: процессы нужные есть (полный путь к файлу), а вот кода по закрытию пока нет. Попробую, поищу.
Я так понял, что для закрытия процессов (приложений и служб) мне одного LockedList хватит? |
Цитата:
|
А в LockedList есть возможность самому составить список процессов?
Вроде есть: Adds a custom item to the list with a callback function. Значит, буду шаманить. Цитата:
|
Цитата:
|
Нашел минус в LockedList: если процесс - служба, то он завершает ее принудительно, хотя можно это сделать мягко.
|
Как создать массив данных (или просто переменная) в длл на делфи так, чтобы потом с этим массивом/переменной можно было работать в NSIS?
Например, у меня в длл есть такая переменная: Код:
library libname; Код:
My_dll::proba1 |
И снова о "занятых" DLL...
Читать дальше...
В составе программы FolderSizes (foldersizes.com) есть файл FSShellExt.dll, с помощью которого в контекстное меню папок добавляются собственные команды программы. ![]() Мне нужно пропатчить эту dll-ку или, в крайнем случае, заменить своей и, конечно же, без перезагрузки. Проблема в том, что dll-ка "занята" и не поддается изменению/удалению. Скопировать её можно. Не очень понимая, что получаю, заметил такую закономерность. Пока контекстное меню папки (любой) не вызывалось, файл остается "свободным", хоть до выключения компьютера. ![]() Как только контекстное меню вызвано, файл "захватывает" Explorer.exe. ![]() Просто так его уже не удалить. ![]() Но файл FSShellExt.dll можно ЗАМЕНИТЬ вручную (из учетки администратора, Win 8.1), например, его же копией. Проводник сопротивляется, но все же дает выполнить эту операцию. ![]() О чудо! Файл теперь можно патчить, удалять, перемещать, переименовывать и т.д. И опять же, до вызова контекстного меню папки. Так как бы узнать, какая команда была выполнена, что Проводник разблокировал файл и можно ли это как-то использовать в сценарии NSIS? Насколько я понимаю, регистрация FSShellExt.dll не отменяется и сохраняется даже после его удаления. Контекстное меню начинает работать сразу же после копирования файла FSShellExt.dll на то же место (в папку программы) и вызова контекстного меню папки. ![]() |
Цитата:
|
Цитата:
Подставляю имя dll-ки в пример LockedListShell32.nsi для проверки. Читать дальше
Код:
Name `LockedList Test` ![]() |
Цитата:
Цитата:
Если работать с 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 ) ? Вячеслав, помоги пожалуйста решить эту задачу. |
Цитата:
|
Цитата:
Цитата:
У меня рестарт проводника в W8x32 происходит нормально - на секнду исчезают значки раб стола и затем восстанавливаются. Может как то и можно принудительно "заморозить" на время рестарта это не красивое исчезновение - не знаю... |
Цитата:
Командно работает точно также. Оказывается explorer.exe убивается и запускается - его видно в диспетчере задач - но какой-то недоделанный. Чтобы стал виден Рабочий стол, Проводник нужно запустить из Диспетчера как новую задачу. В общем, не знаю, как правильно пояснить. Может маленькое видео поможет. |
Здравствуйте господа форумчане. Спустя много времени я решил вернутся к своему старому проекту, а посему нужна ваша помощь. Как из окошка исполняемой консольной программы передать все что там выводится в функцию nsis? Логирование в реальном времени. Это нужно прежде всего, чтобы "поймать" нужное сообщение, и послать окошку нажатие enter как только оно(нужное сообщение) появится, ну и чтобы посылать весь лог в detailed окно nsis. Вы скажете "а почему бы тебе не использовать execdos plug-in для этих целей?" С ним- не получается почему-то.Использую execcmd.
|
Нашел решение своей проблемы с плагинами. По умолчанию при вызове ф-ции из плагина dll-ка перед выполнением загружается в память, а после выполнения выгружается из памяти. И так каждый раз при вызове любой ф-ции dll. Поэтому данные в памяти не сохраняются между вызовами dll. Чтобы dll каждый раз не выгружалась, следовало использовать "/NOUNLOAD" или "SetPluginsUnload". Однако с версии 2.42 эти "штуки" считаются устаревшими и не рекомендуются для использования. Вот здесь в последнем сообщении есть пример на Delphi, как создать dll, которая сохраняет память между вызовами ее ф-ций.
|
Цитата:
Цитата:
Цитата:
Интересно, он прочитает документацию к плагину и посмотрит примеры, или как год назад начнёт насиловать мозг глупыми вопросами? |
Читал. Пробовал. Не получается. Как скажите мне, отправлять что то окну если при использовании execdos это окно не создается? Я общался с создателем execdos и execcmd, и он мне посоветовал с моей задачей использовать execcmd. Вместо сарказма могли бы помочь..
|
Цитата:
Я вот сейчас опять же за вас взял, открыл пример скрипта их архива с плагином, подставил путь к консольному приложению и у меня всё считалось. Почему? Цитата:
Вы хотите, чтобы я сейчас опять за вас начал прочитывать сообщения годичной давности в этой теме и начал повторять их содержимое? Цитата:
Всё-таки придётся сделать за вас. Данный пример кода создаёт текстовый документ в папке с выходным файлом, в котором будет результат исполнения команды help.exe, которая находится в системной директории. Скрытый текст
Код:
|
K.A.V., Спасибо за код, но ведь я же писал что в первую очередь нужно отправить enter выполняемому приложению, а используя execdos этого не сделаешь. Разве я не прав?
|
Цитата:
Плагины ExecCmd и ExecDos используются для создания процесса с скрытым окном приложения. Всё. Это основной функционал. С чего вы взяли вообще, что именно с помощью ExecCmd/ExecDos можно отправлять сообщения окну? Ещё раз повторюсь, что пример отправки нажатия Enter в консольное приложение вам давали год назад, разве я не прав? Со стороны это выглядит довольно глупо, начинать обсуждать год спустя то, что уже обсуждали. Вы память потеряли? Или просто опять лень теперь уже прочитать всё то, что уже написано год назад в этой теме? |
K.A.V., с помощью execcmd да, можно. А с чего вы взяли что я с чего-то взял что можно отправлять именно с помощью плагинов? Можно и подругому. Хорошо, спрошу иначе- можно ли без использования плагинов отправлять лог из выполняемого консольного приложения в nsis функцию?
|
Цитата:
Я пробовал разные утилитки, предназначенные специально для рестарта - всё в целом одно и то же - тормоза и визуально ужасно... Например, : 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 Кстати, лучше всех отрабатывает батник, вообщем такой же что я уже тебе давал + организована пинг-задержка : Цитата:
Цитата:
(Про не отображение эксплорера плагином, автор пока ничего не сказал...) Почитав разную инфу про установку-удаление занятых DLL без перезагрузки компа или эксплорера, я пришёл к выводу, что идея эта - очень плохая... Отбирать у Винды, удерживаемый ей файл - всё равно , что отбирать у ребёнка конфету. Крику и слёз не оберёшься... :) Лучше отложенного удаления "занятых" файлов, после ближайшей перезагрузки, ничего не придумано... А если и придумано, то держится в великом секрете... :) (есть ещё экзотика с манипуляцией помещения файлов в память и чего то там ещё, но это для крутых программеров..) Ну и ещё используется вариант - подмена исходных файлов на нужные, с переименованием исходных . Это дело известное и похоже, самое эффективное... Также можно использовать сторонние утилитки типа inuse.exe или MoveFile Цитата:
Цитата:
|
MKN, большое спасибо за то, что провели исследование данной проблемы и поделились результатами. Ваши рекомендации попробую применить для своих целей.
|
Цитата:
Конечно возможны нюансы и частные случаи, но ты ведь до сих пор ничего конкретного не сказал (какое консольное приложение запускаешь, что именно из него хочешь обработать и т.д. )... 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/..._вывод_консоли |
MKN , вообще-то называл год назад :) обработать надо все что в лог выводит приложение... большое спасибо за ссылки! Теперь пойду читать примеры по работе с текстом в nsis
|
Ребят Можно ли как-то добавить свой текст на странице прогресса установки (под прогресс баром)?
Вывод деталей установки отключён - там пусто сейчас. Хочу кое каким текстом заполнить. |
Цитата:
Код:
OutFile "PAGE_INSTFILES_TXT_Test.exe" |
MKN, благодарю за подробный пример! Всё сработало!
Очень полезная возможность. А можно ли туда ещё небольшую картинку приделать? Что-то вроде баннера. |
Цитата:
Код:
!define HWND_TOP 0 |
MKN, спасибо, выручаешь. И ещё один вопрос по этой теме.
Команда: StrCpy $R7 "Текст Текст Текст Текст Текст Текст Текст Текст" Как в ней делать перенос строки? $\n не срабатывает( +если можно, то подскажи, пожалуйста, как добавить ещё 2 строки с текстом над текстом, который в рамке? То есть нужен ещё просто текст над рамкой. Ну и ещё один момент - текст почему-то редактируемый получается в рамке. Думал это из-за значения EDIT в команде System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R7",\ Попробовал STATIC - текст вообще пропал) Короче у меня руки походу растут не откуда надо) |
Пока сам поковырял и погуглил по теме. Вроде получилось то что задумал.
![]() Могу и код выложить... Но просто он такой ужасный, что при его виде у профи по НСИСУ станет плохо с сердцем. Я даже не знаю как он скомпилировался. И уточню вопрос в тексте. Хочу, чтоб текст можно было скопировать в буфер, но при этом чтоб нельзя его было изменять в области окна. |
Serg866, добавьте эту строку к похожим:
Код:
SendMessage $R2 ${EM_SETREADONLY} 1 0 |
Begin2Fly, нее, что-то не срабатывает команда
|
Serg866, я добавлял к коду MKN, возможно, вы что-то переделывали.
Код:
OutFile "PAGE_INSTFILES_TXT_Test.exe" |
Begin2Fly , да я наворотил что-то там... Отправил Вам в личку код.
Надо его облагородить. |
Цитата:
Как ты уже правильно хотел сделать, поменяй EDIT на STATIC. И, раз не нужно редактирование, удали не нужные флаги. Т.е. ,будет : Код:
System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R7",i ${WS_CHILD}|${WS_VISIBLE},\ WS_VISIBLE - Создается окно, которое сразу становится видимым. По умолчанию окна создаются невидимыми, и для их отображения требуется вызывать функцию ShowWindow . можно ещё короче : Код:
System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R7",i${DEFAULT_STYLES},\ (Если не хочется видеть полосу прокрутки, а текста много - расширь область окна, смести прогресс бар повыше и сделай уже его полоску. Вариантов много.) ps про всё это уже говорилось в теме |
Serg866,
Вот вариант для PAGE_INSTFILES с собственным окном для текста, с текстом-заголовком над этим окном и картинкой : ![]() |
Народ , в чем может быть проблема кода :
Код:
${If} ${KeyExists} "${HKLM}\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}" Ось 7 x64 |
Painkiller,
Что это у тебя за синтаксис ?... попробуй такие варианты : Код:
ClearErrors Код:
ClearErrors |
Цитата:
Цитата:
Код:
ClearErrors Код:
!include "Registry.nsh" |
Painkiller,
Конечно не работает, ведь ReadRegStr читает не сам ключ, а его значение (а оно у тебя пусто, или по факту какое то есть ? Если есть, то вполне можно "привязаться" к нему) Если значения нет, используй EnumRegKey, с ним работает : Код:
ClearErrors |
Цитата:
Код:
${registry::KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}" $9 |
Радовался что все получилось , да вот зря=(( Не все ключ правильно определяет (((
|
Цитата:
Тогда можно так : Код:
${Do} |
MKN, мне нужен код чтобы при наличии ключа выполнял какие-то действия и при его отсутствии тоже выполнял определенные действия ?? Как изменить код , который вы мне оставили для моих нужд ?
|
Painkiller,
Цитата:
Код:
MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации." |
Цитата:
Ладно, решу проблему на delphi |
Цитата:
Т.е. , ещё раз - нет ключа: весь твой код установки до keyexist: Есть ключ: весь необходимый код после keyexist: |
Используем с помощью функции AddFontResourceEx - на страницах шрифт, НЕ установленный в системе.
Пример 1. Используем свой шрифт для цифрового табло в часиках. Страницу используем с круглым фейсом с перетаскиванием за любую точку, и украсим шрифтом-снежинками. :) ![]() комплект для сборки : http://www.mediafire.com/?eh3doa9jt5h34gf Пример 2. Используем свой шрифт для оригинальных надписей на странице + туда же поместим снежинки ![]() комплект для сборки : http://www.mediafire.com/?re6kc7ts9ww33hd |
Хочу чтоб инсталл копировал файл находящийся рядом сним
Пишу так (File "$EXEDIR\setup.arc) на что компилятор ругается , как решить это ? |
Цитата:
Код:
${If} ${FileExists} "$EXEDIR\setup.arc" |
Цитата:
Почитайте различие команд File и Copyfiles |
Painkiller Большое спасибо!!!
|
Бегущая текстовая строка
Код:
!include "nsDialogs.nsh" |
Цитата:
Код:
!include "nsDialogs.nsh" |
K.A.V.,
Вот спасибо ! Как всё просто. А я нагородил, что все буквы, как взрывом разбрасывало по строке... :) Может подскажешь, как в таком забавном коде, задать конкретное направление (слева-направо) ? А то какие то качели получаются : Задаём траекторию движения с помощью Math и NsResize плагинов ( http://nsis.sourceforge.net/NsResize_plug-in ) Код:
Например, Math::Script `R0 = R0 + 0.1; R1 = 140 + cos(R0) * 140; R2 = 55 + sin(R0) * 50` |
Цитата:
nsResize::Set функция для того, чтобы изменить расположение/размер элемента, первые два параметра: Цитата:
Math плагин в твоём примере просто генерирует тебе координаты точек, по которым затем nsResize перемещает элемент Отсюда делаем вывод, что ты можешь простыми командами сам высчитывать необходимые тебе координаты для элемента, как в пример: Код:
!AddPluginDir . |
Цитата:
Интересна "формула" в Math плагине, задающего траекторию движения. Возможно ли изменить математику для прямолинейного одностороннего движения ? Касательно описания этого плагина - а нет никакого внятного описания, окромя запутанного примера, по которому вообще ни черта не понятно... :) |
Тебе что нужно то в итоге? Либо я тебя не понял, либо ты просто закидываешь код ненужными плагинами и командами, т.к.:
Цитата:
Цитата:
Я же тебе дал пример, чтобы переместить элемент чисто в горизонтали - нам не нужен плагин Math, если ты хочешь сделать свои карусели, что кружит элемент, как в твоём примере -это другой вопрос |
Цитата:
|
Цитата:
Тебе слова width и height в строке Код:
nsResize::Set control_HWND x y width height Код:
!AddPluginDir . |
Цитата:
|
Чего-то я намутил и теперь у меня проблема с переключением секций. При отказе от установки компонента, возврате на несколько окон назад, а потом снова к выбору компонента, можно выбрать сразу несколько компонентов, что недопустимо. Пришлось маскировать свои косяки "умными" сообщениями о необходимости выбрать только один компонент.
![]() Код громоздкий, возможно тупой, но нужные мне действия выполняет, если не обращать внимание на описанную выше проблему. Для удобства сложил все в один архив: ProblemSwitchSections.zip Всех с наступившим Новым годом и рождественскими праздниками! |
Kopejkin, добавь в код переменную в начале кода
Код:
var MyVar Код:
Function .onSelChange Код:
Function .onSelChange |
K.A.V., спасибо большое! Работает. А можно пояснить, так сказать, физический смысл назначения и использования собственной переменной?
|
Цитата:
В справочнике гляньте пример, там ещё есть такой вот кусочек кода: Цитата:
На то время, когда пример был добавлен в справочник - я всех тонкостей этого вопроса не знал, поэтому там пример кода из файлов примеров NSIS Так что в будущем, во всех ваших кодах сразу создавайте свою переменную для таких компонентов |
С прошедшими и с наступающим Старым НГ!
Подскажите пожалуйста, как прописать в скрипте для NSIS директорию вместе с её содержимым, чтобы не перечислять каждый файл в отдельности? Сейчас секция в скрипте имеет вид: Код:
Section "AllFonTV" SEC03 |
megane68, в шапке есть справочник по NSIS, который люди делали специально во избежание подобных вопросов.
Найдите там "Перевод справки NSIS -> File". |
Цитата Begin2Fly:
"Перевод справки NSIS -> File". » Спасибо за подсказку. Собственно больше ничего и не нужно. Нашёл ключ /r. |
Привет народ.. :)
Цитата:
И как оно, нормально работает? Если кто ни будь проверял, отпишите плиз, у самого пока нет возможности проверить.. Спасибо. |
Цитата:
|
Цитата:
Судя по переписке оно работает корректно: http://forums.winamp.com/showthread.php?t=377498 Но, только на осях Вин7 и выше, членово.. :( Есть вариант заюзать оригинальный плагин либы WimImage, но я хз как оно там и что настраивается. И будет ли полезно для Нсис.. http://sourceforge.net/projects/wimlib/ Цитата:
А вообще, хорошего инсталлера надо, с: - исправлением наконец-то сраного бага "иконки" в Нсис, которая убивается при компиляции чего угодно выше 300 мег; - реализации его нормальной работы с разными версиями архиваторов, без убогих консольных окон и прочего мелькающего дерьма, по мере установки; - реализации нормальной и вменяемой системы элементов управления в панели выбора компонентов, вместо кривого не-до чек-бокса; - реализации нормальной работы с файлами выше 2 ГБ; От этого уже давно нада (!) :yes: |
Цитата:
Цитата:
И в чем проблема использовать другие плагины, например NsUnzip для распаковки zip архивов и стороннюю unrar.dll для распаковки rar архивов? Цитата:
Тем более, собственные странички никуда не пропали, можно написать свой интерфейс со своими элементами/страничками и сделать его на свой вкус, заменив стандартные диалоги Цитата:
|
Цитата:
Вся проблема в этом дерьме: SFX ? Цитата:
Программный продукт изначально должен быть ориентирован на большее число архиваторов, причем, встроенных на уровне его кода или компонентов. Коли его позиционируют как супер-пупер Инсталлер. А это не так, судя по всему.. Вот именно, что проблема в этих самых сторонних телодвижениях и левых длл, которые отрабатывают в стороне от основного процесса проги, а не в ней самой непосредственно, с соответствующим Гуем для юзера и прочими интерфейсными радостями встроенными непосредственно в требуемые окна установщика.. Это называется "человеческий интерфейс" у проги, которого в Нсис никогда не валялось даже близко.. Цитата:
Моя что-то сомневается в этом, или мы друг-друга не поняли ?! Хотелось бы видеть пример нормальной работы разношерстных компонентов, с каким угодно выбором, параметрами взаимоисключения и т.д. и т.п.. Если не трудно. :) Цитата:
И что здесь делать можно с этим огрызком ?! :dont-know |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
По поводу компонентов я уже говорил, можно создать свою страничку, а можно воспользоваться функцией onSelChange и своей головой, всё для работы с секциями есть в справочнике (описание команд), можете сделать какой угодно функционал, зависит только от вас Цитата:
А как сделал я: я взял и "выкинул" все файлы в 7zip архив рядом с инсталлером, в основной EXE не добавляются никакие файлы, кроме необходимых интерфейсу (оформление, рюшечки всякие и т.д.), в скрипте стоит одна команда на распаковку данных из 20 гигового (заранее подготовленного) 7zip архива. У меня ошибка в коде - правка и через 5 секунд EXE собран, вы же тратите на сжатие 20 гигов прилично времени за место моих 5 секунд. В любом случае, я не собираюсь никого ни в чем переубеждать, каждый останется при своём мнении, если вы видите преимущество Inno перед NSIS, так в чем проблема, собственно говоря? Тема обсуждения Inno на нашем форуме тоже имеется, изучайте и делайте более гибкие инсталляторы с помощью Inno, а не в NSIS :) |
Цитата:
Цитата:
Что до сжатий, то это уже давно не его фишка существует и много других архиваторов которые жмут, уже в разы лучше Нсис, что ему и не снилось.. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Что до проблемы, то она в том что мне совсем не хочется соваться в Паскаль. Ну, противен он мне по определению.. + и я хз, как и что там надо будет изменять и сделать, если переносить туда все мое хозяйство и прочие мои хотелки, свистелки и перделки.. :clever-ma |
Цитата:
Добавить второй прогресс-бар на страничке установки - вроде бы не проблема, управлять его шкалой - вроде бы тоже не проблема. Есть WinAPI функции (не знаю, как в других системах инсталляторов), но с помощью WinAPI сделать можно много чего. Цитата:
|
Цитата:
Что до прогресса и либы, то да, перебор функций апи и гора этого кода в скрипте, при том чтобы все корректно работала доставляют море удовольствия. Не говоря о конкретных зависонах самого инсталла, по окончанию установки и перехода на финальную страничку.. Этот баг так и не смог поймать и искоренить. Возможно специфика Юникода хз.. + я помнится так где-то месяца три, прикручивал либу конвертера/пакера и андпакера звука, так до конца все и не сделал. Плюнул на это дело, из-за больших возможностей Нсис, а самому писать что-то, ну если бы мог по этой части что толковое то тут бы точно не куковал, временами.. Цитата:
|
Подскажите как с помощью rename переместить папку(не пустую) с заменой файлов, папок при необходимости? Так не работает:
Код:
Rename $EXEDIR\App\IFX $LOCALAPPDATA |
Цитата:
Цитата:
Гора кода? Зависоны? Ну,в моём примере ничего из вами перечисленного я не заметил :tongue: Дополнительный прогресс бар
Код:
; K.A.V. Progress test Цитата:
Но скажу так, тот пример был сделан конкретно под человека, т.е. там я писал функцию с фиксированным количеством секций для взаимодействия, так что тот пример не универсальное средство для борьбы с глюками взаимоисключающих секций. Цитата:
Вообще, лучше бы выполнили копирование файлов и затем удаление первой директории... А вообще, в команде в качестве конечного пути необходимо указывать новое имя папки помимо путя, куда вы собираетесь перемещать папку, например: Код:
Rename "C:\Перемещаемая папка" "C:\Путь 1\Ещё путь\Новое имя перемещаемой папки" |
Кто-то знаком с плагином ExecDos? Как с помощью него перемещать папки с разных дисков?
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
K.A.V., Как указать папку ProgramData?
Код:
CopyFiles "$EXEDIR\Data\IFX\*.*" "здесь путь к programdata\IFX" |
Цитата:
C:\Users\All Users = C:\ProgramData Теперь мы знаем, что это за папка и какая переменная нам нужна (знают сразу те, кто прочел справочник в отличии от вас, видимо) Затем мы берём и открываем наше чудо под названием Справочник по NSIS, читаем страничку Переменные NSIS (Variables), прочтя, находим такую строку на страничке: Цитата:
Код:
SetShellVarContext all |
Задача: перевести строку с данными в бинарный вид:
Исходная строка: Код:
74DB-AB80-4706 Код:
373444422d414238302d34373036 Код:
37003400440042002D0041004200380030002D003400370030003600 |
Цитата:
Код:
OutFile "test.exe" |
Прив,
Хм.. при компиляции словил такую ошибку: Цитата:
|
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х будет и жмется нормально, а тут даже толковый инсталлятор хрен соберешь.. Мда, придется перебираться на Инно.. :( |
Цитата:
Цитата:
|
Цитата:
(тут вроде как было беспокойство, что будет мелькать окно консоли при распаковке - так нужно сделать это окно скрытым) |
Цитата:
|
Вложений: 2
Цитата:
Но, конечно же, проще попросить уже готовый пример, Распаковка файлов будет производиться на рабочий стол пользователя, после распаковки будет открыта папка В данном примере я показываю, как можно распаковать не просто полностью весь архив в папку, а как можно распаковать разные папки из архива в разные директории Такой метод я использую в своём SFX Creator, только там код навороченнее :blush2: |
Чем отличается ярлык на рабочем столе, создаваемый NSIS
Код:
SetShellVarContext current # (или all) Скрытый текст
Спрашиваю потому, что эти ярлыки по разному открывают программу. Обратите внимание, что в первом случае в окне Введения не отображаются картинки, во втором - отображаются. Мне нужно, чтобы отображались.
![]() ![]() Можно ли в NSIS создавать ярлыки, которые будут запускать программы с правами администратора? Чтобы при открытии свойств ярлыка, в окне дополнительных свойств было так: ![]() |
Цитата:
Цитата:
У "правильного" ярлыка прописана рабочая директория, а у вас при создании ярлыка там пустое значение, из-за этого в программе получается указанный вами глюк. Решение. Прописать SetOutPath перед командой создания ярлыка: Код:
SetOutPath $INSTDIR |
Цитата:
Скрытый текст
![]() ![]() "Увидел" разницу только после того, как сделал скриншоты окон свойств. А вот за решение спасибо. Я когда распихивал ярлыки по отдельным секциям, совершенно упустил этот момент :lamer: Может есть решение и второй части вопроса (про ярлык с админскими привилегиями) ? |
Цитата:
Просто на моём голом скрипте она оказалась пустой :) Цитата:
Даже не смотрел на текст, что между картинками :biggrin: Решение есть и завтра я его предоставлю в виде готового макроса (чтобы всем вам было удобно, вставив всего одну команду кода), сегодня уже поздно и мне пора спать) |
Вложений: 1
Возвращаясь к вопросу о галочке "Запуск от имени администратора" в свойствах ярлыка.
Решил сразу написать небольшой include, может, кому пригодится... Как подключать include файл, я думаю, все уже знают и умеют это делать? а если нет, то...
1. Распаковываем файл из архива в папку, где лежит ваш NSIS-скрипт 2. В начале вашего NSIS-скрипта прописываем: Код:
!include "adminShortCut.nsh" После подключения include-файла вы можете использовать 2 команды: Ставим отметку на чекбокс "Запуск от имени администратора" Код:
${aSC::SetON} "полный путь к ярлыку.lnk" Снимаем отметку с чекбокса "Запуск от имени администратора" Код:
${aSC::SetOFF} "полный путь к ярлыку.lnk" Код:
${aSC::SetON} "$DESKTOP\Мой ярлык.lnk" |
Цитата:
Пока ковырял эту тему, перетестил разные плагины и прочее по архивам., и нашел для себя нужное решение. Хоть и не идеальное, но зато теперь свой образ ISO с любым количеством файлов можно сделать и инсталлер с ними со всеми работает.. Вообщем, все зер гут, продолжаю сидеть на NSIS-ке.. :ok: |
Цитата:
Я же вам не зря писал, например, про Цитата:
Если бы вы открыли справку 7-ZIP и посмотрели бы команды+ключи, то увидили бы такой полезный ключ как -scc и после подстановки его в мой пример, то... Код:
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED '$PLUGINSDIR\7za.exe x "$EXEDIR\data.7z" -o"$2" "$1" -aoa -y -sccWIN' "" $0 Цитата:
Ну, раз у вас получилось реализовать другим методом, то могли бы поделиться, может, кто-нибудь и воспользуется вашим методом... |
K.A.V.
Цитата:
Цитата:
Цитата:
ЗЫ, Еще один момент, можете подсказать справку или что нибудь подобное применительно работы с архивами в Нсис, из вашего примера не совсем понял, как например распаковывать содержимое отдельно взятого вложенного каталога, из кучи каталогов в архиве, ибо комментов нема.. :clever-ma |
Цитата:
Всё, что я видел по NSIS - оригинальная справка, с которой началось моё изучение NSIS, мне хватает того, что у меня в голове, так что по NSIS информацию не искал и не знаю, что есть помимо плагинов, примеров на оф. сайте и того, что в шапке этой темы. Если есть конкретные вопросы - задавайте, постараемся помочь по мере текущих наших знаний в NSIS Если брать работу с архивами, ну, что здесь можно сказать? Всё идёт к одному - к работе с консольной версией конкретного архиватора (параметры/ключи, но это можно и самому посмотреть в справке ахиватора), либо к работе с его dll, с помощью которых можно производить распаковку архива, но копаться в этом лично у меня нет желания. Есть, опять же, плагины для NSIS, для распаковки архивов Скрытый текст
был тут ещё разговор про RAR dll для NSIS, не знаю, работает ли эта dll для новых архивов, лень проверять Цитата:
Код:
Section "1" Push "$INSTDIR" - указывает, в какую директорию распаковать Эти команды передают функции _7ZipExtractFileFunc наши папки Код:
Function _7ZipExtractFileFunc $1 - директория, которая распаковывается $2 - директория, куда распаковываются файлы Распаковать можно с полными путями только папку, которая лежит в корне архива, нельзя распаковать (вроде бы :)) вложенную подпапку в какой-либо папке с сохранением всей структуры каталогов |
K.A.V.
Цитата:
Будем копать дальше.. Зы, кстати, а где можно стянуть RAR dll для NSIS, что-то ссылок не нашел, а та что есть не робит.. ?! :dont-know |
Вложений: 1
Цитата:
Цитата:
Не забудьте, что nsisUnRar2 будет работать только при использовании граф. интерфейса (при исполнении из секции), может, запустите и из под .onInit, копайтесь, если хотите, мне разбираться не особо интересно в этой теме :) |
Цитата:
|
Давеча понадобилось вывести содержимое операций из консоли - в окошко NSIS...
ExecDos, как говорится, мне в помощь, вроде как всё хорошо, но оказалось всё же совсем не хорошо... А именно : Каким образом из окна ListBox_а можно скопировать выведенные текст-данные ? Посылал ListBox на разные стили - всё бестолку... Наивный вопрос, но без ответа - почему русские буковки в ListBox_е, у меня в виде кракозябров ? ( В ОС (W7x32) все кодовые страницы , файлы и записи реестра приведены к 1251... Толку - ноль... ) И каким образом отображать в окне ListBox_а только первые, к примеру, нужные мне 10 строк ? Код:
!include MUI2.nsh Цитата:
|
Цитата:
Я нашел выход только в создании ListView элемента, после изучения которого переписал практически все диалоги в SFX Creator :biggrin: Поэтому, могу тебе посоветовать плюнуть на ListBox и создать ListView элемент. Цитата:
В разделе Обучение IO: собственные странички, есть раздел Примеры диалогов, в котором есть один пример Считываем данные из консольного приложения в ListView Посмотришь ради собственного развития) А конкретно тебе нужна WinAPI команда OemToChar, пример использования тоже есть в справке в разделе Примеры кодов на страничке Русские символы в DOS кодировке По поводу работы с элементом ListView - читай следующее: 1. Обучение IO: собственные странички => Элементы в диалоге => ListView: список => ListView: обычный список 2. "CommCtrl.nsh" файл найдёшь на страничке Обучение IO: собственные странички => Введение Использовать команды взаимодействия с элементами, которые описаны в этом разделе можно не только с InstallOptions - различие лишь в том, что там в команды нужно подставить правильный HWND элемента Цитата:
Если что-то не поймёшь или будут вопросы - пиши, мне просто лень код накидывать, в последнее время вообще всё лень... Цитата:
|
Цитата:
Цитата:
ExecDos::exec /NOUNLOAD /ASYNC /TOWINDOW Но оказалось есть интересный способ получить данные из ListBox_а (конечно не в полной мере, какой хотелось бы...), но всё же выход : Код:
OutFile ExecDos_TOWINDOW.exe Цитата:
Цитата:
Но с LB_GETCURSEL наверное может удастся это реализовать... Как - пока не придумал... ps В доке сказано, что можно посылать данные с помощью /TOWINDOW не только в чёртов ListView : Цитата:
|
Цитата:
Цитата:
Цитата:
В том примере показано, как нужно использовать ExecDos, когда тебе нужно сделать что-то с данными из консольного приложения, а не просто запихнуть весь текст в какой-то элемент И там показано, что команду OemToChar использовать можно только для преобразования строки, но никак не для смены кодировки элемента управления, как ты пытался сделать... ЗАМЕЧАНИЕ ДЛЯ ВСЕХ Возьмите на заметку, если вы пользуетесь плагином ExecDos просто для вывода данных консольного приложения в элемент управления - используйте ключ /TOWINDOW или /DETAILED в зависимости от сиуации, НО, если же вам необходимо произвести какую-то манипуляция с теми данными, которые консольное приложение вам выдаёт - используйте ключ /TOSTACK или /TOFUNC, опять же, в зависимости от ситуации Цитата:
Цитата:
Ладно, дам тебе задание: после того, как ты свой код напишешь, всё сделаешь так, как нужно, попробуй добавить в свой любимый ListBox горизонтальную прокрутку Хочу потом написать здесь "я же говорил" после того, как ты возьмёшься переписывать код под элемент ListView :biggrin: всё готовенькое, как вы любите
Код:
OutFile ExecDos_TOWINDOW.exe Цитата:
Цитата:
Я могу понять некоторых личностей, но чтобы ты ленился, MKN, стыдно должно быть :( Там же в примерах всё есть, ну не сложно же открыть этот чертов ToWindow.nsi, который лежит в архиве с плагином и посмотреть, как там всё устроено, ты же не первый день с NSIS работаешь... В этих примерах я взял стандартный блокнот (закройте копии блокнота перед запуском скомпилированного скрипта, чтобы не записало куда попало), после его запуска скрипт закидывает данные прямо в область редактирования текста (элемент Edit) всё готовенькое (2): /TOWINDOW с иероглифами
Код:
!addincludedir "." всё готовенькое (3): /TOFUNC с обработкой строк и без иероглифов
Код:
!addincludedir "." |
Цитата:
Цитата:
Понятное дело, что Цитата:
Цитата:
Цитата:
Цитата:
А вот пример с /TOFUNC - интересный. Спасибо. |
Цитата:
Код:
OutFile ListBox_H-Scroll.exe |
Цитата:
Цитата:
Цитата:
Цитата:
Код:
FindWindow $0 "#32770" "" $HWNDPARENT Цитата:
Для тебя будет открытием, если я скажу тебе, что та самая область в блокноте, в которой ты набираешь текст - это элемент Edit? Возьми любой похожий софт типа программки "InqSoft Window Scanner", которая тебе на интерфейсе программы/инсталлятора покажет, какие в интерфейсе типы элементов и каковы их стили А по какому принципу, ты думаешь, работает мой код? Именно по тому, что сначала ищет окно конкретной программы (в моём случае блокнот), а затем уже ищет элемент Edit в этом самом родительском окне...Я же не мог тебе предоставить код, который бы искал не понятно где в системе элемент Edit и запихивал туда данные, ну а писать специально для этого пример на nsDialogs или IO с интерфейсом NSIS мне лень, честно говоря...кода меньше и наглядно всё видно, без лишних строк Код:
stget: Цитата:
Цитата:
|
K.A.V.,
Цитата:
PS После адаптации примера с консолью из справочника под nsDialogs, получаю при компиляции : Цитата:
Такую же ошибку получаю и при компиляции примера из 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 ? Там всего то не большой кусок кода используется. Состряпать макрос из него... |
Цитата:
Цитата:
Вот ты говоришь о терпении учителя, да какой тут, когда ты пишешь, как нужно сделать, а человек делает по-своему... Цитата:
|
CommCtrl.nsh ессно у меня есть и находится где положено : \NSIS\Include\CommCtrl.nsh
ps Да, у меня оказалась другая версия CommCtrl.nsh, которой всегда пользовался и всё всегда работало... Заменил на ту , что в справочнике, ошибка пропала. Откуда интересно этот файл взят ? Если пользователь возьмёт его из архива с http://nsis.sourceforge.net/mediawik...a/ListView.zip как на многих ресурсах и рекомендуется , то с NSIS 3 получит ошибку... Кто бы мог подумать... |
Цитата:
Цитата:
Цитата:
|
Вложений: 1
K.A.V.,
Глянул ваш пример по прогрессу, работает, хотя до конца не все оттестировал еще, но есть один мелкий графический баг, см. ,вложение. Как его побороть без ковыряния в ресурсах Нсис?! ![]() И дополнительно хотелось бы: - уменьшить высоту второго прогресс бара, на одну треть или в половину от текущей(надо поиграться с его настройками), как я понял из System::Call, параметры этого элемента прописаны, только не понятно что есть что в циферках.. - узнать, как правильно передать исполняемые процессы из какой-либо .dll, например, nsisUnRar2.dll, в этот созданный прогресс бар? - при достижении 100% выполнения, удалять этот прогресс из окна оставляя только основной прогресс в окне инсталлера. Спасибо.. |
Цитата:
Цитата:
Цитата:
Для создания элемента мы используем команду 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' Цитата:
120 - позиция по вертикали 520 - ширина 20 - высота Цитата:
Следует учесть тот факт, что у нас нет ни доков к этой dll, ни исходника...Так что в таком случае, можете только сидеть и методом тыка что-то пробовать, может чего и получится :) Вы же видите, что при начале распаковки файла из архива - dll показывает инфу в основном прогрессе + отображает текстовую информацию над прогрессом, эта dll была специально запилена под NSIS, сомневаюсь, что разрабы писали её как универсальное средство, как пишут плагины для NSIS... Цитата:
|
K.A.V.,
Вчера я говорил, что "адаптированный" под nsDialogs пример "Считываем данные из консольного приложения в ListView" из справочника - не работает : получаю чистый ListView. ( чтобы никого не злить - у меня не работает... :) ) Ты наверное будешь смеяться, но оказалось дело в том, что гасит всё, применение стиля ${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}" . Но достаточно добавить ${NSD_LV_InsertColumn} $ListView 0 450 "column 0" - и сразу всё работает. ( Не понятно, почему так получается, что обязательно нужно определить конкретный столбец и почему LVS_NOCOLUMNHEADER у меня игнорируется... ) Вот упрощённый код для этой ситуации : Код:
!include "MUI2.nsh" ps Действительно можно обойтись и без CommCtrl.nsh, закинув из него в скрипт только нужные макросы... ( Но это, наверное, не тот случай, когда нужно экономить... ) |
Цитата:
Здесь проблема в другом, как я выяснил только что, всё дело в том, что в nsDialogs создание ListView происходит не так, как в IO, такое ощущение, что nsDialogs создаёт совсем голый элемент, и для того, чтобы "всё заработало", необходимо вручную дописать команду на вставку колонки, пусть даже и "невидимой" Т.е. после создания элемента тебе нужно дописывать команду на вставку колонки: Код:
${NSD_LV_InsertColumn} $ListView 0 450 "" Скрытый текст
Код:
!include "MUI2.nsh" опять панику разводишь, не работает у него ничего :biggrin: Цитата:
|
Цитата:
И никакой паники - просто информирую пользователей, ( чтобы у них не было паники, когда пример не заработает, т.е. у тех, кто не захочет связываться с допотопным IO :) ) Цитата:
ps И к слову сказать, ты напрасно называешь, якобы вытянутый из тебя, :) код - "всё готовенькое" :) Это самый что ни на есть настоящий и наглядный - пример, логически вытекающий из имеющегося описания в справочнике и вопросов-обсуждений на форуме. Это ведь - общепринятая форма обучения и закрепления любого материала. Именно по конкретному коду легче всего понимать предмет изучения. ( Жаль, что в справочнике таких примеров, мало или они вообще отсутствуют (может тогда и не было бы лишних вопросов))... |
Подскажите, можно ли заменить текст или число в определенной строке? Например, как на снимке: нужно заменить число 1 в строке, следующей за [SearchPOT].
![]() |
Цитата:
|
Цитата:
Так содержимое выглядит в Notepad+, если включить отображение всех символов. ![]() |
Цитата:
[Примеры кодов] → [Работа со строками] » Замена строки в текстовом файле. либо: » Замена фразы в текстовом файле Здесь можно подсмотреть пример по поиску строки по её номеру... |
Цитата:
Если я правильно читаю, то в примере "Замена фразы в текстовом файле" можно заменить все вхождения или только первое. А мне нужно заменить, например, только 5-е вхождение (текст, число), находящееся в 28-й строке. А может я ничего и не понял... |
Цитата:
Скрытый текст
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 |
Вложений: 1
Цитата:
${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 Зы, Путь к файлу названия и прочее поменяешь сам на требуемое.. |
Цитата:
Как заменить уникальный (встречающийся 1 раз) текст я знаю - из примера в справочнике. В моем же примере текст повторяется, т.е. уникален не текст, а номер строки. Буду разбираться с примерами из ориг. справки |
Цитата:
В своем вопросе ты писал: Цитата:
Ну и вопросы до кучи, номер требуемой строки динамический что-ли? Если да, то тут я хз, надо думать.. Или их несколько и везде надо менять? Если строки(а) статичны и неизменны в позициях, то смотри пример выше.. Зы, и скинь свой изменяемый текстовый файл, гляну что это такое... |
Цитата:
|
Привет народ, :)
Пара вопросов специфичных имеется. У кого нибудь получилось скомпилить плагин Nsis7z_921 из представленных исходников? И есть у кого желание поковыряться в нем и подлатать чуток, до нужной кондиции? |
Цитата:
MaGoth, желающих разбираться в чужих исходниках вы вряд ли найдете. Если вам интересно, а тем более назрела такая необходимость, попробуйте сделать это сами, а потом результат своей плодотворной работы предложить нам. Поверьте, вам скажут спасибо. :up |
Цитата:
Никого не хочу обидеть, но ещё я сомневаюсь, что хотя бы половина кодеров на NSIS из этой темы писали плагины для NSIS Цитата:
Цитата:
Цитата:
|
Цитата:
Может вы прокомментируете эту защиту от дурака ?! Скрытый текст
Код:
1>------ Построение начато: проект: Nsis7z, Конфигурация: Debug Win32 ------ Мы на-пару с одним человечком перелопатили все исходники плагинов для этой версии 7з, до которых смогли дотянуться, и везде болт. Эти идиоты, выложили сырцы, а на пол проекта компиляции файлов не положили... :angry2: Вообще не понимаю, какой дебил так делает ?! Или выкладывай полностью, или не выкладывай вообще. И всё всем понятно будет.. Цитата:
K.A.V. Пост ради поста ?! Ибо ни грамму не понял из того что ты написал.. |
Цитата:
Цитата:
Вот вы взяли тут и оскорбили людей (я, конечно, понимаю, что этого они не узнают, но смотрится то со стороны как минимум не красиво и низко с вашей стороны), которые сделали плагин и выложили его для вас и, оскорбили вы их просто потому, что не умеете читать. Мягко говоря странно вы себя ведёте, вам не кажется? Цитата:
И смотрите, это моё очередное сообщение, которое вроде бы и с одной стороны указывает на причину вашей проблемы, но и с другой... Цитата:
|
Цитата:
Цитата:
Если вы выполните все рекомендации автора плагина, которые он старательно изложил в сопровождающем документе (nsis7z.txt), то файл компилируется без проблем. |
K.A.V.,
Подскажи пожалуйста, как в твоём примере, вывести строки в ListBox - с 1ой по 4ую включительно ? (как вывести только 4ую- понятно, как вывести с 4 ой и далее- понятно. с выводом с 1ой по 4 ую - что то не заладилось...) Код:
OutFile ListBoxHSCROLL_ExecDosTOWINDOW.exe |
Цитата:
Код:
OutFile ListBoxHSCROLL_ExecDosTOWINDOW.exe |
Цитата:
|
Когда то kotkovets, предлагал код, как убрать заголовок окна :
А каким образом добавить к получившемуся "лысому" окну - рамку ? (пробовал добавлять "рамочные" стили WS_BORDER , WS_THICKFRAME , посылал окну сообщение ${CM_BORDERCHANGED} - без эффекта ) |
Цитата:
Цитата:
Если делать так, то всё прекрасно работает: Стиль WS_DLGFRAME
Код:
Function GUIInit Стиль WS_BORDER
Код:
Function GUIInit Цитата:
Цитата:
|
Цитата:
Да и исходный код странно работает... Компилишь-запускаешь - нет заголовка. Вроде то , что надо... Пооткрывал окна других приложений (я открываю-сворачиваю окно тотала) - вдруг у обезглавленного окна, появляется заголовок (хотя таскать за себя не позволяет)... Ерунда какая то... Проверяю на W7x32 |
Так тоже не работает?
WS_DLGFRAME
Код:
Function GUIInit WS_BORDER
Код:
Function GUIInit На W7x64 и W8x32 работает, а вот на WinXP нет |
Цитата:
ps Выяснил, почему не работает. В "визуальных эффектах" обязательно должна быть включена опция "включение композиции рабочего стола". У меня была отключена, т.к. почти все визуальные эффекты я всегда отключаю за ненадобностью. И не только я один... Т.е. в скрипте с манипуляциями стилями, придётся принудительно включать композицию на время установки... А вообще , это лажа со строны MS. Пользовательские настройки не должны принципиально влиять на работу программ... Есть вроде как спец функция для манипуляций с композицией... Обсуждалось, к примеру, здесь http://www.gamedev.ru/code/forum/?id=168231 |
Цитата:
Цитата:
1. Берёшь файл интерфейса modern.exe из папки Contrib\UIs 2. Копируешь в папку со скриптом 3. Открываешь его в ResHacker 4. Переходишь в диалог 105 5. Ставишь свой стиль окна, убирая WS_CAPTION и добавляя, например, WS_BORDER Код:
105 DIALOGEX 0, 0, 331, 222 7. В NSIS скрипте прописываешь в самом начале Код:
!define MUI_UI "modern.exe" Просто баг появляется не из-за того, что в MS косячники (ну, в меньшей степени, я думаю), а из-за того, что мы модифицируем созданное окно, создай его изначально без заголовка - и такой проблемы не будет ps не знаю насчет пункта 4, достаточно ли будет изменений только в диалоге 105, лень тестить, оставлю это дело тебе :wink: psps А если кому нужна твоя функция для включения/отключения композиции, то...
Включить Код:
System::Call "Dwmapi::DwmEnableComposition(i1)i.r0" Код:
System::Call "Dwmapi::DwmEnableComposition(i0)i.r0" |
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 : В итоге : ![]() Но как заменить в modern.exe Dialog 105 - на откорректированный... Вроде сначала, сохранённый-откорректированный .rc файл надо конвертировать в бинарный вид, а потом уже заменять ресурс... (Если напрямую заменять .rc ,то заменяться то он вроде как заменяется (точнее изменяется, но без внесённых изменений и при этом получается черт те что) )... И скорее всего, не так это делается... Тогда как ? ps Во вложении черно-белая картинка - файл 104.bmp : |
Цитата:
А если нужно заменить ресурсы - юзай командную строку приложений, которые умеют заменить ресурсы (тот же ResHacker, справка в помощь) Цитата:
И я не совсем понимаю, зачем менять ресурс непосредственно через NSIS код, если можно произвести все изменения в файле и запихнуть в инсталлер уже готовый файл с изменёнными ресурсами...Или ты делаешь своего рода патчер по замене ресурсов в файлах?? |
Цитата:
Задачи с заменой ресурсов могут быть разные, к примеру : интереующая меня (и полезная для многих) программа для удобного и быстрого изменения размеров и пр. у окон конструированного инсталлятора NSIS , в ресурсах modern.exe . Как я уже говорил выше. Конечно всё это можно делать редактором ресурсов - но оч долго и оч не удобно, особенно , если регулярно. :) И, как ты правильно заметил - разнообразные патчеры ресурсов, как для простой замены какого либо ресурса, так и для корректировки, локализации и т.д. Оч. полезно в применении для программ с часто меняющимися версиями, где постоянно приходится обновлять ресурсы... Не нужно каждый раз возиться с ResHacker_ом, особенно если надо заменять десятки параметров в ресурсах... А тут один раз повозился, а далее просто вводи данные (если надо) и жми кнопку :) Цитата:
|
Цитата:
и применить, все действия в GUIInit. |
Цитата:
Подскажи пожалуйста - как изменить-заменить сохранённый и откорректированный .rc ресурс в modern.exe , с помощью кода NSIS ? |
Цитата:
все это сводит на нет штатными инструментами редактирование ресурсов... Этот "косяк" сильно ограничивает функциональность расширенных кодов для продвинутого в этом плане NSIS |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Товарищи подскажите пожалуйста, есть программа "Фабрика Форматов", инсталлятор на NSIS, устанавливаю с параметров /S для тихой установки, незаметно от пользователей, но инсталлятор по дефолту ставит программу и ярлыки к ней для одного пользователя, а не для всех, есть ли какая то команда для установки "для всех"
|
Цитата:
Что касается конкретно Format Factory - в исходном коде NSIS-скрипта этого продукта такой возможности не заложено, нет упоминания о команде SetShellVarContext, которая бы создавала ярлыки для всех/только для текущего Код:
SetOutPath $_OUTDIR |
Цитата:
Ведь надо (точнее - возможно) редактировать данные именно в скриптах .rc Если бы .rc можно было бы преобразовать в файлы .res - тогда другое дело. И вроде как для того существует консольная утилитка brcc32.exe ( из пакета Delphi). Но ни черта она у меня не работает (может требуются какие то доп DLL или ещё что. Про то, не известно...) |
Вложений: 1
Цитата:
Я так всегда делаю, создаю cmd файл и запускаю консольное приложение без параметров, в основном они ругаются, если им что-то нужно Код:
brcc32 Цитата:
Код:
brcc32 "My file.rc" |
Интересно, возможно ли в NSIS скрипте, записывать несколько переменных - в одну строку ? Просто для компактности скрипта... А то, когда назначаешь под сотню собственных переменных получается ну очень огромный столб из переменных... Вроде как, некоторые языки программирования позволяют так делать...
|
Цитата:
Если бы я в своём SFX Creator всё пихал в один nsi файл - я бы с ума уже сошел, только главный файл насчитывает 6200 строк кода и это без дополнительных nsh файлов, которые к нему относятся, в котором валяются функции, которые не изменяются... |
Подскажите пожалуйста, каким образом в EXE файле определить - есть ли в нём конкретная HEX строка ?
Например, для этого файла надо определить есть ли в нём такая строка : A3484BBE986C4AA9994C530A86D6487D (это признак для определения файлов AutoIt3 compiled script executable, для которых классический метод определения по сигнатуре - не подходит...) этот файл : http://rghost.ru/private/6zgqqPykN/e...fe25f76010300c ![]() Причём у разных файлов, offset разный, но строка A3484BBE986C4AA9994C530A86D6487D - неизменна ![]() |
Чтение побайтово очень долго проходит, если искомая строка не в начале файла и если сам файл больше 5-10 Мб...
Готовый код: Код:
Function test Код универсальный и не привязан конкретно к твоей строке, можешь вбивать для поиска другие значения любой длины (от 4 символов), вроде работает :) сори за бардак в переменных, некогда прихорашивать, если нужно, думаю сам в макрос загонишь...? |
Цитата:
Может подойдёт плагин http://wiz0u.free.fr/prog/nsisFile/ ? |
Цитата:
Цитата:
Код:
Function test Если найдено $1 = смещение по DEC |
Цитата:
|
Вложений: 4
Привет народ,
Имеется вопрос.. Ковыряю один инсталлер, формально всё по тех. части оригинального уже воссоздал и прописал что нужно.. Но, не работает как надо только кусок мелкого оформления. Не отображаются тексты на странице Велком и её заголовка.. Пример в картинках: Скрытый текст
Пример кода..
Код:
;=============================================================================== Код восстанавливал изучая оригинал(написан на базе Нсиськи 2.0), сам использую Нсис юникод 2.46.5. Компилил как в Анси, так и в Юнике, и взде одинаково, - текст не отображается.. В чем грабля может быть ?! :clever-ma |
Цитата:
Цитата:
Цитата:
MUI_BGCOLOR есть, а вот MUI_TEXTCOLOR нет, соответственно, цвет на фон то применяется, а на текст - нет Пишите свою функцию с установкой цветов на тексты командой SetCtlColors, либо ковыряйте include файл интерфейса и добавляйте такую дефиньку, чтобы применяла цвета на текст |
K.A.V.,
Не напомнишь случаем хенделы этих текстовых полей и окна..? Ковырял ковырял интерфес, но что-то кроме как изменения цвета фона в них, ничего более не наковырял. Может ковырялка не того калибра ?! Да и залезть в ресурсы интерфейса пока нет возможности... |
Цитата:
Цитата:
Код:
!include "MUI.nsh" Код:
C:\Program Files (x86)\NSIS\Contrib\Modern UI\System.nsh Цитата:
Код:
MUI_PAGE_CUSTOMFUNCTION_SHOW Код:
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "WelcomeFinishColors_K.A.V._Example" Код:
; Setup Pages (Uninstaller) И ещё обратите внимание на то, что необходимо использовать 2 разные функции для установщика и деинсталлятора сами функции Код:
Function WelcomeFinishColors_K.A.V._Example |
Как определить за NAT находится пк или нет с помощью NSIS?
|
Цитата:
Я, например, не шарю в сетевых технологиях и чтобы понять, чего вы действительно хотите от кода - я перед написанием кода должен проштудировать документацию относительно вашего вопроса и только после этого понять, какой функционал необходим в коде Если готового плагина/решения нет на сайте NSIS - то я должен буду сначала понять, что такое NAT и понять, что нужно для того, чтобы приступить к написанию кода к определению за NAT/не за NAT, а это дополнительное потраченное время, лично для меня это время будет потрачено зря, т.к. мне эта тема не интересна Так вот что хотелось бы сказать в итоге (и, думаю, нужно внести эти "пожелания-инструкции" в шапку в каком-нибудь более понятном формате, если я не очень грамотно выражусь сейчас): Если вы просите помощи в написании кода, описывайте подробно, какие команды необходимо видеть в коде, т.к. не все мы тут супер-мега-опытные-знающие всё обо всём в мире IT, сократите время ожидания кода себе и уважайте время тех, кто вам помогает. Например, по вашему вопросу можно было бы составить сообщение типа такого (опять же, если я всё правильно понял про NAT, прочитав инфу в инете): Скрытый текст
Как определить за NAT находится пк или нет с помощью NSIS? Если готового решения нет, то необходим следующий функционал: 1. Определить IP адрес локальной машины 2. Определить, входит ли этот адрес в диапазоны локальных зарезервированных сетей типа 192.168.255.255, 10.255.255.255 и бла бла бла перечисляем дальше Т.е. по сути, нам что нужно, определить это? Если IP адрес компьютера входит в диапазон локальных сетей, то мы за NAT? Если я всё правильно понял, то можно реализовать так (или не так, если я всё-таки нифига не понял :)): В любом случае, может быть, код кому-нибудь пригодится, если это не решение вашего вопроса) Код:
Name "GetIP Test" |
Необходимо переименовать все файлы в папке, чтобы вместо имён была нумерация ( варианты 0,1,2 и т.д. или 01, 02 и т.д. или 001 002 и т.д. ) без расширений
Также интересует выборочное переименование , типа, переимен. начиная с такого то по такой то файл и др сочетания... Использовал такой код : Код:
outfile rename_enumerate-test.exe |
Код:
Function RenameFiles Цитата:
Соответственно, чтобы сделать этот процесс правильным - нам нужно запоминать, какой файл уже был переименован (чтобы повторно его не обрабатывать), для этого сбрасываем имена переименованных файлов во временный файл и перед каждой командой переименования проверяем наличие записи о текущем файле Ещё один момент, когда перечисляешь все файлы в папке командой Find*, в переменную имени файла сбрасывается значение "." и "..", из-за чего счетчик так же может быть не правильным, проверку на эти значения я так же прописал Ну и ещё один момент - счетчик нужно менять только после операции переименования, а не после/перед командой FindNext, т.к. опять же, счетчик будет не правильным Цитата:
p.s. я бы вообще, сделал всё это дело через функцию Locate (красивее/удобнее), но т.к. она багованная с самого 2.46 и при указании некоторых команд (например ReadINIStr) в callback функцию, она просто завершается - из-за этого этот вариант отпадает :( |
Цитата:
Наверное такое переименование проще сделать батником. Там это в три строки делается... |
Вариант с перемещением вроде как работает, но отсчёт начинается почему то с 2. Как исправить ?
Код:
outfile rename_enumerate-test.exe |
Цитата:
Цитата:
Код:
outfile rename_enumerate-test.exe а зачем, вообще, ты 2 раза команду прописываешь? одной разве не достаточно? Код:
Rename "$EXEDIR\D\$1" "$EXEDIR\D1\0$n" |
Цитата:
Цитата:
ps Возвращаясь к поиску HEX значений в файлах, для которых "класический" код работает , как черепаха, т.е. не годен для практики. Оказывается есть иной приём поиска. HEX-последовательность ищется сначала в первых 300 кб, потом в следующих и т.д. Поэтому поиск выполняется очень быстро. Есть и готовая реализация, но на AutoIt3. Было бы интересно переконвертировтаь этот код в NSIS... |
Цитата:
Цитата:
|
Что-то не могу собрать скрипт с конструкцией типа:
Section StrCpy $0 "7" ${If} $0 => 5 MessageBox MB_OK "$0=>5" ${EndIf} SectionEnd Показывает, что нет такого "=>" !insertmacro: macro named "_=>" not found! Пример секции из справки, библиотека LogicLib.nsh есть, но у меня старый NSIS 2.46 |
wolkow70,
Цитата:
есть (во всяком случае в С# ) : >= Больше или равно |
Цитата:
Вам нужно указать >= 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" |
|
Столкнулся с не возможностью совместного использования "FileVerInfo.nsh" и "FileFunc.nsh". При компиляции - ругань (отдельно, FileVerInfo.nsh работает нормально) .
Как их подружить ? |
Цитата:
|
FileVersionInfo Header v1.2.2
На базе этого кода, похоже сделан 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 |
MKN, закомментируй в хидере строку
Код:
!insertmacro __DefineVersionInfoName FileVersion Цитата:
Код:
${GetProductName} "$WINDIR\explorer.exe" $0 |
Кстати и штатный ${GetFileVersion} - показывает только первый символ... Как определять версию файла vcredist_x86.exe... ? Ещё мне надо определять версии шрифтов... Существующие плагины тоже не помощники. Кое что, да кое когда определяют, а что надо - нет... :)
NSIS ни черта не умеет, за что не возьмись... Начинаю в нём разочаровываться... :) Разрабы этот продукт сделали для неискушенных в программировании пользователей, вроде как старались , а поддержать и расширять не хотят... Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
ps Интересно, а нет ли где конвертера из VBScript в NSIS ? :) |
Цитата:
|
K.A.V.,
у меня такие ошибки : Цитата:
|
Цитата:
Например, если будет такой код макроса с "левым" текстом в первой строке: Код:
!macro __DefineVersionInfoName _VERINFO_STR_NAME |
Цитата:
выложи пожалуйста твой рабочий комплект, а то я уже не знаю на что и думать. Может у меня в самом NSIS "комплекте" чего то не так... |
Вложений: 1
Цитата:
У меня на NSIS 3.0b1 всё нормально компилится и работает |
K.A.V.,
И с твоим комплектом те же ошибки... Писец какой то... PS нашёл причину... если FileVerInfo.nsh лежит в одном каталоге со скриптом - ошибка. стОит его убрать - всё ОК... |
Прошу помощи.
В скрипте для конструктора AkelPad я использую для запуска утилит команду вида: Код:
ExecWait 'hidcon.exe takeown.exe /F "$R8"' Код:
loop: В чем может быть проблема |
Цитата:
Цитата:
Код:
System::Call "advapi32::GetUserName(t .R4, *i ${NSIS_MAX_STRLEN} r1) i.r2" |
Цитата:
С FileVerInfo.nsh с определением версии файла всё нормально (но только с номером версии, всё остальное черт те что ! ) ![]() А MoreInfo plugin, с тем же файлом, по прежнему показывает только первый символ версии... |
K.A.V.,
Большое спасибо. По поводу грязного кода - полностью согласен, недоглядел. Буду оптимизировать. С nsis сталкиваюсь очень мало. Не могли бы Вы пояснить поподробнее следующее: Цитата:
|
Цитата:
Цитата:
Вы читали описание плагина, который используете? Если на примере, то представьте, что вы вышли в сад собирать яблоки с другом, ваш товарищ кидает вам сорванные яблоки, надеясь, что вы поймаете, а вы думаете "не хочу ловить, пусть на земле полежат" и все яблоки, которые кидает вам друг - падают на землю. Вот и тут так же, плагин вам данные передаёт - вы их не принимаете. Вообще, это спорный момент в NSIS (в NSIS вообще много разных "фишек" и багов), не всегда вы будете получать краш, если не будете принимать значения от плагинов, от чего это зависит - не могу сказать, т.к. прямо с программированием я не связан, возможно, получается какая-то каша со стеком из-за этого или ещё чего...Нужно всегда тестировать то, что пишите, особенно при использовании плагинов. Что касается "фишек" NSIS, то об одной я тут писал недавно, когда при использовании команды ReadINIStr (чтение значения параметра из INI файла) в callback функции Locate - функция просто завершается, не продолжая поиск файлов. |
Цитата:
Правильно ли я понял, что результат своей работы плагин помещает в стек и надо его оттуда "вынуть", чтобы не вызывать переполнения? Значит ли это, что после каждого вызова плагина требуется команда типа "pop $R1"? |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Конкретно насчет плагина nsExec вы уже сами увидели, если не принимать значения после исполнения команды - получите краш |
Уважаемые. Как через NSIS определить включен ли Тестовый режим ОС (testsigning) любой разрядности. Я делал через cmd\bcdedit - очень громоздко...
|
Цитата:
Код:
; enable test signing |
Это включение Тестового режима. Какое значение я получу в $R0, если Тестовый режим уже был включен до этой команды? Отличается ли это значение от ситуации, когда просто "Не удалось включить Тестовый режим"? Мне нужно просто установить факт наличия Тестового режима или его отсутствие без попытки включения.
|
Цитата:
http://www.sql.ru/forum/671956/rezhi...verka-drayvera |
MKN, Спасибо, посмотрю...Сейчас некогда, убегаю...
Посмотрел, да достаточно считать значение параметра... |
Друзья как битмап картинку делать размером на всю ширину инсталлера?
это надо в welcome.nsh что-то поменять? ;Image control ${NSD_CreateBitmap} 0u 0u 109u 193u "" Я так понял вот здесь что-то. Подскажите, буду крайне признателен! |
Как провести проверку запущена ли программа и если она запущена то вывести сообщение с последующим окончанием работы скрипта?
|
Цитата:
Для кастомных страниц, тоже уже рассматривали в теме. Используй поиск... Цитата:
|
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 В Справке в этом коде ошибки |
Salmo, Как исправить этот конфликт при компиляции?
Код:
Section: "Main" |
Цитата:
Если читать тему постоянно, то можно было бы давно себе сохранить нужный файлик или попросить kotkovets вносить изменения в шапку, когда мы правим файлы, выкладывая изменённые библиотеки Хотя в справке есть немного грешка на этой страничке, например, возвращаемое значение в первом примере 1 - если процесс найден Код:
${FindProcessName} "explorer.exe" $0 Цитата:
|
Цитата:
|
Dodakaedr, скачайте с шапки темы правленный хедер
|
Цитата:
|
|
Цитата:
|
Цитата:
А во-вторых, не SFX Creator же обрабатывает команды, а сам компилятор NSIS, SFX Creator только создаёт исходный код на NSIS, не более |
Цитата:
|
Подскажите есть ли плагин или пример как сделать бэкап папки при её существовании?
И как это исправить Код:
IfFileExists expects 2-3 parameters, got 1. Код:
SetShellVarContext all |
Dodakaedr, конечно не можете. Внимательнее надо читать справку. У вас не заданы метки перехода.
Код:
IfFileExists [путь к файлу] [метка перехода, если существует файл] [метка перехода, если не существует файла] |
Цитата:
Код:
SetShellVarContext all |
Цитата:
Если не понимаете принцип указания меток, читайте опять же справочник, конкретно страничку Статьи => Relative Jumps, +можете зацепить попутно Перевод справки NSIS => Goto И зачем 2 раза указывается команда SetShellVarContext all? :o Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
А протестировать скрипт из 5 строк - занятие для неудачников, ага? :) При указании команды SetShellVarContext all, переменные с путями будут ссылаться на общие папки до тех пор, пока вы не пропишите в коде SetShellVarContext current |
Цитата:
Если правильно понял то RMDir $APPDATA\MyFolder без ключа /r? |
Цитата:
Могу ещё такой код подкинуть, может, пригодится в работе (взят с офф. справки), по проверке содержимого директории, есть в ней файлы или нет: Код:
!include "FileFunc.nsh" |
Цитата:
|
Цитата:
Код:
Function .onInstSuccess Код:
Function .onUserAbort в модерне функция "зашита" в константу Код:
!define MUI_CUSTOMFUNCTION_ABORT "Моя_функция" |
Если речь идёт о инсталляторе с графическим интерфейсом, то последняя функция, которая будет выполнена - функция с именем .onGUIEnd, она будет выполнена в любом случае и всегда самой последней, если, конечно, инсталлер закрывается штатно без краша и убития процесса, и если процесс установки не запущен с ключом /S (тихая установка)
Код:
Function .onGUIEnd Можно поступить разными способами, тут только вопрос о том, какой функционал вам нужен и зачем вам последняя выполняемая функция Можете прописать команды в .onInstSuccess - будет выполняться всегда при всех условиях, только посмотрите сами, как она будет отрабабывать Можете добавить в эту функцию проверку на запуск с ключом "/S", чтобы, например, всегда выполнялась .onGUIEnd даже при тихой установки: Код:
Function .onInstSuccess В общем, тестируйте, смотрите, что вам больше подходит Если речь идёт о silent архиве без графического интерфейса в коде изначально - то там вы уже сами можете определить, какую функцию выполнять последней перед командой quit (закрытие инсталлятора) |
Не могу решить проблему. При использовании
Код:
SetOutPath "$APPDATA\Color\Licenses\EQ" Цитата:
|
Вы уж меня простите, если обижу, но это похоже на какой-то троллинг, либо вы сами себя запутали и ничего не поняли из наших ранних сообщений
1. Вы предоставляете код из двух строк, который распаковывает какой-то файл "License.license" 2. Вы тут же пишите, что не можете удалить папку "$APPDATA\Color" с файлами, хотя пустая папка удаляется, ранее шел разговор про команду RMDir, которую вы якобы поняли, как использовать 3. Вы удаляете папку "$APPDATA\Color" командой RMDir без ключа /r, в которой есть файлы, хотя вроде бы знаете, что команда RMDir без ключа /r не удаляет папки с файлами И если хотите, чтобы вам реально помогли - предоставляйте полный код с проблемным функционалом, а не какой-то бесполезный отгрызок из пары строк Цитата:
|
Цитата:
Код
Код:
;---Definitions---- Проблема в этом куске(не работает): Скрытый текст
Код:
SetShellVarContext all |
Цитата:
Ещё раз откройте наш справочник и внимательно прочитайте каждое слово на страничке описания команды IfFileExists, ибо если вы в таком же духе "продолжите изучать NSIS" - сомневаюсь, что лично мне хватит терпения постоянно цитировать содержание страничек справочника персонально для вас в этой теме. Были в этой теме уже личности, которые не желали читать справочник, когда им говорили об этом раз 10 подряд, и вообще во что-то вникать для создания своего кода не хотели, а хотели только готовый код видеть в этой теме. Вы вроде бы что-то пытаетесь сами сделать, ладно, посмотрим :) Цитата:
Ваш кусок кода настолько простой, что "не работать" он может только из-за внешних проблем: отсутствия файлов или занятость их другими приложениями Иногда, например, не удаляются директории (уже не помню при каких случаях) Сделайте после каждой команды переименования/удаления паузу командой показа сообщения Код:
MessageBox MB_OK|MB_ICONINFORMATION "test" |
Цитата:
Цитата:
Код:
SetShellVarContext all Цитата:
|
Как показывают тесты вся проблема в команде
Код:
SetOutPath "$APPDATA\Color\Licenses\EQ" |
Цитата:
Цитата:
Так сделайте и не покажет сообщение, если папка не удалится Код:
RMDir /r "$APPDATA\Color" Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Processfunc.nsh имеет недостаток. Если запускать инсталляционый пакет без административных прав, то он не находит процессы которые запущены с повышенными правами, SYSTEM например :(
|
Цитата:
А вы хотели получить полные права в ограниченной учетной записи? |
Цитата:
И ещё ребят кто знает как сделать цифровую подпись инсталятору на НСИС? А то Гугль Хром блокирует мою программу из за того что она ехешник! Типа может нанести вред компьютеру! |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Подскажите, как проделать следующее: если у файла hosts стоит атрибут "только чтение", то снять его, записать некоторое значение и снова поставить атрибут "только чтение", а если атрибута нету то просто записать значение? И как удалять значение из файла hosts?
|
Цитата:
Код:
Function test Цитата:
Но такого кода ещё не было, свежачок :) Код:
Function test2 в начале кода пропишите Код:
!include "FileFunc.nsh" |
привет форучани нужна ваша помош хочу вот такой файлик зделат на свой сайт файл сам ехе формате когда кликаеш на файл она распакует файлы в програм файл и на рабочий стол кидает ярлык это сылка на сайт прошу помоч как можна зделат для себя вот сылка на ехе файл https://yadi.sk/d/vcmRINowgcSeH :sorry:
|
K.A.V., Огромное спасибо! Добавить несколько строк я смог, но удалить их не получается, подкиньте пожалуйста примерчик.
|
Цитата:
Может, у вас монитор запачкался и вы не увидели второй код на пол поста в сообщении... |
|
Цитата:
|
Цитата:
Цитата:
Собрал такое, но не работает Код:
${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле |
Цитата:
Цитата:
Код:
${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле Ошибка чтения строки, почему? Потому что вы передаёте ранее не задействованную переменную $R4 с пустым значением, соответственно, никакая строка прочитана не будет Вторая выделенная строка. Т.к. выше была ошибка чтения строки, то и поиск фразы будет неудачным Третья выделенная строка. Т.к. было выше 2 ошибки, никакая строка удалена не будет Вы просто наугад подставили переменные и думали, что код магическим образом заработает? Если бы вы прочли наш справочник, то смогли бы создать 1 глобальную переменную, в которую бы помещали фразу для поиска и вызывали бы мою написанную функцию сколько угодно раз. Скрытый текст
Код:
Function test Читайте Справочник по NSIS, моя любимая фраза для новичков, которую я не люблю повторять |
Цитата:
Без этого, как правило, манипуляции с файлом будут не возможны... (т.к. либо файл "занят" системой , а ещё хуже, когда файл hosts под контролем какого нибудь "защитника" или антивируса, что встречается всё чаще и чаще... ) |
Цитата:
|
Решил в одну функцию запихнуть удаление строк в файле hosts с проверкой атрибута для удобства, при выходе из исталлятора атрибут снимается, но не ставится обратно после удаления строк. Вызываю вот такую функцию
Код:
function delete И еще вопрос: при удалении строк в конце файла постоянно остается пустая строка и получается что после 10 запусков в итоге имеем 10 пустых строк. Как сделать чтобы не оставалась пустая строка? |
Цитата:
Цитата:
крик души
блин, вот скажите мне, для кого писался справочник? Я создавал его в надежде на то, что им будут пользоваться менее опытные кодеры, которым я смогу передать полученные знания и хотел, чтобы другие люди чему-то научились из этого справочника, но почему-то всё же находятся такие личности, которые хотят "всё и сразу и без чтения инфы" - ребят, в этой теме так не бывает, хотите, чтобы вам помогали решить вашу проблему - будьте добры, прочитайте справочник (да хотя бы самый минимум, те команды, которые используете - пишите правильно, а не наугад подставляйте параметры) Ключевое слово - помогаем, а не делаем всё за вас такое ощущение складывается, как-будто мне это нужно и я сижу уговариваю человека "ну прочитай, пожалуйста" :glare: Цитата:
Давайте вы: 1. Воспользуетесь поиском по этой и предыдущей теме NSIS по ключевым словам LineFind, LineRead 2. Прочитаете в справке описание команд LineRead, StrCmp 3. Попробуете совместить команды LineRead, StrCmp с моим кодом удаления строки, в котором каждая строка с комментарием 4. Покажите, что у вас получилось Давайте запустим здесь для всех ленивых новичков режим "Обучение", будем только указывать на ошибки, давать рекомендации и не будем давать готовых кодов? Посмотрим, через какое время им всё же придётся обратиться к справочнику :) Мне кажется, этот способ будет очень эффективный, не хотите изучать NSIS - либо мы заставим, либо вы забьёте на NSIS |
Цитата:
Цитата:
Цитата:
Цитата:
Код:
StrCmp $R0 "1" 0 +2 ;если здесь поставить +1 то атрибут ставится постоянно не зависимо от результата проверки Скрытый текст
Код:
Function ReplaceLinesInFile Цитата:
|
Цитата:
Ещё советую при использовании команд внимательно читать описание к команде, некоторые команды в NSIS переназначают значения переменных своими данными, из-за чего ваш код так же может оказаться некорректным, если вы используете те же переменные, что и команда NSIS, простой пример - команда Locate для поиска файлов, её callback функция использует переменные для хранения своих данных во время процесса поиска: Код:
Function "Function" Цитата:
Скрытый текст
Для изучения конкретно NSIS вам нужно только одно - желание. Я тут уже 100 раз рассказывал, как лично я познакомился с NSIS будучи ещё совсем "зелёным" (во всех смыслах), я не то чтобы даже английский язык не знал, я в то время даже не знал, что такое интернет и редактор реестра. У меня кроме дистрибутива с непонятной программой (NSIS), которая просто была на CD в куче софта, больше ничего не было, ни знаний компьютерных, ни интернета, ни уж тем более справочника на русском
Я даже сейчас не знаю ни одного языка программирования и английского языка тоже не знаю, но просто есть желание и упорство - всё получается, это я к тому, что всё зависит только от вас, к тому же, у вас есть то, чего не было лично у меня - помощь со стороны более опытных кодеров и русская справка, пусть и не с огромным количеством всяких примеров и переведённых команд - но всё же для получения базовых знаний о NSIS справочник вполне сойдёт. Цитата:
------- Цитата:
Вот дальше вам необходимо понять всю силу фразы "Читайте справочник", если вы будете знать о всех командах, которые вам доступны в NSIS - вы будете писать код в несколько раз быстрее, зная команды - у вас в голове сразу будет строится код. Что для этого нужно? Так, ну, раз у меня простой текстовый файл, значит для начала мне нужно прочитать строку, а как я могу прочитать строку? Точно, есть же команда LineRead! Код:
${LineRead} "[Файл]" "[Номер строки]" $var В голове строится код Код:
StrCpy $1 0 ; нам сначала нужно обнулить счетчик, т.к. переменная возможно уже ранее использовалась Т.к. содержимое прочитанной строки помещается в переменную $0 (смотри описание команды LineRead), то, соответственно, нам нужно сделать условие сравнения этой переменной с пустым значением в команде StrCmp, с пустым потому, что нам нужно определить, что прочитанная строка действительно пустая, а не с данными Код:
StrCpy $1 0 ; нам сначала нужно обнулить счетчик, т.к. переменная возможно уже ранее использовалась Код:
${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки Код:
StrCpy $1 0 Код:
StrCpy $1 0 Так, стоп, а как же условие того, что наша строка не пустая, что делать то...а, ну всё правильно, нам нужно перейти к следующей строке, значит в условие StrCmp делаем ссылку на метку NextLineRead Код:
StrCpy $1 0 Точно, есть же команда LineSum, которая подсчитывает общее количество строк в файле! Давай-ка её в начало пропишем и назначим переменную для хранения $R0. Код:
${LineSum} "[Файл]" $R0 Я укажу так, что если текущий счетчик строки больше общего количества строк, то закончим обработку, а если меньше либо равно - то продолжу чтение Код:
${LineSum} "[Файл]" $R0 Код:
${LineSum} "[Файл]" $R0 Вроде бы всё, осталось добавить callback функцию DeleteLineCallback для удаления строки Код:
Function DeleteLineCallback На самом деле, если посмотреть на этот код - здесь реально ничего мегакрутого нет - обычный код с использованием стандартных команд, вся фишка в том, что я знаю много команд в NSIS и знаю, что конкретно могу получить от той или иной команды. На основе этих знаний у меня код в голове строится автоматически, остаётся только его напечатать и проверить работоспособность В примере этого сообщения я вам продемонстрировал, как на самом деле всё просто, достаточно всего-лишь знания команд NSIS и немного времени, чтобы продумать логику действий в коде. Цитата:
|
Цитата:
|
Кстати, есть более простой способ определения админских прав, всего одна строчка кода :tongue:
Код:
System::Call setupapi::IsUserAdmin()i.r0 |
Цитата:
или используй команду SHOW GRANTS (Просмотр привилегий http://www.dbaguru.ru/users-privileges.html ) |
Сколько процессов можно убить за один сеанс?
Скрытый текст
Например, в таком виде отлично убиваются все разноименные (у меня - 6) процессы и несколько одноименных (в моем случае одноименных процессов - 7). Но за один сеанс убиваются только 4 одноименных. Остальные остаются.
Одноименные процессы могут создавать как разные однотипные программы, так и одна программа (множественный запуск). Можно ли их убить все за раз? Код:
Function .OnInit Также интересует, как определить текущие региональные настройки. В частности - формат и расположение? |
Цитата:
|
Цитата:
Код:
!include "Logiclib.nsh" Код:
${While} ${ProcessExists} "notepad.exe" Код:
taskkill /f /im "notepad.exe" |
Цитата:
Спрашиваю для общего развития, т.к. выше описанный вами сценарий успешно справляется с задачей. Спасибо еще раз. |
Цитата:
Код:
exec 'taskkill /f /im "notepad.exe"' |
Добрый
Подскажите чайнику: можно ли изменить размер главного окна инсталлятора? т.е. отличный от 300*140 Заранее спасибо |
Цитата:
Цитата:
|
Подскажите, если так выглядит запись для обычного ярлыка,
Код:
CreateShortCut "$SMPROGRAMS\Software\Maker\Сайт Maker.lnk" "http://www.maker.com" "" "$INSTDIR\maker.exe" "" "" "" "Посетить веб-сайт програмы Maker" (и чтобы с пиктограммкой дефолтного браузера)? |
Цитата:
Содержание файла такое: Код:
[InternetShortcut] Цитата:
Не особо вникал в этот вопрос (правильное ли это определение или нет): Код:
ReadRegStr $1 HKCR "http\DefaultIcon" "" На примере Firefox - там иконка html-файла (значение параметра путь к firefox.exe и с индексом 1, firefox.exe,1) Забегая вперёд и включая вангу, предположу возникновение вопроса о том, как отсечь с конца строки символ запятой вместе с индексом иконки :) Код:
!include "Logiclib.nsh" Код:
ReadRegStr $1 HKCR "http\DefaultIcon" "" |
Цитата:
Спасибо еще раз. Возник вопрос по удалению папки установленной программы. Например, файлы устанавливаются в C:\Program Files (x86)\Aleo Software\Flash Intro and Banner Maker\ = $INSTDIR, по умолчанию. Для того, чтобы удалить папку [Aleo Software], приходится устанавливать (как написано в Руководстве) текущий рабочий каталог, являющийся родителем папки [Aleo Software], т.е. C:\Program Files (x86): Код:
SetOutPath "$PROGRAMFILES" |
Цитата:
Так, например, удаление не сработает: Код:
SetOutPath $TEMP\dir Т.е. перед удалением какой-либо папки можете установить текущим каталогом левую папку, например временную папку $TEMP Цитата:
Ничего отсекать/отрезать не нужно от пути установки, выполняйте действия только с $INSTDIR и не придумывайте лишнего, по-крайней мере, так безопасней для личных файлов пользователя, вам потом спасибо не скажут за удаление файлов, не относящихся к программе, запомнят ваш ник и не будут потом ставить от вас репаки :) |
Цитата:
|
Цитата:
В голову пришла такая идея, можно реализовать опять же циклом такую штуку: проверяем, является ли каталог пустым, начиная с $INSTDIR, если пустой - удаляем и "поднимаемся вверх" по дереву папок, делая аналогичную проверку, если папка снова пустая - снова удаляем и ползём ещё выше :) разомни пальчики комбинациями ctrl+c и ctrl+v :teeth: Код:
!include "FileFunc.nsh" Код:
StrCpy $0 "$INSTDIR" |
Цитата:
Код:
Function .onVerifyInstDir В итоге, страница выбора папки установки в инсталляторе была отключена :teeth: И не затрется ничего. |
Доброго времени всем! Прошу помощи - второй день только разбираю NSIS и столкнулся с, на мой взгляд, неразрешимой проблемой :(
Требуется в процессе работы инсталлятора создать ярлык на рабочем столе, который будет содержать следующую команду, к примеру: Код:
"C:\Program Files (x86)\Opera\launcher.exe" "http://google.com" Код:
C:\Program Files (x86)\Opera\launcher.exe Вообще конечная цель - ярлык на рабочем столе, который будет открывать определенный URL с помощью конкретно указанного браузера, отличного от дефолтного. Может есть какой-то обходной путь? |
Цитата:
Приходите с прочитанным справочником, кидать вам код таких простых команд - не вижу смысла |
Цитата:
Справочник по NSIS изучил в нужной для этого части в первую очередь (и сразу заметил некоторые неточности), много прочел в других источниках. Видимо, проблему придется описать подробнее. Мой код: Скрытый текст
Код:
; Define your application name Первый вопрос риторический - я читал ваш справочник? Отвечать не нужно. А второй вопрос, за которым я обратился к мудрости участников этого форума заключается в том, что команды выделенные жирным, при выборе пункта "В Google Chrome" не создают ярлык на рабочем столе, у которого в свойствах в поле объект будет присутствовать следующая строка (обратите внимание на кавычки): Код:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "http://google.com" |
Цитата:
Цитата:
Цитата:
Ещё раз откройте описание команды CreateShortCut и прочтите её описание Цитата:
Путь до папки ярлыка+его имя+расширение lnk 2-ой параметр Путь до файла, который существует на диске, к которому создаётся ярлык 3-тий параметр параметры запуска В вашем случае, адрес сайта - это параметр запуска Код:
CreateShortCut "$DESKTOP\Полезные ссылки.lnk" "$Browser" "http://google.com" "$INSTDIR\fs.ico" "0" Цитата:
|
Спасибо!!! Просто в вашем справочнике про создание ярлыка очень мало написано - там упоминаются параметры запуска, но нет примера использования... Не сообразил, что URL нужно передавать как параметр... Еще раз спасибо!
|
Цитата:
|
Есть интересный плаг AccessControl, нужно записать разрешения на файлик для разных групп пользователей (в том числе и запрет, например, на запись), есть у кого идеи как реализовать?
|
Цитата:
Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Странный всё-таки народ пошел, им всё разжевали, но им и этого мало... |
|
Цитата:
Цитата:
Вообще получить HWND элементов интерфейса не сложно, конкретно для этого элемента: Код:
GetDlgItem $0 $HWNDPARENT 1018 Код:
GetDlgItem $0 $HWNDPARENT 1018 |
Цитата:
Что-то не правильно? Скрытый текст
Код:
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit Нужно изменить размер, а то все остальные элементы обрезаются...
![]() |
Цитата:
Что-то типа такого попробуйте: Код:
Page custom TEST Код:
Function TEST Берёте файл с ресурсами диалогов из папки <NSIS>\Contrib\UIs (например modern.exe) Открываете его с помощью программы для редактирования ресурсов (ResHacker/Restorator), делаете необходимые изменения Помещаете отредактированный файл в папку с вашим NSIS скриптом и в скрипте прописываете: Код:
!define MUI_UI "modern.exe" |
|
Всем привет. Попытался создать простое примитивное окошко. но нигде не нашел информации как в скрипт вставить жирный, наклонный текст, размер шрифта и цвет, ну что бы в моем окошке слово "Привет!" было жирным, наклонным с больше или меньше шрифтом и с другим цветом. Или такое зделать невозможно? Вот мое окошко:
Код:
!define PRODUCT_NAME "hello v${VER}" |
динозавра, конкретно в этом окне надо? Насколько мне известно это невозможно...
Цитата:
|
BuZzOFF, спасибо за отзыв. Хотелось бы в таком окошке, но если невозможно....
Если поделишься примером. как это делается в инсталяторе буду очень и очень благодарен. :umnik: :yahoo: |
Цитата:
Код:
!include "MUI2.nsh" |
BuZzOFF, огромное спасибо.
В справочнике я видел инфу шрифтов, но пробЫвал это втюхать в мое окошко, но естественно ничего не получилось. Я просто видел один установщик от RePack9649, так у него окошко с выбором языка цветное, вот я и подумал, что и в моем примитивном окошке тоже можно както менять шрифты. |
Цитата:
|
Цитата:
|
Привет) нужна помощь так как я новичек))) нужен скрипт для нсис , как установить ip адрес))) спасибо )
|
Цитата:
; http://nsis.sourceforge.net/ExecDos_plug-in ; http://ogarkov.com/2011/02/25/window...метров-tcp-ip/ ; http://blogerator.ru/page/10-komand-...-kazhdyj-admin |
Можно ли как-то реализовать такое?
Есть файл с названиями элементов. Элементов штук 50 (но может быть и больше). Один элемент - одна строка. Как сделать так чтоб считывались названия из файла и создавались CheckBox'ы с этими названиями. Т.к. CheckBox'ов много будет нужно как-то прилепить ещё и scroll... И как потом проверить статусы отметки всех этих элементов. P.S. Со считыванием названия и созданием CheckBox'а проблем нет. Не знаю как это зациклить :) upd1. Наверное только через IO такое получится. Но хотелось бы NSD. upd2. Сделал на IO. Работает. На NSD можно сделать? IO - не очень удобно... ![]() |
Цитата:
Код:
!include "MUI2.nsh" |
Цитата:
![]() upd. Помогите, пожалуйста с CheckBox'ами. Как сделать проверку отметки универсальной, чтоб не руками вписывать, т.к. их количество будет каждый раз разное. |
Цитата:
Можно такой вариант (если чисто для информации) - инфа об исходном, дефолтовом (до того, как пользователь их отметит или снимет отметку !) состоянии чекбоксов (можно по всякому сделать, в зависимости от цели) : Код:
|
Цитата:
|
Цитата:
Этой кнопкой будешь запускать инсталляцию после отметки чекбоксов, а родную кнопку Install - удаляешь со страницы Функция почти такая же : Код:
Function CheckItemState В итоге : в $R8 - строка с последовательностью 1 и 0 , т.е. отмеченных или не отмеченных всех чекбоксов А далее, в зависимости от того, который по счёту символ в строке будет 1, т.е. отмеченным чекбоксом, то простой логикой, если символ под номером таким то (а это номер точно известного компонента) равен 1 , то он и устанавливается. Конечно можно и по другому. Но так , как мне кажется, будет проще... |
Цитата:
Огромнейшее спасибо! Я про этот ListView вообще не знал... Буду дальше разбираться. |
|
Цитата:
Код:
!include "MUI2.nsh" |
Когда то kotkovets сотворил интересный и полезный код - кнопочный тулбар из bmp
![]() Но к сожалению этот код нормально компилится только в версии NSIS 2.46. В NSIS 3 получаем ошибку... И дело похоже в CommCtrl.nsh. Даже откорректированная для NSIS 3 ( из справочника) - не работает. А не работает наверное потому , что в этом варианте CommCtrl.nsh нет макросов для Toolbar_а (__NSD_TB_ADDBUTTONS и сопутствующее добро... ) Как бы это дело подретушировать для NSIS 3 ? Я в сети находил вариант CommCtrl.nsh с нужными макросами, но подстановка их в CommCtrl.nsh всё равно приводит к ошибке... |
Вложений: 1
Цитата:
|
K.A.V.,
И этот хедер не работает... Ну что такое... Цитата:
|
Цитата:
В этом хидере в макросе ${NSD_TB_ADDBUTTONS} нет команды !verbose, смотри внимательней, что/куда копируешь и какой код компилируешь |
K.A.V.,
Разобрался. Опять у меня -25. Если рядом с файлом скрипта другой CommCtrl.nsh - ошибка. Что за хрень... Уже ведь такое было. Но есть такой момент - пол тулбара теперь обрезано... ![]() И нет никакой реакции у ${NSD_CreateToolbar} на изменение размера и позиции... То же, при компиляции в 2.46 - работает нормально... ps раскомментировал в CommCtrl.nsh ;|${CCS_NORESIZE}|${CCS_ADJUSTABLE} - и всё заработало. (нужно было ${CCS_NORESIZE} ) |
Цитата:
Спасибо за помощь. Кстати, у всех сайт не работает? nsis.sourceforge.net P.S. Этот ListView для меня как "новые ворота". |
Цитата:
Цитата:
Цитата:
|
Подскажите как записать двойной слеш в ini файл?
Код:
[Directories] |
Цитата:
Справочник по NSIS => Перевод справки NSIS => StrRep Справочник по NSIS => Перевод справки NSIS => WriteINIStr Код:
!include "StrFunc.nsh" |
А как с таким быть?
Код:
[Directories] Код:
!include "StrFunc.nsh" |
Цитата:
|
Цитата:
|
Цитата:
Если поменять кодировку файла - не знаю (и гуглить особо не ок с мобильного инета, поэтому как-нибудь сами), я вообще по теме кодировок "не бум бум" Судя по запросу гугла на сайте NSIS есть какой-то плаг "Unicode", у меня в архиве на жд его нет (опять же, потому что темой кодировок не интересовался), поэтому не могу сказать, что это за плаг и какие в нём есть функции - возможно в нём как раз есть полезные функции Поиском в гугле по-быстрому наткнулся на код от kotkovets, в нём есть макрос преобразования ANSI строки в UTF8, что позволяет писать корректно в файл с кодировкой UTF8 (насчет других - не в курсе) Код:
!include "StrFunc.nsh" |
Всем привет!
Возникла такая задача. В зависимости от выбора типа установки (32-бит или 64-бит) выводить в списке компонентов только нужные элементы (именно выводить, а не отмечать галочкой). Есть ли какой-нибудь флаг типа установки InstType чтобы знать какой выбран в данный момент или же тут только через кастомную страницу с радиобатонами придётся решать? Заранее благодарен. |
Цитата:
Цитата:
А разрядность ОСи определяется буквально парой строк Цитата:
Код:
Section /o "Эта секция скрывается при 64-bit ОС" SEC_64BIT |
Можно такое реализовать?: надо дождаться завершения процесса, но этот процесс запускается в другом процессе. То есть использую запуск
Код:
Exec '"$INSTDIR\someprogram.exe"' |
Dodakaedr, в шапке: Работа с процессами (ProcessFunc.nsh)
P.s Скоро выложу обновленный, адаптированный по win10 winver2.nsh |
Хотел уже писать что не нашел там нужного, а потом решил еще раз посмотреть по внимательней и увидел))
Цитата:
|
Код:
Function test Что-то сообразить не могу... |
Код:
StrCpy $PayloadID "$PayloadID $R1" Цитата:
|
Спасибо за GetCurInstType!
Цитата:
Спасибо! |
Адаптировал WinVer2.nsh под Windows 10.
Добавлены значения:
На серверных ОС не тестировал, просьба потестировать. |
kotkovets,
Когда то мы обсуждали тормоза обработки WMI запросов... В частности для NSIS есть http://nsis.sourceforge.net/WMI_header. Без этого хедера многие вещи в NSIS сделать просто не возможно... Но вот скорость работы... Недавно натолкнулся на обсуждение и преодоление тормозов при использовании WMI - http://bbs.vbstreets.ru/viewtopic.php?f=1&t=43269 Возможно ли как то "подправить" WMI.nsh для ускорения работы ? |
Всё - таки легко не получилось :) Нужно при тыканье на тип установки на странице компонентов вызывать функцию .onInit, так как в ней определяются компоненты которые нужно или не нужно выводить. Где это можно прописать?
Спасибо |
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 |
Цитата:
|
Подскажите как добавить текст в буфер обмена?
|
Цитата:
|
Цитата:
|
Цитата:
Если хотите именно скрывать пункты - вам нужно писать свою кастомную страничку, на ней уже будете обрабатывать, какой пункт выбрал пользователь (x32/x64) и в зависимости от выбора заполнять элемент нужными пунктами, очищая перед заполнением, всё это придётся прописывать вручную. Набрасывать такой код не буду по одной простой причине - не знаю, какой вы хотите видеть кастомную страничку, такой же, как и дефолтная с выпадающим списком - или с выбором типа установки по принципу радиобаттонов и вообще, с помощью чего собираетесь делать кастомную страничку, IO или nsDialogs Если не браться за кастомную страничку и попытаться реализовать это, то можно сделать с помощью костылей, т.е. код будет не очень красивый и удобный, вот пример этого ужасного кода (не пишите такой код никогда :)): Код:
!define PRODUCT_NAME "Моя программа" С кастомной страничкой это будет выглядеть красивее и удобнее, да и правильнее |
Цитата:
Ну, ежели у тебя именно так, то тогда лучший (если не единственный) вариант, как уже сказал K.A.V. - кастомная страница. |
Цитата:
Либо можно по-другому, без кастомной странички с компонентами: создаём кастомную страничку с двумя радиобаттонами с предложением выбрать, какой тип приложения устанавливать (x32/x64) и уже после этого выбора задействовать тот кусок кода из .onInit, который скрывает "лишние" компоненты |
Накидал вот такой код:
Код:
!include "MUI2.nsh" Цитата:
В .onInit происходит поиск этих самых хостов и определение секций. И вот мне надо сделать чтобы при определении секций ещё учитывался и выбор версии плагина. |
Можно ли вот этот как нибудь организовать в NSIS?
|
Цитата:
Т.е. если нужно показать только для x64, то прописываем этим секциям текст и прописываем пустые имена тем секциям, которые не должны отображаться в x64 Код:
!include "MUI2.nsh" Цитата:
|
Вложений: 1
Вопрос по примеру из Cправочника по NSIS.
Работа со строками. Замена строки в текстовом файле. читать дальше
Имеются ли какие-либо ограничения по кодировке обрабатываемых текстовых файлов?
Мне нужно было заменить значение Lang=9 на Lang=22 в файле 01.ini. И ничего у меня не вышло. При просмотре того, что же, все-таки, выводится в переменную $R9, увидел следующее: Текст обрабатывался посимвольно. ![]() Напротив, другой файл (02.ini) обрабатывался правильно - построчно. ![]() Единственное отличие файлов, которое я нашел - различная кодировка. 01.ini - USC2 Little Endian, 02.ini - ANSI. Что можно сделать? |
Kopejkin,
Попробуй NewTextreplace плагин. Он и читает, и ищет и делает многое другое, в том числе и в юникодных файлах. |
Цитата:
|
А можно ли в кастомной странице используя nsDialogs::Create 1018 поменять надписи в хэдере на свои? Или же только nsDialogs::Create 1044 использовать?
|
Добрый день) подскажите если не сложно как прописать что бы инсталлятор определял версию операционки 32 или 64. Спасибо =)
|
Цитата:
Код:
!include "x64.nsh" Код:
${If} ${RunningX64} |
Цитата:
Код:
!include "x64.nsh" |
Кто уже успел полюбить Windows 10?
Берём из справочника команду ${GetFileVersion}, либо GetDLLVersion, делаем что-то вроде: Скрытый текст
Код:
GetDLLVersion "$SYSDIR\kernel32.dll" $R0 $R1 В предрелизных версиях было нормально: 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 Хорошо, что есть WinVer2, но, блин... |
Цитата:
По вопросу - перед проверкой версии файла скопируйте его в другую директорию, например в $TEMP, видимо, там что-то намудрили разрабы, поэтому и такой результат выполнения команды... Цитата:
|
Цитата:
Появилась вторая бетка 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 |
Цитата:
Код:
${GetGameDrive} "путь установки игры без буквы диска" Код:
outfile test.exe Макрос определяет логические диски на компьютере и предлагает установить на первый логический диск не являющийся системным, в противном случае будет предложен системный диск. Цитата:
|
Цитата:
Скрытый текст
Код:
!include "FileFunc.nsh" Цитата:
|
|
Приветствую всех. Вопрос по nsDialogs. Есть четыре чекбокса, нужно сделать так- если ни один из них не отмечен, то кнопка 'далее' не активна, если хоть один отмечен, то соответственно- активна. Возможно ли?
|
Цитата:
|
Вы как всегда правы.
|
Всем привет. Пытаюсь сделать маленький экзешник типа замены рег файла, только с кнопкой да или да - нет. Но это не важно - все получается и сведенья добавляются в реестр. Проблема на х64 и только с веткой HKLM. Сведенья добавляются не туда. К примеру мне нужно создать [HKEY_LOCAL_MACHINE\SOFTWARE\Proba] , а у меня создается [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Proba]. Что нужно прописать, чтобы само не добавлялось Wow6432Node? Спасибо.
|
Цитата:
|
Оперативно. Но на изучение уйдет много времени, а мне нужно всего лишь помощь в коректировке уже рабочего экзешника, не изучая досконально язык програмирования. Как говорил мой дед: "спасибо, что не отказали в помощи".
|
Цитата:
"Сделайте мне быстро и чтобы я не вникал ни во что" - это так заказы оформляются на фрилансерных сайтах, вам туда с такими сообщениями и подходом |
Извените. Но я не то имел ввиду. Если всавить код. то выдает по очереди два сообщения типа х86 ок и за ним х64 - ок. Я хотел автомат без окошек с ок.
|
динозавра,
Приведи здесь свой код и чётко поставь задачу. |
Вот
Код:
Section main |
Цитата:
динозавра, читайте справочник от корки до корки По поводу вопроса: чтобы данные не писались в Wow6432Node, нужно установить тип доступа в реестр (а инсталляторы, которые создаёт NSIS - 32 разрядные приложения, поэтому и доступ у них перенаправляется в Wow6432Node раздел), необходимо перед командами записи в реестр добавить команду SetRegView 64 Код:
SetRegView 64 |
Да, конечно я нуб в этом и это мой второй экзешник.
Я не занимаюсь програмированием. Просто по быстрячку хотел поэкпериментировать и ждал от вас именно этой подсказки, за что огромная всем откликнувшимся благодарность. Когда закончится в поле вся работа, ближе к зиме - займусь плотнее NSIS. |
Интересно, как можно попроще решить такую задачу ? :
Наводим курсор на изображение - это изображение заменяется другим (ну и курсор при наведении меняется, становится "ладошкой") Кликаем на изменившемся изображении ПКМ - получаем Callback. Возможно ли здесь обойтись без таймера ? |
Цитата:
|
Цитата:
На худой конец, написать плагин... Цитата:
Цитата:
Увы, но на WinAPI нет ничего готового, нет никаких плюшек для автоматизации какого-то действия, так что для всего того, что ты описал, ты должен будешь сделать всё вручную, а именно: 1. Получить текущие координаты позиции курсора мыши 2. Получить координаты элемента с изображением 3. Вычислить, если координаты из п1 входят в диапазон координат п2, то курсор над изображением 4. Вручную, опять же, присвоить изображение 5. Обработать нажатие ПКМ на изображении тоже должен сам, если пришло такое сообщение - делаешь то, что нужно Я бы, наверное, просто закинул это дело в плаг и попробовал бы создать элемент изображения в самой dll и там же всё это обрабатывать в своей процедуре...Но это будет мягко говоря не удобно, создавать dll для одного элемента :) |
Кто нибудь юзал вот это
http://nsis.sourceforge.net/NullsoftDecompiler Работает? У меня на выходе получается белиберда.. |
Цитата:
Цитата:
Цитата:
Вот мой рабочий тестово- корявый :) код (для одной кнопки-изображения) : Код:
!include "MUI2.nsh" ps Для чего это всё надо ? А чтобы в ногу со временем идти и для разнообразия :). Чтобы делать страницы, оформленные в стиле Metro интерфейса. При наведении курсора - вокруг кнопки (а это - цветное изображение прямоугольника на цветном фоне) появляется рамочка, чтобы был виден выбор этой кнопки, затем клик и действие. Ладошка курсора - это приятная и полезная мелочь. Хорошо бы всё это загнать в DLL... Вполне реально и полезно... Но с dll мне не справиться... Вся надежда на вас, на гуру. :) |
Цитата:
Короче говоря, в твоём вопросе в пределах NSIS-кода для элемента статика - только таймер Может, конечно, найдёшь другой метод, но я не в курсе, как это ещё можно сделать Цитата:
Скрытый текст
Код:
!include "MUI2.nsh" Цитата:
|
LOKYOXY, уберите картинки под коврик, и что это хрень?
|
Цитата:
Человек, видимо, написал свой интерфейс в стиле "жизньболь" (ну, мне просто основной цвет не нравится :)) под NSIS, а этот пост - видимо, менеджер закачек на NSIS |
Цитата:
|
Цитата:
|
Использую nsis3.0a2 подключил библиотеку RegistryFunc.nsh, взятую с справки.
Теперь сам вопрос: почему при вызове команды ${MoveKey} Код:
${MoveKey} "${HKCU}\Software\7-zip" "${HKCU}\Software\7-zip2" Код:
${HKCU}\Software\7-zip2 |
Цитата:
Если нужно переместить в другой ключ, который не существует - ключ будет создан. --- Если ключ реестра, который нужно переместить, не существует, то устанавливается флаг ошибки --- Вообще библиотека заточена под NSIS 2.46 ANSI версии. |
kotkovets, так ключа не существует, перемещать нечего и создается пустой ключ.
|
Цитата:
Код:
!include "RegistryFunc.nsh" P.S ан нет создается ключ 7777, хотя не критично, но подправлю |
Цитата:
|
Есть такой известный код определения BIOS serial number с помощью WMI :
Но он почему то не работает в Win7 и выше... Как это исправить ? И будет ли он работать с другими WMI параметрами, т.е. определять не только BIOS Serial Number ? |
Цитата:
скрипт vbs
Код:
strComputer = "." очевидно мелкгомякие подрезали что то.. NSIS не виноват |
Цитата:
CIMV2 Win32_BaseBoard Product - всё равно не работает... |
Цитата:
поэтому скрипт нужно дотачивать до нужных типов (определить точно, какой тип переменных тебе надо возвратить) т.е какие тебе нужны в итоге. Скрипт заточен под серийник биоса, и тип возвращаемой переменной Variant Скрытый текст
Код:
System::Call "$3->20(w 'WQL', w 'Select SerialNumber from Win32_BIOS', \\ переделывать скрипт не имеет смысла. |
Цитата:
|
Цитата:
Цитата:
Подставь, например, Manufacturer или Name за место SerialNumber и получишь значения производителя и версии BIOS Все доступные параметры можешь посмотреть на страничке Win32_BIOS class, также можешь использовать другой класс (Win32_BaseBoard, Win32_Processor и т.д.) для получения инфы о другом железе |
Цитата:
BIOS Serial Number=failed to get: -2147217406 И при Manufacturer, и при Name ... |
Цитата:
Там в двух местах нужно заменять Скрытый текст
Код:
; Display BIOS serial number |
Цитата:
|
MKN, можно и так )
Скрытый текст
Код:
OutFile "bios_sn.exe" |
Возвращаясь к имитации метро фейса...
При использовании WndProc.dll наблюдается такой не приятный момент. При быстром наведении курсора, то на одно изображение, то на другое - оба изображения могут выделиться (замениться на другое изображение) одновременно... И ещё про курсор-ладошку... При перемещении курсора вне изображений , курсор очень быстро, но глазом заметно, изменяется-мельтешит, превращаясь из стрелки в ладошку и обратно... Как бы преодолеть эти неприятные мелочи ? Код такой (дока к плагину не нашёл, может что не так и делаю... ) : Пример кода
Код:
!include MUI2.nsh |
Скрытый текст
Код:
!addplugindir "." Цитата:
Цитата:
В код добавил 2 переменные $SetImage1 и $SetImage2, которые используются для того, чтобы постоянно не присваивать изображения элементам (происходит быстрое мерцание из-за постоянного перемещения мыши и присваивания изображений) в функции MainWndSubProc, возможно, можно обойтись без переменных и как-то поиграться с WM_SETREDRAW - оставлю это тебе p.s. Насчет своих изображений кнопкам, есть же плагин SkinnedButton plug-in, если у тебя будут кнопки одного типа - думаю, лучше этим плагом воспользоваться Кстати, вот можешь скачать архивчик с GitHub, там примеры своего интерфейса с парой интересных плюшек + свои мессаджбоксы со своим стилем, я сам в этом не разбирался, посмотрел мельком гугля инфу по твоему плагу WndProc |
Цитата:
|
Цитата:
В начале кода не забыли добавить? Код:
!include "TextFunc.nsh" |
Цитата:
В Справочнике по NSIS об этом ни гу-гу. |
Ребята, привет.
У меня вопрос по плагину md5 Как заставить его выполнить такую задачу: нужно чтобы в проверке на оригинальность файла участвовало две хэш-суммы, а не одна. Ну то есть предположим первая хеш-сумма проверяемого файла не совпадает, тогда идёт проверка на вторую хеш-сумму. Если и она не совпадает - прерывание установки и сообщение, мол версия файла неправильная. Надеюсь поможете... А то очень понадобилось реализовать такой вариант. Дело в том что в разных версиях моей программы один и тот же файл имеет разные размеры. Вот и нужно чтобы последнее обновление можно было установить на все предыдущие версии программы. |
Цитата:
Цитата:
Код:
md5dll::GetFileMD5 "путь к проверяемому файлу" |
Вложений: 1
Цитата:
Цитата:
Цитата:
То же самое хотел предложить. А, пусть остается! Что я, зря пыхтел ;) Например, так... читать далее
Код:
В архиве CheckMyProg.zip лежит сценарий и файлы для проверки работы. Исполняемые файлы в папках - TXT-файлы с измененными расширениями. |
Обнаружилось следующее недоразумение :
Если скомпилировать скрипт, с bmp картинкой на кнопке, в Windows 7, то при запуске этого скомпилированного exe в Windows 10 - картинка на кнопке почему то отсутствует... И наоборот - если скомпилировать скрипт с картинкой на кнопке, в Windows 10, то в Windows 7 картинки нет... При компиляции и запуске скрипта в одноименных ОС - всё ОК. пример : Чтобы это значило ? ( Причём, с иконкой-картинкой на кнопке - всё ОК, т.е. обратно совместимо на всех ОС ) NSIS - 3.0b2 |
Цитата:
|
Проблема с куском кода.
Скрытый текст
Код:
IfFileExists "$EXEDIR\cfg.cfg" ext dis Правильно ли я сделал чтение значения параметра и сравнил их? Проблема в том, что не запускается MyProg Rus.exe, постоянно запускается MyProg.exe не зависимо от значения параметра. P.S. Разобрался! Проблема была в названии программы. |
Цитата:
А сегодня установил NSIS на свежий комп с семёркой, скомпилил скрипт - всё ОК и на этом компе и на компе с десяткой... Ну разве не чертовщина ? :) Т.е. на моей рабочей семёрке что то не так (и у задавшего вопрос на винампе, наверное тоже самое...). Проще переустановить систему, чем разобраться, что же произошло... |
Как с помощью плагина winver2 сделать следующее:
Если версия ОС =>6.0, то выполнить одно действие а если меньше 6.0 то другое. Как создать такое условие? |
Цитата:
Статьи => Логические конструкции Примеры кодов => Умное сравнение версий файлов |
K.A.V., Регистрация dll провожу через команду RegDLL, а дерегистрацию как сделать? Есть противоположная команда? В справке не нашел.
|
Цитата:
Пункты 4.9.3.13, 4.9.3.14. Не ленитесь. |
Цитата:
|
Цитата:
Это было выявлено уже не помню как, либо здесь кто-то об этом говорил, либо мне кто-то репорт кидал, когда создаваемые SFX архивы через мой креатор не регистрировали dll, либо я сам это обнаружил :) Возможно, этот баг уже исправили и всё наладили в новой сборке NSIS, пока не было времени тестировать (а может, моя личная dll написана криво, на которой тестил :biggrin:) В любом случае, проверьте, регистрирует ли новая сборка NSIS библиотеки через эти команды, а если нет - пользуйтесь логической конструкцией, например, я буду пользоваться в своём SFX Creator таким кодом для регистрации библиотек: Сохраняем в переменную $IsWow64Process тип системы (если значение 1 = 64 бита) Код:
Function .onInit Код:
${If} $IsWow64Process == "1" Код:
${If} $IsWow64Process == "1" Можно загнать всё в макросы для более удобного использования: Скрытый текст
В начале кода: Код:
!define MyRegDLL "!insertmacro MyRegDLL" Код:
Function .onInit Код:
${MyRegDLL} "$TEMP\MyDll.dll" Код:
${MyUnRegDLL} "$TEMP\MyDll.dll" |
Проблема с LogicLib.nsh. Не работает пример из справки
Код:
OutFile "test.exe" Ошибка
![]() Версия nsis 3.0a2. В чем может быть проблема? |
|
Всем привет.
Есть задача, скорей всего нерешаемая, но всё-таки спрошу, может и есть какие-то варианты... В общем веду неравный бой с торрентами. Дело в том, что мою программу выкладывают там, и авторы раздач зачастую сами не понимают какие версии грузят, т.к программа постоянно обновляется. Так вот хочу спросить, как прикрыть или ограничить подобную лавочку? Чтобы программу качали с официального сайта, а не с торрентов. Быть может реализовать одноразовые ключи и выдавать их только тем, кто загрузил программу с официального сайта. Но я не знаю как отладить такую схему... Есть ли у вас мнение насчёт этого вопроса? Спасибо! |
Цитата:
Запихните в главный файл проверку контрольных сумм файлов программы, чтобы все компоненты были нужной версии, если написана программа не на NSIS - сделайте эту проверку в отдельном потоке, чтобы сделать проверку незаметной для пользователя |
Подскажите, как нужно записать, чтобы папка с файлами устанавливалась на общем Рабочем столе, а не на пользовательском?
Код:
InstallDir "$DESKTOP\Моя программа" |
Цитата:
Код:
Function .onInit |
Цитата:
|
K.A.V.
Здравствуйте. Подскажите, пожалуйста, как на созданной странице сделать кликабельную ссылку (без всяких плагинов типа Linker). Ну чтобы адрес сайта преобразовывался в кликабельный. PS: страницу создал на NSIS Dialogs --------------- |
Цитата:
|
Цитата:
Код:
${NSD_CreateLink} 0u 0u 100% 10u "Ссылка" Код:
Function onClickLink |
Интересно, сколько бы я мог написать подобных "программ" на NSIS...
Ждём программку удаления файлов :) Никто, кстати, не качал поделки автора данных постов? Троянчиков в архивах нет у него случайно? |
|
Вложений: 1
Нужен совет. Хочу сделать смену иконки на выделенном объекте.
При таком коде (Хедер SetCursor.nsh) наблюдается мерцание курсора: Скрытый текст
Код:
!define OCR_NORMAL 32512 А при таком: Скрытый текст
Код:
!define OCR_NORMAL 32512 происходит применение курсора на все объекты одного класса. Например на кнопку или BMP картинку. Вот сам код: Скрытый текст
Код:
Name "Test" |
Цитата:
Код:
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)" Цитата:
|
K.A.V.
приветствую ещё такой вопрос возник - как скрыть содержимое инсталлятора от глаз архиваторов, в частности 7zip? Тут уже этот вопрос поднимался, но решения не нашли толкового, кто-то писал что можно это сделать средствами непосредственно НСИС, но способ не показал. Также программу какую-то выкладывали, но как-то не доверяю я таким программам. они неизвестно что вшивают в установщик. Алгоритм сжатия LZMA Solid использую |
Цитата:
Отвечу вам тоже самое, что отвечаю на такие вопросы в личке. Я ранее сильно не заморачивался этим вопросом и первое, на что наткнулся - http://samforum.org/showthread.php?t=30452 Это и использовал в своём SFX Creator, но потом отказался по причине, которая описана мной в той теме Вроде как ссылаются на плагин DcryptDll для защиты файлов в инсталляторе, но опять же - лично сам ничего не пробовал, примерчики там вроде есть, как и в составе любого плагина... Цитата:
Насчет "средствами NSIS" - способ описан на страничке "Can I decompile an existing installer?" по первой ссылке. Я добился такого эффекта (запрет на просмотр содержимого архиваторами) своей сборкой NSIS и буду использовать её в новой версии SFX Creator, выкладывать эту сборку я не буду по причине того, что она будет частью SFX Creator, у кого есть сильное желание - копайтесь в исходниках NSIS и добьётесь того, что вам нужно. |
K.A.V.
спасибо. Ну то что программуля крошит деинсталлятор не так страшно, достаточно деинсталлятор создать заранее и включить в дистрибутив программы наравне с другими файлами. А вот то что она требует отключения CRC мне что-то не нравится, получается кто-то может что-то поменять внутри установщика и он запустится как родной. Второй способ я не понял, сложновато для новичка типа меня. ------ И ещё возвращаясь к своему вопросу про добавление ссылки на созданной странице, Ваш пример скрипта сработал! Благодарю. Но решил обновить НСИС до последней версии и цвет ссылки почему-то такой стал: ![]() в предыдущих версия был тёмно-синий, а сейчас побледнел. Можно ли поменять этот цвет? |
Цитата:
Код:
${NSD_CreateLink} 16u 15u 100u 30u " oszone.net " |
Интересно, возможно ли убрать рамку-окантовку вокруг текста, которая появляется при клике на линке ?
|
Цитата:
Код:
${NSD_RemoveStyle} $mylink ${WS_TABSTOP} если нет макроса NSD_RemoveStyle
Код:
!define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call" |
Цитата:
|
Цитата:
--- кинь код, любопытно стало ..... |
Цитата:
![]() Цель - всё тот же метрофейс. Очень удобно кликать по цветным плиткам-линкам - и ладошка-указатель есть (не надо заморачиваться лишним кодом), и рамку-выделение плитки-кнопки не сложно организовать и главное - никаких внешних картинок не надо... код стандартный : Код:
outfile CreateLink-test.exe |
Цитата:
как перехватить действие фокуса - я не знаю. на html полно решений (есть свойство border) |
MKN, Через Label + OCR_HAND можно cделать.
|
# 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. |
На системах 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 или еще как нибудь? |
Цитата:
Код:
!include "TextFunc.nsh" Скрытый текст
Код:
${LineRead} "$EXEDIR\File.txt" "6" $1 |
Как реализовать функцию sharedfile в nsis как в inno setup?
Код:
Source: "file.ocx"; DestDir: "{sys}"; Flags: sharedfile |
Цитата:
|
Цитата:
Код:
!include "Library.nsh" Скрытый текст
![]() |
Доброго времени суток) Начал изучать NSIS и вот вроде все просто но не работает...
а именно: Код:
!include "RegistryFunc.nsh" Дико извиняюсь - невнимательность))) Цитата:
|
Заметил косяк или особенность:
Есть ветка 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 то получим "Ошибка: Не удается найти указанный раздел или параметр в реестре." Надеюсь разъяснил понятно))) |
Как заставить работать переменные $EXEDIR, $SYSDIR ? Если так указать то работает, но это не вариант.
Код:
!include "Library.nsh" |
Dodakaedr, они только так и работают...
!define SOME_CONSTANT "SomeApp" ${SOME_CONSTANT} ну или переменные Создание переменной вне секций и функций (в начале вашего кода) Var MyVariableName Создание переменной в секции или в функции Var /Global MyVariableName Пример: Function .onInit Var /Global MyVariableName StrCpy $MyVariableName "Значение переменной" FunctionEnd Взято из справки |
nfs911, так тоже не работает.
P.S. Все разобрался. |
Уважаемые, как убить процесс в системе...Использовал ProcessFunc.nsh, - не справился( возвр.зн.-2) Процесс убивается Анвиром...
|
Цитата:
http://nsis.sourceforge.net/KillProc_plug-in Если WinAPI, то TerminateProcess |
Цитата:
|
K.A.V., kotkovets, спасибо... Вопрос я задал потому, что на ХР, как я понимаю, нет особых заморочек с правами. Работаю под Администратором и все процессы, запущенные мной, разве не имеют равные права? Обратило на себя внимание именно то , что Анвир справляется с задачей, а скомпилированный в NSIS ехе_шник нет... А на памяти время и версия Анвира, который, также, не справлялся с этим процессом. Поэтому мне и показалось (смягчаю), что дело не в правах а в самой убивалке, что и породило мой вопрос. Можно ли считать, что все способы предложенные Вами имеют равные возможности, которые определяются только правами процесса или можно утверждать, что один способ эффективнее другого, при всех равных прочих условиях? Прошу не судить строго, - раньше, как-то, не возникала необходимость разбираться в этом вопросе... Еще раз, спасибо.
Попутно хочу спросить, как убрать из трея иконку убитого процесса, которая остается после убиения? |
Salmo,
Попробуй Код:
; RtlAdjustPrivilege - Включает или выключает привилегию у вызывающего потока или процесса. Только есть процессы , которым начхать на классические привелегии и права (к примеру, если "хозяин процесса" - TrustedInstaller... ) |
Цитата:
Код:
!include "WinMessages.nsh" Код:
StrCpy $1 0 |
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. |
ZaxBoys66,
Код:
!define BASS_LOC "$EXEDIR\bass.dll" |
Вложений: 1
Добрый день всем!
проблемка такая: при запуске инсталлятора собранного в NSIS на windows server 2008 вываливается сообщение от UAC(см.картинку) почему ругань идет на непонятный Set...tmp? как это исправить (если нажать дополнительно, то показывается путь к файлу инсталлятора) http://forum.oszone.net/attachment.p...1&d=1442837123 как убрать сообщение - известно, вопрос как его сделать корректным инсталлятор подписан цифровой подписью |
ZaxBoys66,
Не все версии bass.dll нормально работают с NSIS ! Используй последние версии с http://www.un4seen.com/ (я тестировал 2.4.10 и 2.4.11 ) |
Что я делаю не так?
файл test_lib.nsh Код:
!include "x64.nsh" Цель: В nsh файле присвоить к test_def1 разные значения в зависимости от разрядности -------------------------------------------------------- Решение: Код:
Section |
Цитата:
|
Добрый вечер, знатоки.
Столкнулся с необходимостью в деинсталляторе удалять только установленные инсталлером файлы, а не всю папку. И, неожиданно, выяснил, что не кривого способа вроде как и нет... Прочитал статью "Uninstall only installed files" на сайте разработчиков, попробовал и, понял, что нормально это не работает: К примеру, у меня копируется большое число файлов командой типа Код:
File /r "..\out\files" Да притом и папка не удаляется при деинсталляции. Неужели нет простого и лёгкого способа решить указанную проблему? Спасибо. |
Цитата:
|
Цитата:
|
Доброго времени суток...такой момент
Код:
;В данном случае ключ реестра не успевает импортироваться Код:
;===Вариант решения 1 Код:
;===Вариант решения 2 теоретически код возврата должен быть после импорта, но на практике видимо иначе :( |
Цитата:
А сколько это - много файлов? Знатоком не являюсь, но решал бы проблему "сложным" путем, т.е. записывал отдельно все свои файлы. Для облегчения воспользовался бы инструментом Add files to installation из HM NIS Edit и переделал бы полученный список под свои нужды. Любой текстовый редактор, тот же HM NIS Edit, быстро выполнит замену нужных кусков. Например, более 400 файлов в папках NSIS: читать дальше...
PHP код:
Не спеша ковырялся минут 5, не более. И еще непонятно, зачем вам удалять папку, которую вы не создавали? |
Цитата:
Воспользуйтесь исполнением regedit напрямую (хотя в документации к плагину сказано, что импорт также производится через regedit) Код:
ExecWait '$WINDIR\regedit.exe /s "путь к reg файлу"' Цитата:
Цитата:
2. Выполнять поиск файлов командой Locate в папке установки после распаковки всех файлов и создавать список в INI формате, записывая в файл, в денисталляторе обрабатывать файл и удалять файлы проходясь по списку. 3. Если используете графический интерфейс при установке, можно попробовать поковырять пример кода LOG-файл установки из нашего справочника, за место записи лог-файла парсить каждую строку на предмет типа команды, т.е. прочитали строку, в ней например такой текст: Код:
Создание ярлыка: C:\Program Files (x86)\Моя программа\explorer.lnk По этой же логике делаем с другими командами, создание папок, копирование файлов и т.д.... "резать" строку по количеству символов можно командой StrCpy |
Цитата:
спс за уточнение)) Было бы хорошо реализовать через System::Call "advapi32:: )))) Если найду время и желание - буду пробовать с помощью WinAPI реализовать... |
Спасибо, за советы!
К сожалению, на мой взгляд, всё это - костыли: скрипты, списки файлов, парсинг... :( Цитата:
|
Цитата:
|
Как записать путь в таком виде в реестре?
Код:
C:\PROGRA~1\PHOTOL~1\PHOTOL~1.EXE "%1" |
Dodakaedr,
Код:
""C:\PROGRA~1\PHOTOL~1\PHOTOL~1.EXE $\"%1$\"" |
Цитата:
Код:
GetFullPathName /SHORT $0 "$PROGRAMFILES" Протестируйте в общем Есть также WinAPI функция, делающая тоже самое Код:
StrCpy $0 '$PROGRAMFILES' |
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 |
Подскажите как изменить путь в скрипте при установке портативной и обычной версии программы .
|
ZaxBoys66, Спасибо огромное ! Буду пытаться прикрутить к своему скрипту.
|
Иногда в Windows x64 необходимо определить разрядность установленного приложения (исполняемого файла).
Причём, установленного не в $PROGRAMFILES64 или $PROGRAMFILES, что могло бы служить ориентиром разрядности. А ещё имя исполняемого файла одинаково и для x32 и для x64. Как тут быть ? :) Поможет функция GetBinaryType. Код:
OutFile "GetBinaryType.exe" |
Когда то рассматривалось, как определять дефолтовое приложение (путь и имя) для открытия определённых типов файлов с помошью функции FindExecutable.
Ту же операцию можно сделать немного проще с помощью функции AssocQueryString. Код:
!define ASSOCSTR_EXECUTABLE 2 Используя AssocQueryString , в Windows 10, для штатных интегрированных приложений получаем - C:\Windows\system32\LaunchWinApp.exe Возможно это связано с особенностями работы собственных приложений в новой ОС... Для автономно установленных приложений (например, для Хрома и т.д. ) - всё нормально. Как крайний выход из положения, в Windows 10 можно получить только имя дефолтового приложения, если использовать константу ASSOCSTR_FRIENDLYAPPNAME Код:
!define ASSOCSTR_FRIENDLYAPPNAME 4 |
Всем доброго времени суток! Имеется проблема решение которой затрудняюсь найти. В коде скрипта подключен плагин "nsArray". Массив полноценно, нормально работает при использовании его элементов. НО, при условии, что текст элементов написан на английском. Как только в элементе массива появляется русский текст, программа начинает крашиться, на этапе компиляции ошибок нет. Пробовал сохранять исходник в разных кодировках, безрезультатно. Сталкивался кто-нибудь?
nsArray::SetList MyArray "7-Zip" "Любой текст" "Adobe Reader" "Logitech Webcam" /end ${nsArray_ToString} MyArray $R9 |
Цитата:
|
Цитата:
![]() |
На Windows 10 выполняю
${WinVerGetMajor} $R0 ${WinVerGetMinor} $R1 StrCpy $R0 $R0$R1 В результате в $R0 = 62, что соответствует Windows 8... Как лучше определить, что юзаем десятку? |
Цитата:
Запускаю тот же скомпилированный скрипт с флешки - ОС Win10, почему то определяется как Win8 + прочие параметры восьмёрки... И как это понимать ? :) Сначала было даже смешно..., но как работать с флешки ? :) |
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" Цитата:
|
Т.е. - при запуске exe-скрипта с флешки из под Win10 и с помощью чисто GetVersionEx, и с помощью WinVer2.nsh - ошибочная версия ОС. (при запуске с флешки из под W7 и W8 - всё ОК)
При запуске с флешки из под Win10 с помощью WMI.nsh ( т.е. с использованием WMIC) - всё определяется правильно : Код:
;http://nsis.sourceforge.net/WMI_header Код:
OutFile "WMI_OperatingSystem.exe" PS StdUtils плаг - также правильно определяет параметры Win10, и с флешки и с HDD. (кстати, он обновился Version 1.08, released 2015-10-10 ) |
MKN,
Коды WMI работают, но нужно в какой-то переменной просто получить значение 10, а не полную версию Оси. Можно конечно отрезать, но это уже гемор дополнительный. |
Цитата:
Код:
System::Call "$R1->20(w'WQL', w'SELECT * FROM Win32_OperatingSystem',i48,i0,*i.R2)i.R7" |
Пример "географического" кода для определения параметров локализации
(используются функции GetUserDefaultLangID GetLocaleInfo GetUserGeoID GetGeoInfo ) : PHP код:
|
Да... Похоже для определения Windows 10 надо использовать новую функцию - IsWindowsVersionOrGreater
http://stackoverflow.com/questions/3...ect-windows-10 http://www.tek-tips.com/faqs.cfm?fid=7848 Осталось адаптировать эту функцию под NSIS... |
Вариант определения major и minor версий ОС с помощью функции NetWkstaGetInfo.
В Win 10 работатет (и с флешки тоже) Код:
OutFile WinVer-NetWkstaGetInfo.exe |
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} |
Цитата:
Цитата:
|
MKN,
Подкорректируйте пожалуйста код NetWkstaGetInfo для 2,46, с учетом замечания kotkovets, Цитата:
|
wolkow70,
Можно ещё проще, без канители с конвертированием. ( Я ведь такой код уже выкладывал в прошлом году... ) Код:
System::Call "netapi32::NetWkstaGetInfo(i0, i100, *i r0 r0) i.r6" Код:
!include LogicLib.nsh Работает в Win10 Код:
Outfile "OS-Info_test.exe" Жаль, что только до одного знака подверсии... Возможно можно как то подкорректировтаь... Также интересна функция System::Call 'ntdll::RtlGetVersion , работающая в Win10 Но с её синтаксисом я не разобрался... |
MKN,
Цитата:
DetailPrint 0x00000000 0.0 Completed |
Цитата:
|
Цитата:
|
Цитата:
|
MKN,
Собственно с вашего копировал... Код:
OutFile WinVer-NetWkstaGetInfo.exe |
wolkow70,
В примерах были разные переменные для версий. И во втором варианте НЕ нужно кода конвертации. Т.е. в итоге : Код:
OutFile WinVer-NetWkstaGetInfo.exe |
Объясните, пожалуйста, почему если указать в строке 'StrCmp $R0 "0"' 0 +5 сообщение показываеться, а если +4 то нет.
Код
Код:
outfile "test.exe" |
Цитата:
Код:
${registry::MoveKey} "HKCU\SOFTWARE\11" "HKCU\SOFTWARE\11_backup" $R4 Макрос в NSIS своеобразная "оболочка" для команд, в макросы можно заключить несколько часто используемых команд+удобно потом ориентироваться в коде Т.е. прописывая сроку с макросом, при компиляции эта самая строка может развернуться в несколько десятков строк (в зависимости от команд, которые прописаны в теле макроса) и, соответственно, при использовании всяких +2 +3 +5 прыжков на строку, которая прописана за макросом, может оказаться проблемой и вы получите нерабочий/не правильно работающий код Конкретно в вашем коде - макрос ${registry::MoveKey} содержит в себе 2 строки команд: Код:
!macro registry::MoveKey _PATH_SOURCE _PATH_TARGET _ERR Для решения этой проблемы либо создавайте метку и указывайте её в качестве цели "прыжка" (за место +4), либо еще лучше, пользуйтесь конструкциями с ${If} Код:
outfile "test.exe" |
У меня такой вопрос, как сделать перенос строки $\r$\n с помощью команды SendMessage $ListBox ${LB_ADDSTRING}?
Код:
${NSD_CreateListBox} 100 40 20% 12u "" |
Цитата:
Этот элемент представляет собой список строк, "однострочных строк" если можно так выразиться, никакого переноса там не может быть |
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 |
Подскажите, пожалуйста, какие есть способы шифровки\дешифровки файлов в nsis. Требуется зашифровать содержимое *.txt файла и *.reg файла.
|
|
NsisCrypt_plug-in для строк, не подходит
DcryptDll_plug-in вроде оно, но могу понять имеющийся там пример. Можете привести пример конкретно по шифровки\дешифровки txt, reg файлов? |
Dodakaedr,
См. пример http://nsis.sourceforge.net/NSIS_Ins...ion_Protection а также DcryptDllReadme.html Конкретно для шифрования строк может быть полезен плаг : http://nsis.sourceforge.net/Blowfish_plug-in |
Добрый день уважаемые... Для фильтрации зависших приложений всегда пользовался к\с - tasklist /fi "status eq not responding", но не везде есть эта утилита. Подскажите, пожалуйста, как на NSIS определять статус приложения, найти зависшее и сделать дальнейшие манипуляции с ним... Спасибо.
|
Цитата:
http://www.manhunter.ru/assembler/19...ilozheniy.html http://rsdn.ru/article/qna/baseserv/hungapp.xml |
Цитата:
Цитата:
Перечислить все окна в системе уже знаете как из справочника, если нужно получить список всех не отвечающих приложений Код:
findwindow $0 notepad |
K.A.V., Добрый день\вечер. кодик написал, скомпилировал, зависшие окна находит.... но теперь надо по дескриптору окна определить имя процесса\исполняемого файла...как? Не судите строго, я занимаюсь этим не регулярно и инфа в старых мозгах не держится... :sorry:
|
Цитата:
|
Да... Пожалели меня... А я все пользуюсь старой версией справки, нет чтобы посмотреть, что она обновилась...
|
Добрый вечер. Кто подскажет причину того, что при использовании примера из справки раздела Работа с процессами, 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 не всегда предсказуемо... |
NSIS 2.47 released December 8, 2015
http://sourceforge.net/p/nsis/news/2...-247-released/ |
|
А что у них за прикол обновлять вторую и третью версию НСИС?
Может кто знает чем отличаются 2.48 и 3.0b2? |
Цитата:
3.хх — полноценная поддержка Unicode. 2.48 и ниже — только ANSI. |
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: |
; 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 |
Цитата:
2.48 и ниже Юникод также поддерживают по полной и лучше чем 3.0 (!) 2.48 сейчас уже в юнике выйти должна.. Различия в версиях 2х и 3х, только в ориентире 3-й на УГ ОСи Мелкософта, Вин7, 8, 10... |
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." |
Эм. т.е. я по твоему не в официальном работаю 2.46.5 Unicode ?! :)
|
Наверное вся разница в том, что версии 2.46 - две: ANSI и Unicode
А версия 3 - одна, совмещающая обе кодировки + якобы адаптирована под новые ОС + учтены баги (выявленные) v2.46... |
Цитата:
Цитата:
|
Цитата:
Ибо, идём на страничку разрабов "оригинальной" версии Нсис, Project Members и видим на ней в числе разрабов этого товарища: Jim Park. А теперь идем на страницу репозитария Гитхаба для Юникодного Нсис: jimpark/unsis и наблюдаем там же в авторах, все того-же самого Джима. Очень странное утверждение, когда разраб один, а разработка сторонняя... |
Цитата:
|
Натолкнулся на статью : Почему вам (никогда) не следует использовать ShellExecute и WinExec
http://www.gunsmoker.ru/2015/01/neve...llExecute.html Вот те раз... Цитата:
|
Цитата:
Такое ощущение, что автор застрял в каком-то прошлом типа 90-го года, тогда был программистом, а потом уснул, проснулся тем же программистом в 2015 году и написал сразу же статью, чтобы предостеречь современных прогеров от использования WinExec в своём коде Цитата:
Windows 95 - современная Цитата:
|
Цитата:
System::Call 'kernel32.dll::WinExec(t "$EXEDIR\My.bat", i 0) i.r0' И ведь работает... :) |
Цитата:
В винде куча функций типа WinExec, которые давно устарели и существуют только в целях совместимости при переходе из оси в ось Цитата:
Код:
execshell open "$desktop\1.bat" "" SW_HIDE |
Please help my with this script
How can I synchronize percentage at the same time progress bar. |
ZaxBoys66,
Use http://nsis.sourceforge.net/Inetc_plug-in Цитата:
|
Друзья! Вот такой к вам вопрос:
Можно ли добавлять кликабельные ссылки в MessageBox ? Например всплывает мессадж с ошибкой и там ссылка на страницу с подробным описанием ошибки и методами её исправления. |
Цитата:
Но, можно сделать собственный MessageBox - окно нужного размера, с кликабельными ссылками, с нужными элементами управления и пр. содержимым. Можно использовать messagebox plugin, скомпоновав messagebox таким образом, чтобы в нём был и нужный текст и кнопка(и) с надписью-ссылкой, кликнув которую, открываешь нужную страницу. Или, самое простое - обычный MessageBox , с текстом-описанием ошибки и заключительный вопрос : "Открыть такую то страницу для детальной информации об ошибке ?" + кнопки "Да" "Нет" |
Цитата:
http://nsis.sourceforge.net/MessageBox_plug-in как я понимаю автор сам удалил свою разработку... |
Вложений: 1
Serg866,
С третьей плагин работает. |
Собственные MessageBox (с кликабельными ссылками и пр.) можно делать с помощью DlgHost Plugin_а
http://nsis.sourceforge.net/File:DlgHostPlugin.zip Пример : PHP код:
Содержимое DlgHost.nsh включено в код. |
Вопрос имеется.
Есть ли какая-то специфика в создании ярлыка для раб стола и меню пуска, и прикручивании к нему определенной иконки ?! Ибо сделал у себя работает у других нет. :dont-know |
Цитата:
CreateShortCut "$DESKTOP\Your Program.lnk" "$INSTDIR\Your Program.exe" "" "$INSTDIR(or FullPatch)\myicon.ico" Ну, и конечно при необходимости : SetShellVarContext all или SetShellVarContext current |
Цитата:
|
|
Цитата:
|
Привет народ,
Подскажите где разжиться файликом определения венды последней версии для ЮТФ8 или 16 ЛЕ? И напомните плиз, как запустить консоль без вывода ее окон, помню что где-то было это расписано, даже делал раньше но в справке ни нашел.. Спасибо. |
Цитата:
|
Цитата:
А с первым вопросом не подскажешь что и как ?! Ибо у меня со старым файлом что-то компилится не желает под юником... :dont-know Особо интересует Вин 10 и определение архитектуры винды. |
MaGoth, я с юникодом вообще не работал (и пока не собираюсь), так что по вопросам данных сборок я ничего подсказать не могу
|
Как программно обновить информацию об ассоциациях?
|
Ребят, всегда мне помогаете с решением вопросов по инсталлеру.
Спасибо вам! Ещё одна задача у меня возникла: нужно сделать проверку на размер файла, т.е не хеш-сумма, а именно размер по байтам. Соответственно если размер совпадает - продолжение установки, если нет - прерывание. |
Цитата:
Как вариант либо писать свои messagebox (ну типа плагином показывать свои сообщения со своим текстом на кнопках), либо ковырять исходники NSIS... Цитата:
Если вы про "обновить значки" в системе после манипуляций в реестре, чтобы файлы с новым зарегистрированным расширением приняли описание файла/нужный значок - то может быть вам нужна команда Код:
${RefreshShellIcons} Код:
!include "FileFunc.nsh" Цитата:
GetSize + StrCmp для сравнения с другим размером Код:
${GetSize} "$windir" "/M=explorer.exe /S=0B /G=0" $0 $1 $2 |
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 |
Цитата:
Я видел этот пример в справке, но не сразу разобрался как его для себя адаптировать. Получился такой пример кода секции: Код:
Section |
K.A.V.,
Цитата:
|
Цитата:
Впрочем у меня сейчас другая проблема нарисовалась, решил изменить ини файл и поймал болт на выходе.. Пример кода: Код:
ReadINIStr $0 "$INSTDIR\System\Gothic.ini" "[ENGINE]" "zTexCacheOutTimeMSec" или при использовании Энума: Код:
EnumINI::Section "$INSTDIR\System\Gothic.ini" "[ENGINE]" Кусок кода из ини файла для тестов: Код:
... Цитата:
Цитата:
Ибо у меня все стандарное используется и все на мультилангах работает, пример: Код:
... |
Цитата:
У вас: Код:
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" |
Цитата:
|
Цитата:
Сейчас проверим в работе.. |
Цитата:
Здесь скорее всего проблема не в этом, а в том что сам инсталлер подстраивается под язык винды(об этом забывать не стоит). Например, если вы запустите свой инсталлер в немецкой/английской Винде, то должны увидеть, что эти мессаги сменятся на язык установленный по уполчанию в системе, их не требуется переводить. :yes: За исключением случаев, в которых вы наклепали своих именований для кноп, но с этим я не парился, поэтому ничего не скажу... :dont-know |
Цитата:
Адаптировал одну прогу на 8 лангов, все в ЮТФ 16-ЛЕ, по умолчанию знаю, что все тексты хоть врознь, хоть в кучу будут корректно отображаться на экране. Запускаю польску прогу и вижу кучу ????? Оказалась проблема в том, что винда по своему некоторые функции мультиланга обрабатывает, не зависимо от того что я хотел бы видеть, но при этом, все тексты корректно отобразились у поляка на компе.. Короче, тут надо реально тестить и смотреть как оно отображается на компе у носителей языка, ну, ли брать в руки бубен и переписывать все это хозяйство под себя. Но я лично с этим заморачиваться не стал, забил бол на это дело. Что и тебе советую... :yes: |
Цитата:
Загляните в исходники NSIS и разочаруйтесь в нём раз и навсегда, все (ну или почти все) команды, доступные в NSIS - это API функции (конечно же, если речь ведём про Windows), по вашему мнению получается, что весь NSIS это один сплошной недостаток, т.к. NSIS юзает для функционала команды из библиотек системы. Я, например, не считаю это каким-то недостатком, что NSIS работает с API, т.к. в этом его уникальность и гибкость, к NSIS можно без труда наклепать плагин для расширения функционала и он будет работать, чего нет "из коробки" - разраб может допилить функционалом через плагин или даже с помощью system-плагина, если нужно не что-то сильно навороченное Как ни странно, но на NSIS можно писать не только инсталлеры, но и приложения, правда это всё выглядит не очень удобно и функционально, если проект серьёзный Что касается стандартных текстов на кнопках сообщений - юзается api функция MessageBox и да, никакие строки в NSIS-коде не заставят эту функцию показывать текст в зависимости от языка инсталлера, т.к. текст зависит от языка системы пользователя Почему не стали писать свой функционал кнопок? А зачем? Какой смысл усложнять код и извращаться с кастомными кнопками в NSIS? В таком виде пользователю хотя бы всегда будет понятно, на какую кнопку он жмёт - Да или Отмена, а не что-то начирканное кастомное писателем инсталлятора, который не дай бог написал свой первый инсталлер и залил его в сеть |
Цитата:
В чём проблема... И при SilentInstall_е всё работает, если внятно поставить задачу... ps К слову, о гибкости NSIS. Сам NSIS + Plugins + необходимые дополнения - и можно сделать практически всё, что душе угодно. :) Лучше нет ни одного подобного инсталлятора, тем более бесплатного... (разве что Inno на пятки наступает... ( но тут уже виноваты ленивые разработчики NSIS и не менее ленивые пользователи_nsis_программеры, которые упорно не хотят улучшать и расширять функционал NSIS :) ) |
Почему-то некоторые антивирусы ругаются на инсталлеры НСИС. Авира и Аваст.
|
Цитата:
Обычное дело для антивирусов , не блещущих интеллектом... :) Тут поможет только проверенный способ - добавить "угрозу" в исключения антивируса. Но ничто не поможет, если у пользователя параноидальный страх преред любым сообщением антивируса... :) |
Доброго времени суток господа. Подскажите пожалуйста по вопросу решение которого пока не удается найти. Суть в следующем. Есть несколько nsi скриптов, главный выступает в роли интерфейса с кнопками и некоторым небольшим функционалом, также есть отдельно написанные nsi скрипты, которые я вызываю через exewait из скрипта-интерфейса. Вопрос в следующем, можно ли как то эти отдельные скрипты сразу включить в основной? По принципу подключения плагинов или nsh файлов? Т.к. хочется иметь на выходе один Exe, а не 4 например. Я конечно понимаю, что можно все в один код попробовать перенести, но это осложняется суммарно большим количеством кода, переменных, функций и соответственно большими временными затратами на отладку. Хотелось бы найти более практичный метод. Заранее спасибо.
|
Помогите, пожалуйста, написать правильный код поиска ключа. Пытался что-то из примера из справки сообразить, но честно говоря не до конца понимаю тот пример. Задача состоит в том чтобы найти ключ по его части имени.
Скрытый текст
Код:
outfile "test find key.exe" |
Есть какой-то макрос получения ID элемента чужого окна? При запуске чужой программы ID элементов постоянно меняется(в моем случаи id кнопок постоянно разные при запуске чужой программы). Или подскажите, пожалуйста, какие есть еще способы получения хендла кнопок, кроме как GetDlgItem?
|
Цитата:
Пример: Основной файл скрипта Код:
!include "MyFile.nsh" ; инклудим файл, который лежит рядом с основным скриптом, из этого файла вызовем функцию Код:
var myvar Цитата:
Цитата:
Какая задача перед вами стоит? Что требуется делать с кнопками? |
K.A.V.,
Цитата:
|
Dodakaedr, прочитайте в оригинальной справке к NSIS описание команды FindWindow, юзать winapi не обязательно, вам нужно будет написать цикл while и в команде поиска окна указывать в качестве родителя предыдущее найденное окно. Попробуйте написать код сами
|
Dodakaedr,
Цитата:
При меняющихся ID элементов, можно как вариант, скинуть все найденные ID в переменную, а потом, выбирать нужный ID, исходя из порядкового номера элемента. |
Подскажите еще по такому вопросу. Использую плагин NsisCrypt, при шифровании - дешифровании текста, на моем ПК приложение работает корректно. При запуске его на других ПК появляется ошибка "Error while acquiring Windows CryptoAPI context". Вроде как есть решение, есть баг репорт, но совершенно не пойму как его использовать. Был бы очень благодарен если поможете разобраться.
https://sourceforge.net/p/angabin/bugs/1/ |
lavey13,
Похоже, это баг самого плагина. уже обсуждалось : http://stackoverflow.com/questions/1...t-on-all-but-d там же, вроде как и предложен фикс для NsisCrypt.cpp |
MKN, то есть нужно брать код этого фикса, заменить в исходнике NsisCrypt.cpp и скомпилировать весь проект плагина в dll?
|
lavey13,
получается, именно так... |
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..."' |
Хм. народ вопрос имеется по ини-шкам..
Все правится меняется это хорошо, одна бяда, строки уезжают в конец секции. Как внести изменения в файл без танцев с бубнами и переездом строк на новое местоположение ?! Кусок примера инишки значения параметров которые надо изменить.: Код:
[ENGINE] |
Dodakaedr, я персонально в личке никому не отвечаю по NSIS, зачем тогда нужен форум?
Я же вам тут написал, при поиске указывайте в качестве родителя предыдущее найденное окно и прочитайте описание команды FindWindow в оригинальной справке, я же не просто так это всё написал. Ну, а раз вам перечисление не нужно и текст на кнопке не меняется, то вам и цикл не нужен Ваш код должен быть таким: Код:
FindWindow $0 "" "ИМЯ ОКНА ПОДСТАВЬТЕ сами, модеров форума не хочу смущать :)" При указании 3-го параметра в команде FindWindow, мы заставляем искать наши кнопки в конкретном окне-родителе, т.е. в окне вашего приложения Если не понимаете суть родительских-дочерних окон и как это всё устроено - советую почитать инфу на просторах интернета, чтобы было понимание, как всё это дело в винде устроено |
K.A.V.,
FindWindow [HWND] [Class] [Title] работает почему то далеко не со всякими окнами... Есть окна (особливо в некоторых кейгенах), где даже с элемента на элемент нельзя переместиться никакими силами (ни конкретным указанием на, как будто найденные параметры элемента, ни эмуляцией нажатий стрелок, Tab_а и пр.) |
Цитата:
Насчет перебора допустим, кнопок, вот вам код, как это должно выглядеть, может кому пригодится Пример на поиске кнопок и определения их текста в окне MakeNSISW (GUI-комплиятор в папке NSIS) Скрытый текст
Код:
!include "LogicLib.nsh" Пример на поиске кнопки "Close" в MakeNSISW (GUI-комплиятор в папке NSIS) Скрытый текст
Код:
!include "LogicLib.nsh" |
Подскажите, существует ли плагин или макрос по работе с фаерволом (добавление, удаление и проверка правил)?
|
K.A.V.,
- Поиск нужной кнопки по тексту на кнопке, не годится для случаев, когда никакого текста нет... Т.е. когда на кнопке - скин-картинка с текстом (OK, Cancel и т.п. ). Такое встречается очень часто. Особенно в окнах, назовём их тактично, так : "продуктов сопровождения для разных приложений" :). Там же , как правило, отключены и табы и др. Нужно поизгиляться для перемещения между разными элементами (комбобоксы с выпадающими списками, разные текстовые поля, кнопки и пр. ) Такие "приложения" - отличный полигон для изучения-применения возможностей NSIS :) А ещё, совершенно не понятно, как с помощью NSIS можно кликать кнопками в окнах с IEFrame (в инсталляторах Corel и др ). Для AutoIt для этого вроде как есть специальная библиотека. чего делать в NSIS, не ясно... Цитата:
http://nsis.sourceforge.net/LiteFirewall_Plugin или использовать команды из скрипта : http://webistore.ru/administrirovani...andnoj-stroke/ |
Парни, вас приветствует Serg866.
Возникла нестандартная задача, нужно проверить содержимое текстового файла. По принципу: если есть фраза "version1.1", то один путь установки, если нет - другой путь. Может примерчики скинете какие-нибудь? В справке только пример как заменять текст в текстовиках... |
Цитата:
Тут посмотри => http://nsis.sourceforge.net/WordFind И в теме тоже были примеры использования ${WordFind}. |
Цитата:
работает и с ANSI и с UNICOD |
Спасибо, господа!
Не хотелось бы плагины подключать сторонние. Обычно я делаю это только если нельзя решить задачу стандартными средствами НСИС. Но ${WordFind} что-то сложная штука. Мне непонятны опции. Задача искать заданное слово во всём текстовом файле, независимо ни от количества строк, ни от чего. Какой параметр надо для этого задать я не пойму. Что означают параметры +2}}, +2*}, -02, E+1{ и т.д. |
Цитата:
Цитата:
Как-то так... Код:
Section |
Цитата:
Что за проблема, добавить к имеющейся куче "боксовых" плагинов - ещё один или столько, сколько надо, и писать в скрипте одну-две строчки , вместо полутора десятков... ps Как вариант, можно так : PHP код:
|
BuZzOFF, MKN
Ещё раз спасибо, всё разжевали мне. P.S: нашёл ещё такой вариант http://nsis.sourceforge.net/Search_for_text_in_file ------------------------------------ единственная проблема: если текстовик большого размера (5 мб например), то инсталлер виснет... Может быть есть решение специально для больших текстовиков? |
Цитата:
Для больших файлов можно использовать изврат с плагином nsisFile. Искать HEX значение искомой строки , "внутри" файла (version1.1 - берём в шестнадцатиричном виде). Находит пулей. |
Цитата:
Дело, в общем то, не в размере файла, а в количестве строк, давно всем известная проблема NSIS - он не может с одинаковой скоростью читать каждую строку по мере сдвига от начала, говоря простым языком - при использовании команд типа LineRead происходит замедление скорости чтения в зависимости от позиции читаемой строки Попробуйте написать код с отображением порядкового номера читаемой строки и вы увидите, сколько примерно строк NSIS будет читать без понижения скорости |
Цитата:
Попробую nsisFile, благо там есть юникод-версия плагина. То есть надо определить хекс-значение заданной фразы и прописать это значение, используя nsisFile::FileFindBytes ? ----------------------- |
Цитата:
P.S: я почему подумал что завис инсталлер - в диспетчере задач процесс стал жрать большое количество ресурсов и я его вырубил. |
Цитата:
Либо используйте другие баннеры типа Nxs plug-in Пример с баннером при поиске файлов: Скрытый текст
Код:
!include "WinMessages.nsh" |
Цитата:
|
Дорогие знатоки NSIS и конечно маэстро K.A.V., хочу у вас проконсультироваться относительно файла hosts
То, что мне нужно описано вот в этом примере : http://forum.oszone.net/post-2507451-1625.html А вопрос следующий: как такую операцию с изменением файла hosts проделать "втихарца", чтобы ни антивирусы, ни сама система не ругались? Ведь файл-то системный и по сути один из ключевых... И сопутствующие вопросы - имеет ли значение версия системы 32-битная или 64-битная? И важен ли тут атрибут RequestExecutionLevel admin, который прописываю в скрипте? Ну и быть может есть альтернативные способы как заблокировать доступ к сайту с помощью NSIS (без редактирования файла hosts)? Заранее спасибо, коллеги. |
Цитата:
Цитата:
Насчёт ругани антивирусов - это уже сам пользователь пусть укрощает "дурость" своего антивируса. Против дури лекарства нет... :) |
Цитата:
Ну а как получить доступ? Недостаточно того что инсталлер запускается из под администратора? Цитата:
Обычно сразу закрывают прогу и спешно удаляют её. NSIS Simple Firewall Plugin не поддерживает юникод, а мне нужен юникод LiteFirewall Plugin вроде не может добавлять блокировку сайта. Команды из скрипта я не разобрал, но там сразу написано что документация для всех новых систем. А мне надо чтобы и в XP тоже работала блокировка сайта. |
Цитата:
Цитата:
Цитата:
Если с Firewall_ами не получается, используй записи в hosts. ps Попробуй запускать из скрипта - Hosts Commander Это гораздо лучше, чем горожа из NSIS кода. http://code.google.com/archive/p/hostscmd/ http://habrahabr.ru/post/109180/ |
Цитата:
Hosts Commander вроде подходит. Но опять же как на него реагируют системы старше XP и основные антивири. Бьют тревогу или нет. Может кто юзал? upd: почитал комменты на хабре. Не буду юзать... |
Цитата:
Зря я эту ссылку дал... |
Цитата:
Получается нет "бесшумного" способа подправить файл hosts. И вообще в целом блокирнуть адрес сайта, не нарвавшись на УГ-антивири, UAC и прочую фигню. Просто есть один говёный сайт, ворующий мою программу... Они устанавливают прогу, модифицируют её и перепаковывают. Мне это не нравится. И я хотел всем своим юзерам к этому сайту доступ закрыть. Но значит не судьба. |
Цитата:
"Отобрать" файл 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 ... ), Зачем придумывать проблемы, когда всё давно уже решено... :) |
А этот плагин может задать брендмауэру блокировку сайта?
Он юникод поддерживает. Только я не понимаю какое правило использовать http://nsis.sourceforge.net/LiteFirewall_Plugin |
Serg866,
У LiteFirewall Plugin всего два правила : Добавление приложения в список исключений брандмауэра Windows - liteFirewall::AddRule Удаление приложения из списка исключений брандмауэра Windows - liteFirewall::RemoveRule |
MKN
Ну окей, тогда с помощью этого плагина как задавать блокировку сайта? Может ради этого на ANSI перейду. http://nsis.sourceforge.net/NSIS_Simple_Firewall_Plugin Плохо что в справочнике нет ничего на эту тему. |
Цитата:
Simple_Firewall_Plugin похоже не блокирует отдельные сайты. Детально не изучал... А почему разонравился способ редактирования HOSTS ? :) Нужный адрес добавляется без проблем. Ессно, ничего не получится, если hosts защищён антивирусом. Поэтому и надо, перед установкой твоей программы - сообщить пользователю, что делать ! Т.е. , если установлен антивирус, определить какой это антивирус, и дать пользователю в сообщении пошаговые рекомендации, как в настройках антивируса проверить, включена ли защита hosts, и как её отключить. Хорошо бы для каждого типа антивируса - своё сообщение. Или хотя бы для нескольких основных антивирей. (Можно сделать и для всех, не велик труд, и на будущее пригодится. ) :) Или в readme программы указать (пример из какой то проги) : Цитата:
Код:
;http://nsis.sourceforge.net/WMI_header Можно обойтись и без WMI.nsh. Просто использовать в скрипте команду для wmic. |
Я такой скрипт не потяну. Очень много всего надо определять.
И плюс результат всё равно не стоит свеч. Один фиг у людей будут антивири ругаться. Одно дело, когда какой-то левый антивирь срабатывает у 2 человек из 100, а тут у каждого второго будет срабатывать. Слишком рисковано... |
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 |
Какие требования предъявляются к bmp-изображениям, чтобы на создаваемой nsDialogs страничке их (изображений) фон был бы прозрачен?
|
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. |
Есть такой макрос
Код:
!define ANSIToUTF8 "!insertmacro ANSIToUTF8" Вопрос снят. Нашел Utf8Converter |
Вложений: 1
Помогите, пожалуйста, разобраться с ini файлом. Не определяется секция и при записи нового значения создается дубль секции.
|
Dodakaedr, NSIS не умеет работать с INI-файлами в кодировках отличной от ANSI. А ваш файл INI имеет кодировку UTF-8. По этой причине и получается ошибка. Воспользуйтесь плагином Unicode для преобразования кодировок. Примерный код сценария будет следующий:
Пример сценария
Код:
# Обработка INI-файлов кодировке UTF-8 Рекомендую ввести дополнительные проверки как, например, наличие самого файла INI и результатов конвертирования. К сожалению, оба используемых плагина сделаны в редакции ANSI, поэтому пользоатели NSIS Unicode оказываются в пролёте. |
Цитата:
|
А возможно как то отключить автоматический detailprint таких команд как rename и delete?
|
Привет.
Нужно реализовать такую функцию: проверка подключения к интернету и если подключение активно, то автоматически открывается браузер и переходит на заданный url Пожалуйста помогите реализовать эту задачу. С уважением, Serg866 |
Цитата:
Код:
Dialer::GetConnectedState если нет, то в в $1 - offline Можно также использовать (но совершенно ни к чему) : ; http://msdn.microsoft.com/ru-ru/libr...(v=vs.85).aspx Код:
System::Call 'wininet.dll::InternetGetConnectedState(*i .r0, i 0) i.r1' |
MKN. Красава! То что надо.
С проверкой я понял, а команду для открытия url как прописывать? если что у меня в скрипте один url уже есть (линк на созданной странице) |
Цитата:
Код:
ExecShell "open" "http://nsis.sf.net/" |
Коллеги, попутно ещё такая задачка.
Надо прописать удаление с раб.стола папки, в имени которой есть пробел и плюс название на кириллице. Условно это вот так выглядит RMDir /r $DESKTOP\Моя папка И конечо не работает, ругается при компиляции из-за пробела. |
Serg866, вот так удаляет:
RMDir /r "$DESKTOP\Моя папка" |
В справочнике, в разделе "Работа с реестром" есть макрос ${StrToHex} "строка" $var - Конвертирование строки в HEX.
Не подскажите, как сделать наоборот конвертирование HEX в строку, или ${HexToStr}? |
Цитата:
${registry::HexToStr} "[hex_string]" $var И ещё когда то kotkovets, приводил такой код : Код:
конвертация 16-ричное число в десятичное, десятичное в ASCII |
Подскажите, пожалуйста, в чем проблема? Почему если в конце ключа реестра стоит цифра то этот ключ пропускается? Для большей понятности:
Скрытый текст
Код:
outfile "test find key.exe" |
Цитата:
Код:
OutFile "test find key.exe" |
Цитата:
Скрытый текст
Скрытый текст
![]() Код:
OutFile "test find key22.exe" |
Цитата:
В частности, подозрение вызывает "UserVars" в составе ключа. |
Вложений: 1
Есть плагин от K.A.V. для установки прозрачности окна инсталлятора - для примера код:
Скрытый текст
Код:
!include "MUI2.nsh" Прозрачность работает, но после нажатия кнопки "Обзор" transparent плагин перестаёт работать. В чём может быть проблема? |
|
Цитата:
|
Подскажите, как поместить видео в собственное окно на кастомной странице ?
код, в котором это не получается... (видео окно рядом с кастомным) : Код:
!include MUI2.nsh |
Цитата:
Код:
!include MUI2.nsh |
K.A.V.,
Я ведь специально убрал style child из кода, т.к. с ним видео не было и в помине. А без него было, рядом в отдельном окне. И сейчас скомпилил , запустил - нет никакого видео ! Но, совершенно случайно подвинул окно в сторону - и видео появилось. Т.е. , пока не подвигаешь окно - видео нет. Что за чертовщина ? |
Цитата:
|
Цитата:
Приблизительно такой же эффект разбирался здесь : http://rsdn.ru/forum/media/340319.hot Было ли решение, не ясно... |
Всё не оставляю попыток изменить файл hosts без ругани самой системы и антивирусов.
Как думаете, можно воспользоваться методом, описанным здесь? http://www.cyberforum.ru/cmd-bat/thread859941.html |
Расшифровываем 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 . nsURI::encodeURI nsURI::encodeURIComponent nsURI::decodeURIComponen |
|
trobbobsom, добавьте это
Код:
Icon "icon.ico" |
Цитата:
|
Подскажите, пожалуйста, какая противоположная команда этой:
Код:
rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 .\elfPr.inf |
Цитата:
Код:
ExecWait "$SYSDIR\rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\elfPr.inf" |
Painkiller, Нет, имеется ввиду удаление. Команду которую я привел использую для установки драйвера, а вот противоположную команду не нашел(для удаления, если такая существует).
|
Цитата:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultUninstall 132 path-to-uninstall-dir\infname.inf |
MKN,
Цитата:
|
|
Знаю есть команда обновления иконок (${RefreshShellIcons}), а обновление трея есть? Иконка зависает в трее.
|
Dodakaedr, пролистайте пару страниц темы назад, я давал пример кода недавно
|
Цитата:
Код:
StrCpy $1 0 |
Никто не решил проблему неправильного oпределения версии Windows 10 в WinVer2.nsh (от kotkovets) при запуске скрипта с флешки ?
(вопрос уже поднимался http://forum.oszone.net/post-2567002.html) |
MKN, можно хекс-редактором поменять в манифесте makensis.exe висту на вынь10
https://msdn.microsoft.com/ru-ru/lib...(v=vs.85).aspx |
Цитата:
Что то не находится такое... ![]() может не так ищу... И что мешает сделать такую правку разрабам ? |
MKN, ищите вот это: {e2011457-1546-43c5-a5fe-008deee3d3f0} и меняйте на это: {8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
Во всяком случае, в юникодовой версии 2.46.5 помогло. Да, с флешки определялась как 6.2, а после фикса стала 10.0 |
Цитата:
|
MKN, в третьей RC1 нормально работает, кстати, там прописано всё.
|
Цитата:
|
Третья версия вообще хороша, но её не приветствуют китайские антивирусы, портя статистику на онлайн-сканерах типа Virustotal. Ругаются даже на скомпилированные файлы примеров, не говоря уже про что-то более серьёзное. Писал в саппорт с примером видео - тишина..
|
Плиточный интерфейс (как в Windows 10) на собственной странице
![]() Такой фейс можно сделать с помощью SkinButton.dll Скин представляет собой PNG файл, состоящий из четырёх отдельных изображений, слитых воедино. Сверху вниз : 1 - исходный вид кнопки 2 - на кнопку наведён указатель мыши 3 - кнопка нажата 4 - кнопка не активна Комплект для примера TI-Test.zip во вложении Чтобы не возиться с рисованием кнопок, сделал скин-генератор : http://rghost.ru/private/8XSNhhbWz/7...53c703d6ecf437 Как работает - всё очевидно из фейса. ![]() Ессно и скины и скин генератор каждый может переделать как угодно и как позволяет фантазия... :) |
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 |
Подскажите как правильно задать условие для работы инсталлятора? Нужно чтобы он запускался только от 7 и выше.
|
Цитата:
2. Собственно, задать условие в функции .onInit, например так: (в переменной $OS хранится номер версии) Код:
${IfNot} $OS == "6.1" ; Windows 7 |
Begin2Fly, благодарю. Если так указать
Код:
${If} $os < "6.1" ; Windows 7 |
Dodakaedr,
Код:
!include "WinVer.nsh" |
Вложений: 1
Представляю Botva3.dll. Переделана из Botva2.dll, и переименована, дабы не путаться. Для оригинальных функций сделаны функции обертки( для комфортной работы с nsis ) + чуть чуть переписан код.
Желательно потестить более сведущим в nsis нежели мне. В архиве либа + пара примеров |
|
Парни, чет не пойму...
вставляю в код Код:
!define MUI_ICON "путь к иконке" Код:
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" компилю, все без проблем, а значок стандартный .... ____________________________________________________ вот... нашел Icon "D:\YandexDisk\DELPHI\ICO\Vista_Icons\Alerts\Alert 10.ico" |
Здравствуйте. Подскажите, пожалуйста, можно ли заблокировать один из элементов ListView?
По типу "EnableWindow $var 0". Чтоб отображался, но был не кликабельным... ![]() Пытался загуглить, но ничего не нашёл. |
NSIS Script Generator
I created a script generator for NSIS ansi and I hope to be useful to users. ![]() |
Подскажите почему установленная программа определяется как 32bit, хотя реально установлена 64bit. Проблема nsis или надо что-то дописывать?
|
DeDyJIR, информацию для деинсталляции надо записывать в соответствующий раздел.
SetRegView 64 поможет, прочитайте в справочнике. |
Круглые разноцветные кнопки.
![]() Делаем их с помощью уже известной SkinButton.dll (см. тему выше) Только меняем рисунки в png скине : ![]() На самом деле, кликабельная область - квадрат, но благодаря прозрачности PNG мы видим круг. (Единственное, кнопки не нужно делать большого размера и соблюдать пропорции.) Генерировать скин с кругами можно таким же образом, как и с прямоугольниками. Только используем соответствующую команду ImageMagick, которую можно добавить в скин генератор. |
Вложений: 1
Коллеги, моё почтение.
Разбираюсь с паролем на инсталлятор. Вроде всё работает как надо, кроме кнопки Отмена. Ну то есть при нажатии "Отмена" диалог должен закрываться, а он выдаёт текст из MessageBox MB То ли конфликт какой у плага с MessageBox, то ли лыжи не едут. Использую плагин для третьей версии NSIS. Прицепляю его тоже к посту. Задача как понимаете чтобы при клике на отмену - диалог закрывался вообще без появления мессаджбокса. Спасибо за помощь. Код у меня такой (гибрид примера из плагина с примером из справочника) Код:
!include "LogicLib.nsh" |
Цитата:
Код:
Код:
!include "LogicLib.nsh" |
How can color ComboBox?
How can color ComboBox control with the same color as the window? I tried but it does not work SetCtlColors |
ZaxBoys66,
Похоже, что тебе ответили на http://forums.winamp.com/showthread.php?t=398803 Особенно забавно :) : Цитата:
|
Подскажите, пожалуйста, имеет ли значение версия nsis для работы этого примера из справки?
Код:
!include "MUI2.nsh" |
Цитата:
Для замены текста в файле нужен другой код. Примеры есть в теме. |
MKN, каким должно быть содержание файла file.txt чтобы заработал пример?
|
Dodakaedr,
Не пойму, где всё-таки надо произвести замену ? Если в файле, то нужен другой код. Если в переменной, то проще такой код : Код:
!include "MUI2.nsh" то после выполнения кода в $R1 будет : bla-bla-bla www.counter-strike.net |
Цитата:
Скрытый текст
![]() |
Цитата:
![]() Для UNICOD используй функцию FileReadUnicode или, что ещё лучше, соответствующий плагин. Цитата:
|
вопрос к знатокам правильный или нет синтаксис проверки 2х значений
Код:
.... |
Ребят, подскажите как исправить ложный детект антивирусов установщика NSIS, провел кучу экспериментов, тупо на пустой инсталл три детекта, все время одни и те же пассажиры недовольны:
Bkav HW32.Packed.3558 20161125 McAfee-GW-Edition BehavesLike.Win32.Dropper.hh 20161125 Qihoo-360 HEUR/QVM20.1.0000.Malware.Gen 20161125 Как это обойти? Может есть какие то упаковщики, протекторы или еще какие то варианты? |
Цитата:
Из личного опыта общения: Qihoo-360 - работают оперативно. Обычно отвечают в течении суток; :good: McAfee-GW-Edition - реагируют в течении месяца, может и более. Вообще у них политика - ты должен быть их клиентом, купить подписку и зарегистрироваться на их сервисе. Короче клиентов они обрабатывают в первую очередь, всех остальных в порядке живой очереди; :read: Bkav - вьетнамская антивирусная лаборатория. До них я так и не достучался, то ли английского не понимают, то ли гуглоперевод на вьетнамский. :insane: Если часто собираешь несколько различных инсталляторов (не один или два в месяц), то естественно никакого терпения не хватит воевать с ложными срабатываниями. Поэтому, например, попробуй использовать UPX, но не последней версии (3.09.1!), а, например, 3.08. Я остановился на версии 1.20, не всегда, но в большинстве случаев помогает. Также разный результат получается при установке различных режимов компрессии (ZLib, BZip2, LZMA), отключение Админправ, а также изменение других параметров инсталлятора. Но если инсталлятор действительно содержит какую-то заразу, то вряд ли удастся её замаскировать. |
Flix судя по поиску в гугле история с некотороми антивирусами не новая, а очень старая, и до сих пор не профиксена...
|
Подскажите, пожалуйста, как сделать...
К примеру, есть текстовый файл со списком программ и версий. Файл этот хранится в интернетах и обновляется разработчиком с выходом новых версий. Код:
"Название №1"; "Версия: 1.0" Как отфильтровать так, чтоб добавлялась только последняя версия каждой программы. Никак не могу сообразить... |
|
|
Цитата:
Код:
Camera Raw CC 9.6 win32 Код:
OutFile NewVerFilter.exe |
MKN, спасибо, конечно. Но это всё же немного не то...
Как я понимаю это будет работать только если известно кол-во приложений в списке. Цитата:
Цитата:
|
Цитата:
Т.е. - есть список с непредсказуемымм составом и количеством приложений. Читаем его и создаём временные файлы одноимённых приложений. Далее с этими файлами работаем. Это будет ещё проще, чем "загонять" данные в переменные. |
MKN, спасибо за наводку. Я куда-то не в ту степь думал... Всё оказалось проще.
Ток не файлами сделал, а с nsArray. Но принцип тот же. |
Цитата:
Даже есть пример - nsArray_VersionSort.nsi на http://forums.winamp.com/showthread.php?t=330425 где каша из версий выстраивается в возрастающую последовательность версий. Интересный плагин http://nsis.sourceforge.net/File:NsArray.zip Но уж очень мутный в освоении... Добавить бы в Справочник практических примеров с этим плагином ... Но наши NSIS-гуру к сожалению тему и форум почему то забросили... |
Цитата:
![]() Вместе с плагином поставляются примеры использования, смотрите в них что да как. |
Flix, спасибо! Чуть позже гляну.
Если мне не изменяет память, этот плагин работает на IO. |
Ребят, подскажите как добавить полосу прокрутки текста на свою страницу, созданную в NsDialogs?
|
Цитата:
|
PHP код:
|
Цитата:
Хочу добавить длинный прокручиваемый текст, чтобы нельзя было ничего вводить в окне инсталлятора и чтобы курсор не мигал) В официальной справке нашёл пример, но там текст редактируется в окошке инсталлятора Код:
Function fnCustomInit |
Цитата:
|
Цитата:
|
Цитата:
|
Можно ли прописать самоудаление инсталлятора после окончания установки?
|
Всем привет! Понадобилось перепаковать одну программу. С nsis до этого был не очень знаком. Поэтому возникла проблема. В секции install пишу:
SetOutPath $PLUGINSDIR SetOverwrite on File logo.wav И так далее... При попытке создать инсталятор makensis, делаю через командную строку, выбивает, что такой файл не найден. Если пишу полный путь, к примеру: File D:\myprogs\$PLUGINSDIR\logo.wav Все работает, файл находится. Вручную прописывать путь к каждому файлу не вариант, там тысячи файлов, ещё и с подпапками. Рекурсивно все файлы, тоже не подойдет. Видел, что так должно работать, без указания полного пути всмысле, но почему у меня не работает? Файл nsi лежит рядом с $PLUGINSDIR. |
Цитата:
Начните с чтения справочника, потом вопросы задавайте. |
Begin2Fly Begin2Fly вне форума
Справочник я читал, а вот вы мое сообщение, видимо, по-диагонали... Пишу же: Если написать: File logo.wav То файл не находит. А если написать: File D:\myprogs\$PLUGINSDIR\logo.wav То все находит. Вот и вопрос, неужели у каждого файла нужно полный путь прописывать, почему с кратким не находит? |
Цитата:
Цитата:
Цитата:
Цитата:
|
Можно ли прописать самоудаление инсталлятора после окончания установки?
|
Цитата:
Также можно использовать http://nsis.sourceforge.net/SelfDel_plug-in |
Serg866, подобный вопрос уже рассматривался на страницах этого форума, нужно всего лишь воспользоваться поиском. Например, вот: ссылка.
|
Подскажите, пожалуйста, где грабли?
Пытаюсь на Windows 10(x64) импортировать данные реестра из файла в HKEY_LOCAL_MACHINE\SOFTWARE\Licenses. Вместо этого импорт выполняется в HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Licenses. Используемый сценарий
Код:
Name "RegistryTest" P.S. ExecWait '$WINDIR\regedit.exe /s "$EXEDIR\tree.reg"' - это работает аналогично импорту в сценарии... |
Цитата:
Вам нужно или переделать сценарий так, чтобы получить необходимые строки для импорта в реестр и потом задействовать стандартные команды 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 не имеет. Ну и, конечно, не забываем по права Администратора. |
Возможно кому будет интересна альтернативная разработка NSIS без ограничения 2Гб.
Автор: jasonfriday13. Проект: https://sourceforge.net/projects/nsisbi/ Проект создан базе NSIS v3.01. Системные требования: ОС Windows 64-bit. От автора (перевод): Цитата:
|
Уважаемые форумчане, помогите понять работу с dialog designer
создаю диалог, получаю файлы, инклюдю, помещаю ссылку !insertmacro MUI_PAGE_INSTFILES Page custom fnc_getIP_Show ;его нужно запускать после установки файлов на форме одно тестовое поле $hCtl_getIP_TextBox1. В какой момент оно получает значение? В какую часть (section) установщика помещать обработку этого значения? -разобрался, поместил обработчик в функцию вызова диалога в конец после метода ::Show однако, в поле $hCtl_getIP_TextBox1 вбил "ХХХХХХХХХХХ" а в переменной оказалось 1507670 хм.. что делать? |
Цитата:
ps dialog designer - задумка хорошая, но практическая реализация бестолковая и незавершённая. После него скрипт приходится , как говориться, дорабатывать напильником, т.е. много чего править вручную. Быстрее сделать с нуля... |
Здравствуйте.
Подскажите а с Windows 10 есть какой-то способ данный установщик подружить? Нигде не смог этой информации найди. Проблема заключается в том, что при запуске установщика на Windows 10 его блокирует SmartScreen фильтр. Или же его надо как-то подписывать? |
Цитата:
Там, в окошке, есть еще дополнительная кнопка... ![]() |
Цитата:
Я конечно Вас поздравляю с попыткой сумничать. Но нет, спасибо. Вопрос заключался не в том, как разрешить запуск данного установщика. А именно в способах сделать установщик валидным для фильтра W8-W10 без фин. затрат на подписание, либо с максимально бюджетными затратами. |
Цитата:
Насколько успешно решение, поищи сам. Навскидку: http://forums.winamp.com/showthread.php?t=378452 http://stackoverflow.com/questions/1...ed-application http://www.codeproject.com/Questions...luspreventplus |
Цитата:
|
Здравствуйте.
Пытаюсь в скрипте .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" а первая не работает? В чём засада? |
Почему данная команда не удаляет пустой ключ
Код:
${registry::DeleteKeyEmpty} "HKLM\SOFTWARE\Classes\.cr2" $r2 Скрытый текст
зато команда Код:
DeleteRegKey /ifempty HKLM "SOFTWARE\Classes\.icl" |
Доброго времени суток! Подскажите пожалуйста, какой плагин использовать или какое решение лучше применить для следующей задачи. Необходимо чтобы при запуске инсталлера проводились пинги определенных ip-адресов и проверялась доступность порта. И желательно чтобы всего этого безобразия с пингами и (телнетом?) пользователь не видел. Есть ли какие-то плагины, которые позволяют проверять доступность портов и проводить пинги, а затем выводить статистику отправленных пакетов? Пока решением частичным увиделся запуск батника через nsexec и дальнейший вывод содержимого файла на экран. Опять таки, если делать именно так, то можно ли каким-либо образом в nsis вывести содержимое полученного файла(а в идеале не полное, а, в случае с пингами, процент потерянных пакетов, то есть вывести только нужную часть содержимого текстового файла) на экран, чтобы пользователь мог передать увиденную информацию.
Заранее спасибо, и прошу прощения за, возможно, вопросы, которые здесь уже неоднократно обсуждались. Только начинаю осваивать NSIS и пока что не со всем функционалом разобрался. |
Smak0ff,
посмотри здесь : http://forums.winamp.com/showthread.php?t=243813 http://nsis.sourceforge.net/Check_open_ports а также по аналогии погугли (на английском) |
Цитата:
|
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 NSIS Installer Plugins or visit this forum: http://www.nsisfans.com/forum.php?mo...thread&tid=626
|
|
#Kopejkin >> Update templates now download again
|
|
NSIS uses plugin bass.dll to play radio stations
|
Привет народ, :)
Может кто посоветует куда копать или как сделать так, чтобы при переходе на страницу с компонентами инсталла, автоматически проставлялась галка для опции языка в зависимости от регионального значения языка в ОС ?! Надеюсь понятно пояснил.. |
Цитата:
Код:
System::Call 'kernel32::GetSystemDefaultLangID() i .r0' http://msdn.microsoft.com/en-us/libr...(v=cs.20).aspx |
Народ еще вопрос(ы):
1. По плагину nsDialog, к нему толковое руководство есть кроме вики на сайте? А еще лучше примерчики с комментами каких нибудь инсталлеров? 2. Для окна выбора компонентов никто не соорудил плагина с комбинированием чек-боксов и радиобаттонов?! Спасибо.. :) |
Цитата:
|
Цитата:
Лучше задавать конкретные вопросы с собственными вариантами решения (пусть и не верными...). Тогда есть шанс на результат. :) |
Здравстуйте.
Подскажите, пожалуйста, какая функция позволяет создавать инсталятор программы, чтобы программа после установки открывалась от имени администратора? |
Цитата:
С помощью 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 не имеют отношения... |
Цитата:
|
Задам еще пару вопросов)))
Как выставить свою иконку на приложение 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 Помогите новичку))) |
Андрей1990,
Твой вышеприведённый код указывает на отсутствие даже начальных знаний "матчасти" NSIS... При таком раскладе сложно (и даже бесполезно) вести конструктивный диалог... Без обид. Поэтому, для начала изучи по ссылкам из шапки : Цитата:
|
Никаких обид)
Я действительно не знаю NSIS. Просто надо сделать установщик))) |
И, кстати, "Справочник по NSIS" - пустой)))
|
Андрей1990, разблокируйте
|
Цитата:
|
Друзья, подскажите.
Задача: скопировать файлы из папки, которая лежит рядом с инсталятором в произвольную. Делаю: 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*" Так всё копируется нормально Подскажите, что я делаю не так? |
Цитата:
CopyFiles ".\Orig_Dir\*.*" "$INSTDIR\Main_Dir" Где: Orig_Dir — папка, которая лежит рядом с инсталлятором. Main_Dir — папка, куда копируем файлы. |
Как поставить пароль на инсталлятор, что бы нельзя было открыть в 7zip?
Ну и естественно, что бы при запуске пароль не требовался. |
Коллеги, не срабатывает автоматическое определение папки установки на 64-разрядных системах
Сам код такой функции такой: Код:
Function .OnInit Код:
!include "x64.nsh" Код:
InstallDirRegKey HKLM "Software\MyProgram" "Install Dir" Использую юникод НСИС 3.0. На 32-разрядной системе папка определяется, т.е функция срабатывает. А на Windows x64 пустое поле в окне выбора папки установки... Компилятор ошибок не выдаёт. Что не так делаю, ребят? |
Цитата:
|
Спасибо. Действительно в 32-битном разделе ключ.
Код функции убрал, путь определился. |
Мне нужно найти файл "file.exe" на компе (он может быть в любом месте) и путь до него записать в переменную. Как это сделать?
|
Подскажите, пожалуйста
Пытаюсь на 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 файл тогда работает как нужно. |
icq99999999, а если regedit.exe /s "$EXEDIR\Settings.reg"
|
пробовал так: nsExec::Exec 'regedit.exe /s "$EXEDIR\Settings.reg"'
всю равно, хоть на рабочем столе и появляется меню но оно не открывается |
icq99999999, пробелы лишние в слове command.
|
Begin2Fly, пробелы появились когда я копировал текс на сайт, а так в самом reg файле их нет
дело явно не в reg файле.. |
icq99999999,
${DisableX64FSRedirection} ExecWait '$WINDIR\regedit.exe /s "$EXEDIR\Settings.reg"' |
ну вот теперь всё работает. кстати как можно подняться на папку выше чем $EXEDIR ? и присвоить этот путь переменной
|
Цитата:
|
Разъясните. Перешел на 3.02 с 3.0, появилась небольшая проблема. Раньше после запуска инсталятора выводилось диалоговое окно выбора языка установки, сейчас его нет, но если установку производить на ОС с английским интерфейсом язык меняется и все отрабатывает согласно коду под англоязык. Это нововведения или необходимо доработать?
Теперь для появления диалогового окна необходимо дописывать следующее: Код:
;-------------------------------- |
Привет
Вопрос по nsDialogs Создаю страничку с чекбоксом, как добавить чекбокс разобрался, теперь нужно обеспечить взаимодействие с флажком. Например, хотелось бы, чтобы кнопка "Далее" становилась активна только когда пользователь поставит флажок в чекбоксе. Может есть примеры с такой функцией? Спасибо! |
Цитата:
|
Там показана манипуляция с созданной кнопкой. А как сделать так же со стандартной кнопкой ("Далее")?
|
Цитата:
Скрытый текст
Код:
!include "nsDialogs.nsh" |
Всем доброго времени суток. Подскажите, как в скрипте (для создания портативной программы) прописать для лаунчера запуск программы из разных папок
на 32 битной системе по пути App\papka32\proga.exe на 64 битной системе по пути App\papka64\proga.exe |
ZVSRus,
Наверное, как в справке и в сотне примеров в теме : Код:
!include "x64.nsh" |
MKN,
Спасибо, я в данной теме пару дней. И последний штрих, поможете прикрутить к данной функции ваш код (ненужное за комментировать) Скрытый текст
Код:
Function Launch |
Подскажите, уважаемые, кто делал такую штуку или знает как сделать.... У меня в фоне работает консольная утилита. Иногда ее надо срочно закрыть. Нужна на экран плавающая кнопка стоп (цветная, с иконкой, 20х20 мм), нажав на которую можно закрыть (убить) процесс. Запускает консольную утилиту ЕХЕ_шник на NSIS (процесс без окна) и ждет ее завершения. Кнопку можно запаковать в отдельный ЕХЕ файл. Я очень давно собирал инсталляторы и навык потерял.... :sorry:
|
Salmo, не надо извращений в виде плавающих по экрану кнопок. Скрипт AutoIt/AutoHotKey из нескольких строк, закрывающий указанный процесс по имени исполняемого файла по нажатию комбинации горячих клавиш.
|
Цитата:
На примере убиения процесса виндового калькулятора (используется плагин nsProcess). (Кнопка с фейсом поверх окон, можно перетаскивать, с маленькой кнопочкой для закрытия, с иконкой на кнопке 32x32) Ессно размеры и пр косметику можно изменять по вкусу... ![]() |
Всем доброго времени суток!
Подскажите какая константа соответствует дате и времени суток? Если точнее, как прописать в ini файл дату и время компиляции? |
Цитата:
(если файла нет - ессно сначала создать) Код:
!define /date MyTIMESTAMP "%Y-%m-%d-%H-%M-%S" |
Добрый вечер!
Подскажите в чем проблема? Код:
|
gamma,
Используй ExecShell Например : ExecShell "" "$EXEDIR\test.txt" |
Мужики, помогите разобраться... Второй день вожусь. Сделал две кастомные странички, на первой есть чекбокс выбора создания ярлыка в меню Пуск, на второй кнопка выбора папки в меню Пуск. Не могу заставить вторую страницу считывать состояние отметки чекбокса и в зависимости от отметки активировать/деактивировать кнопку...
Код
!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 |
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 |
Alex S,
Вот вам еще один пример. :) сценарий
Код:
!define PRODUCT_NAME "MyProg" |
Всем привет! Помогите, пожалуйста мне с такой проблемой: есть установщик состоящий из двух страниц - MUI_PAGE_WELCOME и MUI_PAGE_INSTFILES, и нужно чтобы этот установщик, при запуске с определённым ключом, сразу же показывал страницу MUI_PAGE_INSTFILES, начинал установку, и закрывался после завершения. То есть как бы Silent-режим, не требующий никаких действий от пользователя, но с отображением прогресса. Заранее спасибо!
|
RedCatX, вот простейший пример:
сценарий
Код:
;-------------------------------- Если запустить файл SkipWelcome.exe без параметров, то будет показана страничка приветствия. Если запустить его с ключем "/skippage" (SkipWelcome.exe /skippage), то будет показана только страничка установки. Условие "... и закрывался после завершения" реализуйте самостоятельно. :) |
Вложений: 1
Спасибо большое, помогло... Есть еще один вопрос, ответ на который давненько ищу. Как можно изменить вид дерева папок, отображаемого в окне выбора каталога. Имею ввиду ограничить это дерево видом только папки Программы и её подпапок в меню Пуск, а не деревом всего диска C:\. То есть папку(ярлык) можно выбрать или создать в Программы в меню Пуск. Для ясности вопроса прилагаю скрин желаемого вида.
|
Цитата:
Сценарий, который приведен под заголовком "Code", можно поместить в заголовочный файл (*.nsh) и подключить к файлу проекта (!include). А в самом файле проекта вместо инструкции nsDialogs::SelectFolderDialog использовать вызов функции Call BrowseForFolder. |
|
Цитата:
Проще для конкретного выбора при обзоре, использовать системные папки (у каждой папки, своя константа)... (здесь некоторые константы : http://www.pinvoke.net/default.aspx/Enums.CSIDL ) Пример с константой CSIDL_PROGRAM_FILES 0x26 : Код:
!include "nsDialogs.nsh" |
Подскажите как сделать так чтобы работало открытие файла, путём перетаскивания файла на лаунчер. В этой портативки работает https://www.upload.ee/files/7940760/...table.exe.html
|
Цитата:
|
Цитата:
|
skinny21
Цитата:
Цитата:
И что имеется в формулировке под нормальным скриптом? |
Цитата:
|
Цитата:
Может вам нужен лаунчер к портативке собранной в один файл в турбо или тинапе или к портативке от автора программы? |
Цитата:
|
Цитата:
Вам останется только прикрутить её к вашему сценарию. Вот простейший пример её использовании (на базе UltraISOPortable по вашей ссылке) Скрытый текст
Код:
Name "UltraISOPortable" Что делает этот лаунчер? При запуске проверяет наличие аргументов командной строки (в данном случае путь к файлу образа). Если они есть, что считывает их в переменную $0 и передает её в команду запуска программы. Если их нет, то переменной $0 присваивается пустое значение и запуск программы выполняется без параметров. Чтобы проверить его работу, поместите файл лаунчера UltraISOPortableTest.exe рядом (в одной папке) с оригинальным файлом загрузчика UltraISOPortable.exe. Затем можно просто запустить его или перетянуть на него файл образа. Все. |
Flix,
Огромная благодарность, неделю искал выход из этой ситуации. |
Мужики, добрый день. Помогите с кодом. Возникла проблема при создании информационной страницы. Идея такова: в зависимости от выбранного языка на странице (в 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 |
Цитата:
Теперь по вашему сценарию. С учетом того, что команда считывает только строку, то необходимо организовать цикл с поочередным чтением всех строк до конца файла. После чтения каждой строки, её необходимо передавать элементу управления. Таким образом, в простейшем варианте эту задачу можно выполнить так (на базе вашего сценария): Вариант решения
Код:
!define PRODUCT_NAME "MyProg" Если необходимо чтение документов в кодировке Unicode, то посмотрите в сторону команды FileReadUTF16LE. |
Flix, респект тебе и уважуха. Выручил...
|
Цитата:
Для этого есть несколько плагинов, к примеру, самый известный - WebCtrl. Комплект примера во вложении. Выглядеть будет так : ![]() окно для просмотра можно делать ессно любым способом (наверное лучше через nsDialogs::CreateControl)... |
MKN , спасибо! Действительно кода в половину меньше...
|
К слову, об ограничении FileRead на 1024 символа...
Для ANSI это ограничение можно снять с помощью сообщения EM_LIMITTEXT К примеру, для вот этого текста ( https://yadi.sk/d/1cLhpTrv3Rukjv ) без EM_LIMITTEXT отображаются только 512 строк, а с EM_LIMITTEXT - все 13229 строк. Еснно такой большой объём долго обрабатывается... Пример : Код:
OutFile EM_LIMITTEXT-test.exe |
MKN, спасибо! Забираю в копилку, пригодится и не раз...
|
Встречайте 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 |
Добрый вечер всем. Есть вопрос по поводу переноса строки в 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 Что примерно хотел сделать ![]() |
Alex S, предлагаю вам такой вариант решения. В вашем примере сценария замените функцию "ShowSelectedItems" следующим кодом:
Новая функция ShowSelectedItems
Код:
Function ShowSelectedItems Смысл вот в чем. Под текст, который необходимо вывести на странице, мы выделяем переменную (в примере $7). В ней мы формируем массив строк, в зависимости от выбранных пользователем параметров установки. После чего, последней командой, мы передаем эту строку необходимому элементу управления. Переносы и отступы формируются предусмотренными в NSIS константами: перевод строки — $\r$\n; табуляция — $\t. Под строку желательно выделить отдельную переменную, а не предустановленную. Результат
![]() |
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 |
Как проверить контрольную сумму "CRC" файла? Если не совпадает, то сообщение "куку" и выход, если совпадает, то идём дальше...
|
Цитата:
Пример
Код:
|
Flix, разобрался.
|
Мужики, добрый день. Снова возник вопрос с диалогом выбора папки назаначения. Возможно ли в зависимости от языка инсталлятора(русский-английский) сменить текст кнопок "отмена" и "создать папку" на текст соответствующего языка?
Если можно, на базе этого скрипта...
!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 |
Цитата:
|
Понял. Спасибо за ответ.
|
Вложений: 2
Как защитить инсталлятор от вскрытия? Можно подробнее...
Что было так... |
Привет народ,
мои очередные вопросы: 1. как сейчас обстоят дела с определением винды 10й ? Ранее было членово с этим.. 2. как заблочить кнопу далее в окне компонентов если ни один из них еще не выбран ? есть несколько вариантов: а) галочка на одном из чекбоксов автоматически установлена в зависимости от выбранного языка инсталлятора и/или ОС; б) если ни один чекбок не выбран то при нажатии "Далее" выводится сообщение "бла-бла-бла" и установка далее невозможна пока не будет отмечен один из чек боксов; в) заблокировать кнопку "Далее" пока не будет отмечен один из чекбоксов. проблема в том что чек-боксы у меня исключающие друг-друга, + работаю в старом Нсис под Юни 2.46.5.. У кого нить есть идеи как сие получше реализовать ?! если можно с примерами.. :) |
Цитата:
Код:
OutFile "NoActivButtonInst.exe" Цитата:
|
Цитата:
Цитата:
StdUtils - это что и где можно глянуть ?! Зы, напоминаю, у мня старая ОС, старый софт, и Нсиська на юникодах.. :yes: |
Цитата:
https://github.com/lordmulder/stdutils/releases Код:
!include "StdUtils.nsh" |
MKN,
Еще вопрос есть, по части языков.. При запуске инсталлера (если мультиланг) выводится окно с выбором языка.. Вопрос, как сохранить отмеченный выбор языка в переменную и/или как вариант определить язык ОС по умолчанию, с занесением его в аналогичную переменную? В справке рылся но что-то не нашел где и откуда копать.. :unsure: Зы, вроде разобрался и нашел что нужно, но если будут еще каие варианты, то я не против глянуть.. |
не могу найти nsisUnrar плагин от Bioware, надо встроить в инсталятор распаковщик winrar-архивов, желательно rar5-архивов, есть пример как это можно сделать?
|
Привет народ,
Очередной вопрос насущный, можно ли на Нсиське сделать подобное:: - инсталлер должен позволять устанавливать софт в разные места на ПК и на разные версии игры, а не так что установил одну копию и дальше только удалять ?! Спасибо.. :) |
Цитата:
Цитата:
Прочитайте "Справочник по NSIS", там есть примеры. |
Цитата:
Есть, например, 4 каталога с установленными играми одной серии, на разных дисках в разных каталогах, и вот на них всех должен быть установлен соответствующий софт из одного инсталлера. Надеюсь так будет понятнее.. |
Цитата:
Извлекаешь эти данные и делаешь логические выводы, а затем действия... К примеру : Код:
ReadRegStr $InstPatshGame HKLM "SOFTWARE\GameDeveloper\MyGame\AppsPatch" "GameName" Если прога дурная и ничего о себе в реестр не пишет, то ищешь соответствующие ей файлы, папки и пр. Если местонахождение известно, то так : Код:
${If} ${FileExists} "$InstPatshGame1\GameName1\GameName1Files.exe" (Как это "технически" реализовать в скрипте, значения не имеет...) |
Цитата:
|
Цитата:
Исходя из постановки задачи, выходит следующая схема: Код:
SetOutPath <каталог 1, версия 1> Цитата:
|
Не получается запустить драйвер 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 |
Цитата:
Что то вроде : KmdUtil.exe install SbieDrv "Patch\SbieDrv.sys" Также с помощью этой утилиты можно установить службу-сервис SbieSvc.exe Утилиту можно "вытащить" из SandboxieInstall (там же кстати будет и NSIS скрипт)... А NsSCM_plug-in древний и бестолковый... Годится для отдельных частных случаев... |
MKN
Драйвер установился, но все равно не работает Exec '"$EXEDIR\App\Sandboxie\KmdUtil.exe" install SbieDrv "$EXEDIR\App\Sandboxie/SbieDrv.sys"' |
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'" |
skinny21,
С слэшем я ошибся - надо Patch\SbieDrv.sys |
MKN, Исправил, но ошибка та же, драйвер установлен, но не запущен, SbieSvc запустил при помощи SimpleSC
Flix, сделал так как научили, ничего не вышло |
Заметил такую странность (точнее, заметили пользователи моей программы) - некоторые функции готового инсталлятора не выполняются, если его заархивировать в WinRar и запустить инсталлятор из архива. В частности через код Function .OnInit может не отработать команда ${If} ${FileExists}. На XP у себя такой проблемы не наблюдаю, а вот на более старших системах баг проявляется, но не всегда. Может кто знает из-за чего такое в принципе может происходить.
Почему спрашиваю: через ${If} ${FileExists} у меня встроена проверка оригинальности файлов при запуске инсталлятора. И эта проверка легко обходится простым архивированием инсталлятора. |
Serg866, вряд ли она может не отработать, скорее отрабатывает она не так, как вы того ожидаете. Нужно больше информации: часть кода, отвечающая за проверку, может даже установщик чтобы посмотреть на поведение вне архива и в архиве.
|
Условный код функции
Код:
Function .OnInit Замечен баг только на старших системах (Windows 7, 8, 10), но закономерность не обнаружена - на каких-то сборках работает, на каких-то нет. Использую NSIS 3 (Юникод). |
Привет народ.. :)
Заметил очередную странность в работе программы, суть ее вот в чем:: написал инсталлер с установкой проги на 8 языках в зависимости от выбора чекбоксов.. далее, прикрутил автоопределение языка и в зависимости от языка ОС автоматически проставляется галочка на установку аналогичного языка. При инсталляции все работает вроде исправно, но если запускать деинсталл, то чек бокс проставляется на одну строку в низ, а не туда куда нужно.. Пример кода для инсталла и деинсталла для выбора языка установки в чек-боксах:: Код:
Function .onInit Использую нсис-юникод 2.46.5 |
Задумал проверять разрешение экрана пользователя.
Пример из справки "Определяем и меняем разрешение экрана" не заработал на NSIS3 (Unicode). Компилируется без ошибок, но при запуске ничего не происходит. Используется какой-то древний плагин ChangeRes 2003 года. Есть ли рабочие примеры проверки разрешения дисплея для NSIS 3 под юникод? |
Цитата:
Цитата:
Пример
Код:
Unicode true Если функционал вашей программы установки активно использует регистры общего назначения, то для хранения исходных значений с размерами экрана лучше задействовать собственные переменные. |
Flix, спасибо за подробный разбор!
Я не планировал смену разрешения у пользователей. Нужно только определять текущее разрешение экрана с целью узнать поддерживает ли монитор Full HD. Таким образом, если разрешение равно 1920х1080, то один код в инсталляторе. Если нет, то код другой. Понимаю теперь, что это делается без сторонних плагинов. Основываясь на Справочнике и Вашем примере, получился такой код функции. Будет ли сиё работать со всеми Windows от XP до 10? Или что-то нужно добавить? Код:
Function .onInit Цитата:
|
Цитата:
Цитата:
|
Вложений: 1
подскажите , и по возможности кто знает подправьте пожалуйста ,почему скрипт не компилируется? )
|
Цитата:
|
Begin2Fly, Это вы знаменитый KpoJIuK, а не могли бы вы выставить скрипт, а-то в nsis ни когда не делал
|
Nsis Script Creator Это простой текстовый редактор, с функцией быстрой разработки простых NSIS скриптов.
Ссылка на страницу программы: http://www.insofts.ru/Nsis_Script_Creator.html ![]() ![]() ![]() |
Добрый день. Можно ли в NSIS определить выделенный файл (в фокусе), чтобы продолжить работать, именно, с ним?
|
Цитата:
|
Цитата:
У меня в цикле в фоне отрабатывает код. Нужно в него вставить функцию, которая обнаруживает выделенный курсором любой файл в любом месте (как это делает винда) и сбрасывает путь к файлу в переменную. Диалоговые окна не нужны, файл заранее не определен, важен факт его выделения кликом. |
Salmo,
Самое простое, кликнуть правой кнопкой мыши по любому файлу и в появившемся контекстном меню кликнуть по нужному пункту, который сам и создашь. код , как создать такой пункт : Код:
OutFile "FilePatchMyFunction.exe" Обрабатывается клик командой "$TEMP\MyFunction.exe /A $\"%1$\" MyFunction.exe(помещаемую, как пример, в $TEMP), где определяется путь из переменной, получаем так : Код:
outfile "MyFunction.exe" Наверняка можно "ловить" клик по файлу и иначе, но это уже программирование иного уровня... |
MKN, спасибо! Буду думать над вариантом с контекстным меню, если "левый" клик отловить не так просто.
|
Salmo, MKN, в проводнике Windows есть стандартная функция "Копировать как путь". Нужно зажать клавишу SHIFT и щелкнуть по файлу правой кнопкой мыши. В контекстном меню будет доступна команда "Копировать как путь".
|
Цитата:
|
Flix, MKN, добрый день, я вижу есть некое продолжение моей темы. Я решил задачу, отказавшись от цикла, а код теперь запускается так:
Код:
!include "FileFunc.nsh" |
Привет
Нужна функция, определяющая, что инсталлятор был запущен из rar-архива, и в зависимости от этого выполнять определённый код. Подскажите, друзья, как мне такое реализовать? Я понимаю, что при запуске из архива, файл инсталлятора распаковывается во временную папку и уже оттуда самозапускается. Но определить, что установщик был запакован в архив всё равно нужно. |
Цитата:
К примеру, сигнатура WinRAR compressed archive(v4.x) - 52 61 72 21 1A 07 00 Конкретнее есть здесь : https://www.rarlab.com/technote.htm Цитата:
|
MKN, к сожалению про сигнатуры я ничего не понял...
При запуске инсталлятора из rar-архива, происходит распаковка во временную папку, и уже из неё инсталлятор автоматически запускается в обычном виде. Путь к временной папке, в которую распаковывается инсталлятор: C:\Documents and Settings\Серж\Local Settings\Temp\Rar$EXa0.XXX (вместо XXX - три случайные цифры) Вот думаю, надо привлекать сюда команду $EXEDIR, определять путь запуска и если в пути присутствует слово "temp" или "rar$", то выполнять определённый код. Меня бы такой вариант устроил. Буду благодарен за пример кода по данному сценарию. |
Serg866,
Т.е. ты сначала запускаешь SFX RAR, из которого в свою очередь запускается NSIS инсталлятор ? А NSIS инсталлятор после запуска определяет откуда он появился на свет ? Если из RAR архива, то... Тогда, раз известны некоторые данные в названии временного файла, можно с этим файлом работать,т.е. узнать RAR это архив или нет. Я правильно понял ? Сигнатура тогда и нужна, для того, чтобы точно определить, какой это файл. (Хотя в темпе ведь уже может быть непредсказуемый винегрет из кучи разных файлов с непредсказуемыми названиями, в том числе и с "temp" или "rar... Тут и сигнатура не поможет. :) Разве что сначала придётся очищать темп или детектить последнее время создания временного архивного файла... ) ps Зачем такие извращения ? И антивирусы сойдут с ума от такой матрёшки... :) |
MKN, мне только этого будет достаточно:
1. Определяется путь запуска инсталлятора ($EXEDIR) 2. Если в $EXEDIR есть слово "rar"или "temp", то мессаджбокс и аборт установки. Ничего вычищать из папок не требуется. Зачем мне это надо
Недобросовестные персонажи упаковывают мою программу в winrar-архив, куда также кладут url-файлы ссылок на свои уг-сайты и ещё кучу всякого "добра".
И потом в таком виде на этих сайтах мою программу распространяют против моей воли. Я хочу, чтобы программа определяла, что для запуска использован архив и прекращала установку. |
Serg866, пожалуйста, не делайте так. Это плохая практика, ибо есть ещё и добросовестные персонажи.
|
Цитата:
Подключите код функции к вашему сценарию и в функции инициализации добавьте следующий код (текст сообщения измените в соответствии с вашими пожеланиями): Код:
|
Цитата:
\Documents and Settings\Raritet\Local Settings\Temp\Rar$EXa0.XXX |
Цитата:
|
Flix,
Интересно, как долго висит процесс SFX модуля ? Если процесс ещё существует во время запуска NSIS инсталлятора, то это был бы очень хороший ориентир для детекта... Хорошо бы посмотреть, как работает, "оприходованный" пиратами, инсталлятор Serg866. :) |
Цитата:
Цитата:
|
Встречайте NSIS v3.04 (релиз от 15 декабря 2018): страница загрузки
Что нового...
HTML код:
F.1 3.04 |
Привет, друзья!
Насчёт проверки запуска из архива - пример от Flix'a работает чётко. Спасибо! -------------------- Появилась ещё одна, а точнее две задачки по NSIS: Можно ли определить тип видеокарты пользователя? (ATI или Nvidia). И в зависимости от типа видюхи устанавливать файлы. Также мне нужно определить, установлена ли у юзера Windows10. В справке посмотрел, есть раздел "Определение ОС с помощью NSIS", но там только до Windows 8. Я использую NSIS 3 c параметром Unicode true, правда не последнюю версию, а 3.0b2. |
Цитата:
Код:
;WMI.nsh - https://nsis.sourceforge.io/WMI_header |
Вложений: 1
MKN, благодарю!
Пример показал инфу, что у меня видеокарта от AMD (правильно). Кстати, в папке скрипта зачем-то создался пустой bat-файл "TempWmicBatchFile.bat" - Подскажите, пожалуйста, по какому параметру работать дальше? Т.е если драйверы от AMD, то чтобы устанавливались определённые файлы. - Работать с текстовой строкой "Advanced Micro Devices, Inc." ? Типа, если $2 = Advanced Micro Devices, Inc., то устанавливаем файлы. Или как-то иначе? |
Вопрос выше актуален. Друзья-коллеги, помогите разобраться.
|
Serg866,
Так всё очевидно... Сам же уже и ответил : Цитата:
|
Всем привет. Как сделать чтобы окно сообщений запускалось на другом языке, если язык виндовс не русский?
К примеру имеем вот такое сообщение Код:
!define NAME "0" Или как соединить два сообщения с разными языками? |
|
За ссылку спасибо, но ничего не понял, как это можно прикрутить к моему конкретному окошку? Как я понял там обсуждается, как с какого то установщика должно всплывать окошко на нужном языке, в зависимости от регионального языка системы. А я совсем другое спрашивал.
|
динозавра,
тогда так : Код:
OutFile "Select LANG_ID.exe" |
Огромное спасибо за помощь.
Но у меня это не работает, вернее криво и при смене регионального языка ничего не меняется. Пробовал в коде менять MessageBox MB_OK "$0" на MessageBox MB_YESNO "$0" еще хуже, а с двумя этими строками вдвойне хуже. Вот можно посмотреть https://streamable.com/lxmyx |
динозавра,
Так ты не меняешь язык системы, потому и ID остаётся тот же. Вроде как задача была для не русской Windows ? На ней и будет работать... А при смене языка, как делаешь ты, вероятно надо использовать - GetUserDefaultUILanguage, которая возвращает language identifier, выбранный пользователем. Т.е. System::Call `kernel32::GetUserDefaultUILanguage() i.r0` И вроде как, именно эту функцию использует и сам NSIS, потому и следовало бы обратить внимание на первую ссылку, что я давал... |
Я не правильно поставил вопрос. Но с видео видно, что я хотел и что этот код не работает.
А по ссылке я вообще ничего не понял. Но , все равно большое спасибо. |
Приветствую.
Понадобилось мне удалять из реестра ключи, сгенерированные случайным образом в различных корневых ветках, но всегда содержащие несколько одинаковых имен параметров. Пытался приспособить для этого пример из статьи Справочника по NSIS "Registry: Работа с реестром". Что получилось...
Код:
!include "MUI2.nsh" Может как-то умнее можно это оформить? |
Цитата:
Код:
${RegFind} "Key" "Options" Function |
После установки приложения запускаю файл "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" и заново запустить, то всё работает как надо. В чём причина может быть? |
Уважаемые, есть живые? :) После большого перерыва все забыл.....ну почти все... Подскажите, пожалуйста, как отловить нажатие клавиши на клаве (Ctrl) после закрытия MessageBox кнопкой "Отмена"? То есть нажимаю Ctrl, удерживаю и одновременно нажимаю Отмену в сообщении. Хочу "раздвоить" отмену...
|
Цитата:
Пример отслеживания нажатия Shift http://nsis-dev.github.io/NSIS-Forum.../t-237087.html Тебе нужен VK_CONTROL 0x11 |
MKN, отлично, все получилось! Спасибо за отзывчивость :yes:
|
Уважаемые, а какой командой я могу закрыть окно проводника с открытой папкой?
|
Ребят ткните носом пожалуйста нуба, не могу разобраться как в .exe файле заменить файл png на свой, вот в этом файле
|
Цитата:
|
MKN, Здравствуйте...Это слишком радикально. Другие окна\папки должны остаться открытыми. Нужно закрыть одну папку с определенным именем.
|
Salmo,
Цитата:
Сообщение, к примеру такое : SendMessage $R0 ${WM_SYSCOMMAND} 0xF060 0 0xF060 - константа для SC_CLOSE. |
Тут как — у одного будет только имя конечного каталога, у другого — полный путь в заголовке.
|
MKN, С папкой получилось, спасибо.
Нашел тут давненько выложенный макрос, автор kotkovets. Что нужно в нем изменить, чтобы код "нажимал" на клавишу F5 - горячую клавишу программы? Код:
!define VK_TAB 0x9 |
Цитата:
назначаем : !define VK_F5 0x74 ; эмуляция нажатия F5 Sleep 300 ${keybd_event} ${VK_F5} 1 |
MKN, Спасибо, все получилось!
|
Привет всем, :)
Решил тут скомпилить пример из справки с нсДиалогом, ну или лыжи не едут или я уже все позабывал.. еррор: Error: resolving install function "myGuiInit" in function ".onGUIInit" Note: uninstall functions must begin with "un.", and install functions must not или то все проблемы моей Юникод версии? :dont-know |
MaGoth,
Чтобы что то подсказать, нужно видеть твой код... |
Цитата:
Код:
!define PRODUCT_NAME "Winamp" Зы, Мой НСИС Юникодный 2.50, если что.. |
Цитата:
|
Цитата:
Интересно а в той функции было что-нить полезное, и почему ее нет в коде.. автор зажал? Вопрос из другой оперы. Есть плагин для выдирания срц из файла CRCCheck.dll, все бы хорошо, но он выдает в 10м виде значение, а как бы его дернуть в 16м? Для примера накидал скриптик, который выдал следующее значение для файла: CRC: 3164762915 в мессага бокс и текстовку, а оригинальный файл: CRC32: bca27323. Какой-нить конвертер с 10го в 16е существует ?! |
Цитата:
Код:
OutFile "Test_DecToHex.exe" |
А почему нельзя здесь просто взять и выложить конкретные примеры команд для изменения тех же хост-файлов? Я вижу здесь какое-то маниакальное желание автора справочника, всех заставить его изучать. Почему для внесения изменений в хост-файл, в сети выложено множество готовых батников и конкретные описания команд для тех или иных операций? И ни кому в голову не приходит посылать пользователей изучать справочники и пособия, на изучение которых требуется продолжительное время, а решить вопрос требуется непосредственно в данный момент. Конечно вам большая благодарность за данный справочник, но не всем дано так вот сходу в нем разобраться.
Хочу уточнить. Мне, например, как полагаю и многим, нужен шаблон (пример) скриптовой команды для внесения новой строки в хост-файл. Кроме того, необходимо, чтобы строка не прописывалась повторно (не дублировалась) в случае, если в хосте уже имеется аналогичная. А также нужен второй шаблон скриптовой команды, но только для удаления необходимой строки из хост-файла. В батниках, примеры всех этих команд, давно уже выложены в сети. Но к сожалению до сих пор нет конвертера, работающего по аналогии с Reg2Nsis и преобразующего батники в команды NSIS-скриптов. И указанные скриптовые команды, нужны людям довольно часто, при создании тех же репаков или портативок в формате Portable.paf. Почему выложены примеры команд по созданию разных банеров, заставок и прочего, а реально необходимых примеров не найти? |
Прив народ.. :)
Код:
@echo off Накатал такие строчки: Код:
ExecWait "$WINDIR\System32\sdbinst.exe -n 'GOG.com Gothic'" зы.. отбой разобрался.. Но, другой вопрос нрисовался, график карты нормально определять можно чем нить через скрипт помимо левых костылей на всяких *.длл ?! |
|
Цитата:
Нашел немного иной путь, но там тоже своих грабель хватает, впрочем бум разбираться.. :) |
Цитата:
|
Привет, есть задача научить запускать скомпилированный exe nsis'ом только при наличии параметра, то есть:
Installer.exe -start - установщик запускается как положенно. Installer.exe - без параметра, запуска не происходит. Каким образом можно реализовать? |
Цитата:
Код:
${GetParameters} $CMDLINE |
Begin2Fly, благодарю, есть так же задача научить запускать скомпилированный exe nsis'ом только при определенном имени exe:
имя Installer.exe - запускается в обычном режиме имя отличное от Installer.exe - завершаться Каким образом можно реализовать? |
${If} $EXEFILE == "Installer.exe"
MessageBox MB_OK "Обычный режим" ${Else} Quit ${EndIf} |
Друзья, нужна помощь. Состряпал для эксперимента экзешник.
Как запустить установленный батник? Вот код Скрытый текст
Код:
!define PRODUCT_NAME "PRODUCT" Все, разобрался. Код:
Exec '"$INSTDIR\1.bat"' |
обновился NSIS Dialog Designer
v.1.4.4 - 2019-08-01 Цитата:
Цитата:
|
Цитата:
Код:
nsExec::Exec '"$INSTDIR\1.bat"' |
iglezz,
Спасибо, все красиво и не мелькает.. А то я уже через .vbs слепил. |
Друзья, У меня опять супер проблема. Ну никак не работает удаление файла из папки System32 на Вин х64.
Уже пишу такое и никак: Код:
!include "x64.nsh" |
${DisableX64FSRedirection}
|
Begin2Fly,
Спасибо. Еще чуток лет и я постигну азы NSIS. И еще вопрос, в NSIS есть такое, чтобы MessageBox было без MB_YESNO и т.д, а чтобы окошко показывалось, к примеру с моей фразой нужное количество секунд? И, где вы берете все эти коды? Ведь в справке их нет. |
Цитата:
Include\ содержит заголовочные файлы (.nsh), подключаемые через !include. Многие хорошо документированы Examples\ -- примеры к nsh и плагинам Docs\ -- документы к nsh и плагинам 2. https://nsis.sourceforge.io/Developer_Center -- дополнительные плагины, примеры Цитата:
А вот пример MessageBox с таймаутом: Скрытый текст
Код:
Name "MessageBoxTimeout" |
Цитата:
Пример попроще(суть та же, что и выше) : Код:
OutFile "MsgBoxTimeoutTest.exe" Цитата:
|
Всем привет.
Вот, что у меня получилось. Скрытый текст
Код:
!define NAME "Registry cleaning" Теперь по порядку. Registry cleaning.exe" это файл с кодом: Скрытый текст
Код:
OutFile "Registry cleaning.exe" Файлы TrashRegFull.exe и TrashRegX64Full.exe - это "вылеченные" TrashReg, чтобы могла работать в форсированом, скрытом режиме. Файлы ACL.TXT и ACLL.TXT - это получение прав владельца на ключ реестра с использованием встроенной команды REGINI. Файлы - mntemp и linjqbyk.kfl один из многих видов защиты Гаврилы. Файл f.bat - это батник с таким содержимым: Скрытый текст
Код:
@echo off Для чего сделана эта "поделка"? После применения возобновляется работа 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 и избавиться от кнопки ОК. (Так, было бы красивей и практичней, может, кто поможет и в этом), но для начала сойдет и так. |
Привет народ, :)
Вообщем, я тут по граблям реестра:: Имеется такой батник: Код:
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 1. как поправить код в нсис чтобы работало на осях Вынь ХР ... Вынь 10 ? 2. если код в нсис не поправить, то как передать из скрипта путь игры расположенный на компе клиента ? 3. или есть какой может вариант как батник поправить, тога бы его в тихом режиме запускать без вывода окон и прочей ереси.. ? 4. код батника из скрипта запускать напрямую можно вообще ?! Спасибо ,) |
Цитата:
параметр C:\Games\Gothic II\System\Spacer.exe тип REG_SZ с данными DisableNXShowUI" "HIGHDPIAWARE Какие то данные странные DisableNXShowUI" "HIGHDPIAWARE , но это вы их так написали. То тогда, вот ваш батник без запроса: Код:
@echo off Код:
nsExec::Exec '"$INSTDIR\1.bat"' Код:
OutFile "HKCU.exe" |
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Всем привет. Подскажите, можно как то поменять в строке файла .xml , в которой есть число (неизвестное) одну любую цифру на случайную или как крайний вариант на заданную?
|
динозавра, для этого можно воспользоваться плагином nsisxml.
|
Begin2Fly,
Спасибо, но я не нашел ни одного примера использования, когда в строке файла .xml , в которой есть число (неизвестное) нужно поменять одну любую цифру на случайную или как крайний вариант на заданную. Нужно видимо как то ко всему непонятному прикручивать генераторы случайных чисел, а я в этом плагине и прикрутке генераторов полный дуб. Короче для меня это не реально. Я по своей наивности думал, что есть какая то простая функция типа, если в строке найдена цифра к примеру 5, то заменить на, к примеру 6 или другое, если не найдена , то искать к примеру 6 и если найдена, то заменить на 7 или любое другое. Больше думаю не нужно, их там в файле аж 24. Это строка <Data key="TrialSerialNumber">745920021237495069785432(это чисо на каждом компе разное)</Data> в файле application.xml что с акробата C:\Program Files (x86)\Adobe\Acrobat DC\Acrobat\AMT Хотел состряпать фикс для акробат. Там нужно добавить в реестр, применить патч и поправить фай(сбросить окончание триала). Первое и второе сделал а править файл для меня темный лес. |
динозавра, вообще-то, xml-файл не имеет понятия «строка». Есть понятия разметка, тэг, атрибут, значение атрибута и т.п.
Цитата:
|
Вложений: 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 '", чтобы не изменился сам файл, ну, как бы так, если бы это было сделано вручную. |
динозавра,
Вариант с изменением последней цифры Скрытый текст
Код:
;Using https://nsis.sourceforge.io/NsisXML_plug-in_(by_Wizou) |
iglezz,
Огромное спасибо. Это именно то, что я просил. Меняется одна цифра. Просто супер! |
Все удалил по причине нарушения ОПК п.3.18
|
динозавра, Вы бы с этим поосторожнее. Вы вообще в курсе существования ОПК п.3.18?
|
Понял ошибку, лохонулся. Удалите, пожалуйста мое сообщение в кого есть права.
|
динозавра, Самостоятельно можно отредактировать сообщение.
По самому коду:
Подобные многократно повторяющиеся конструкции поддерживать -- самому себе лишняя работа при дальнейших модификациях плюс прямая дорога к ошибкам. 1. Код языка записывается в регистр $0 в функции .onInit, а читается в секции. По пути $0 может многократно измениться 2. Если пользоваться такой конструкцией для установки языка сообщений, то лучше переписать код примерно так: Скрытый текст
Код:
Var RunParamVar Или использовать Код:
LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf" Во избежание нестыковок лучше вычитать из реестра папку установки в переменную и использовать её в дальшейшем. Дополнительно можно запилить проверку на то, что это именно та папка, в которую надо писать файлы. 4. DetailPrint из моего примера можно было и удалить :) |
динозавра, я, конечно, могу ошибаться, т.к. пару лет кодинга вообще не касался, но начиная читать код сразу меня остановил вот этот кусок:
Код:
${If} ${RunningX64} SetRegView как раз нужна для того, чтобы скрипт сам определял, в какую ветку будет записывать данные, таким образом можно избавиться от лишних строк в коде. либо так (без SetRegView): Код:
${If} ${RunningX64} Код:
${If} ${RunningX64} Вообще, если нет надобности постоянно писать в разные разделы, то лучше бы при запуске определиться с командой SetRegView...Так вы сами себя избавите в дальнейшем как минимум от лишних конструкций с ${If} |
Цитата:
Цитата:
Я тогда (очень давно) строго воспользовался вашей инструкцией и не отступал ни на децл http://forum.oszone.net/post-2541218-1741.html и дальнейшее после сообщения 1740 |
Исходные данные: дан список
string1 string2 string3 string4 Как выбрать из этого списка рандомно, одну из строк и записать в переменную? StrCry "$1" string? |
f0r_ce, какой ответ вы хотите получить с таким вопросом?
Цитата:
|
K.A.V., список там же в скрипте
StrCry $1 string1 StrCry $2 string2 StrCry $3 string3 StrCry $4 string4 Далее выбор рандомно одну из них и заносим в переменную StrCry "$5" string(?) |
|
iglezz, StdUtils работает только с числами, строки не рандомит, NsRandom тоже.
|
f0r_ce, Понятное дело, самое интересное - получить строку относительно её номера.
Например так
Код грязноват ибо не заботится о перезаписи переменных Код:
Name "RandomStringTest" Более корректный вариант, оформлен как функция: Скрытый текст
Код:
Name "RandomStringTesFunc" |
Можно ещё проще генерить рандомное число номера переменной в коде:
Пример - до 20 : Код:
OutFile RandomTest.exe |
AlekseyPopovv,
Код:
${GetOptions} "$CMDLINE" "/U=" $R0 Код:
${GetOptions} "$CMDLINE" "/U" $R0 |
iglezz,
Ага, въехал... А как сделать что бы инсталлятор нельзя было открыть в 7z? Можно в личку. |
Как создать MUI_PAGE_DIRECTORY custom?
И как задать разные InstallDir для обычной и портативной версий? |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
1) Показать диалог с взаимоисключаемыми секциями 2) На собственной созданной страничке поставили 2 радиобаттона и юзер жмакает тот, который ему нужен (обычная/портативная установки) 3) Или тупо при заапуске показываете мессадж-бокс (сообщение с вопросом "Портативку не желаете?")... :) 4) Если собственная страничка, то чем создаёте? InstallOptions или nsDialogs? вот как-то так...Ребята, задавайте более конкретные вопросы или сразу кидайте свой код, задаёте размытые вопросы - размытые ответы и получаете... небольшой пример со стандартными средствами с взаимоисключаемыми компонентами (некрасиво, старо и не модно, мне лень что-то воротить "впустую") :) Код:
|
Цитата:
Код:
!include "MUI2.nsh" |
AlekseyPopovv, отвечу сразу на вопрос, заданный в личке
При нажатии кнопки "Назад" - у вас диалог заново инициализируется с вашими прописанными состояниями элементов Соответственно, чтобы сделать более умный диалог, нам нужно код написать таким образом, чтобы он учитывал сей факт, что кто-то нажмёт "Назад" и нам будет необходимо поставить всё так, как выставил пользователь Для этого, нам нужно сначала в секцию .onInit прописать в переменные, состояние элементов управления по-умолчанию: Код:
Function .onInit Скрытый текст
Код:
Function FnCustPage Этим: Скрытый текст
Код:
Function FnCustPage Этим мы делаем нашу функцию "умной" с возможностью подхватывать те значения, которые пользователь выбрал и, если вдруг, решил вернуться на страничку Далее заменим Код:
Function Switching Код:
Function Switching Теперь о том, чего не хватает У вас переназначение $INSTDIR прописано в секции, это неправильно, т.к. секции обрабатываются непосредственно при начале установки в Код:
!insertmacro MUI_PAGE_INSTFILES Код:
!insertmacro MUI_PAGE_DIRECTORY Код:
${If} $Radio == 1 Код:
Section Но это чисто мой стиль написания, я не навязываю вам писать свой код таким же образом, просто так он будет выглядеть менее громоздким... Готовый вариант вашего кода
Код:
!include "MUI2.nsh" |
K.A.V., Как добавить картинки .bmp на каждый буттон?
Код:
${NSD_CreateBitmap} 150u 3u 100% 100% "" |
AlekseyPopovv, если вы именно про то, чтобы заменить стиль квадратика галочки - то я не знаю, возможно, это делается только рисованием элемента "вручную" через стиль BS_OWNERDRAW
Может здесь кто таким вопросом озадачивался, подскажет |
K.A.V., нет, я про картинки которые меняются при выборе "Установка" или "Распаковка".
Как здесь |
AlekseyPopovv, перед:
Код:
nsDialogs::Show Код:
${NSD_CreateBitmap} 150u 3u 100% 100% "" Код:
Function Switching Код:
Function SwitchImage |
K.A.V., Как пропустить (не показывать) страницу, если нет определённого параметра? И как назад?
Сделал так: :lamer: Код:
StrCmp $R0 0 0 +50 |
Цитата:
раз уж решились кодить на NSIS, почитайте тогда, как минимум, наш Справочник по NSIS, в разделе "Статьи" для начала откройте для себя "метки", прочитав страничку "Labels: Метки, безусловные переходы", чтобы как минимум такой кошмар в коде не делать: Цитата:
|
Цитата:
Пример
Код:
Name "CallbackExampleSkipPage" |
K.A.V., Я уже давненько пишу на NSIS, но редко, в основном портативные версии. Там таких "запар" с созданием страниц и т.д. нет. Спасибо за помощь. :yahoo:
iglezz, Сейчас попробую, а то забыл уже сколько строк добавил, опять заново считать. :shocked: |
Как на "UnInstallBtn" назначить функцию на кастомной странице? Пример бы какой ни будь.
У меня все кнопки делают одно и тоже действие почему то... |
Цитата:
|
Так нет его, только это:
${NSD_SetText} $0 "$(^UnInstallBtn)" |
Внимательное чтение ${NSISDIR}\Docs\nsDialogs\Readme.html подскажет верный ответ.
Что-то в духе Код:
${NSD_OnClick} $0 ИмяФункции |
Как сделать, что бы при выборе папки установки дописывалась папка приложения?
Пример: "C:\Program Files\Proga\", а не так "C:\Program Files". Как удалить пустую папку при закрытии инсталлятора или при нажатии кнопки отмена? |
Цитата:
Это может быть InstallDir "$PROGRAMFILES\Proga" или StrCpy $INSTDIR "$INSTDIR\Proga" или SetOutPath "$INSTDIR\Proga" Цитата:
Подробности в справке |
Цитата:
Код:
Function .onGUIEnd Цитата:
Код:
!define MUI_CUSTOMFUNCTION_ABORT custom_abort Код:
Function custom_abort |
K.A.V., Спасибо, сам разобрался... Вроде всё сделал как хочется. Теперь осталось добавить ключи тихой установки. Это тёмный лес для меня... :closed-to
K.A.V., Не разобрался... Код:
Function Button |
Цитата:
Код:
nsDialogs::SelectFolderDialog Цитата:
У вас же там написано условие, если error => то пользователь отменил выбор, значит в этом участке прописать удаление папки... |
K.A.V., Я так делал, если выбрать и отменить, то всё работает, если выбор нажать опять, то папка не успевает создаваться и список сбрасывается.
При нажатии ок всё чётко. |
Цитата:
По вашему вопросу: GetParameters GetOptions Цитата:
|
Ставил Sleep 500, не идёт. При нажатии ок всё хорошо, создаётся и удаляется, при нажатии отмена первый раз всё как надо, если выбирать второй раз, то всё, скидывает на папку "Мои документы".
Буду думать... |
Цитата:
Потом вы опять хотите показать этот диалог и ставите папкой по-умолчанию значение $INSTDIR, которое при втором вызове после "отмены" содержит возвращаемое значение после предыдущей отмены, т.е. error |
Так я и не пойму.
Я убирал эти строки, результат тот же: Код:
${If} "$INSTDIR" != error |
Не используйте $INSTDIR как переменную для возвращаемых значений и будет вам счастье
У вас же есть $0-$9, $R0-R9... Код:
Function Button |
Как поменять цвет нижней части инсталлятора/деинсталлятора?
|
Цитата:
|
Как сделать, что бы с ключом /S ни чего не устанавливалось? А с ключом /S /I то что мне нужно. И ключ /D=путь не работает.
Код:
${If} ${Silent} |
Цитата:
Код:
${If} ${Silent} Цитата:
Согласно справки (пункт 3.2.1) параметр /D должен быть последним, путь не должен содержать кавычек. В справке это, вроде бы, не упомянуто: все встроенные параметры пишутся с прописной буквы (/S /D, а не /s /d) |
Цитата:
Код:
${If} ${Silent} |
Если вам сложно ориентироваться в ${If} конструкциях, то лучше на начальном этапе обойдитесь без них, а когда "набьёте" руку и будете легко накидывать большинство кода - можете попробовать снова осилить конструкции с ${If}
В вашем коде не то, что все ключи будут обработаны, а инсталлятор закроется сразу после запуска с ключем /S (тихая установка), по причине, указанной выше - намудрили с конструкцией. Для начала могу посоветовать вам форматировать свой код и писать комментарии (в первую очередь для себя), т.к. частенько при больших размерах кода или из-за недостаточного опыта (да и достаточного), можно допускать ошибки и не видеть их у себя под носом (по личному опыту) Смотрите, как сейчас отрабатывает ваш код (ваша построенная логика): Запускаем с ключем /S Есть ключ /I? Да => Отрабатываю пару команд. Выход из инсталлера Нет => Выход из инсталлера До проверки /P ваш код никогда не дойдёт с тихой установкой Накидаю вам пару одинаковых примеров: 1. Если тихая установка, проверяю наличие сначала ключа I (выполняю команды), затем ключа P (выполняю команды). Если тихая установка, то выход из инсталлера после проверки ключей Код:
${If} ${Silent} Код:
${If} ${Silent} Код:
${If} ${Silent} Код:
Function silent_I_key |
Как удалить папку с деинсталлятором из папки $TEMP?
|
Мне вот больше всего нравится, что многие знают как защитить инсталлятор от распаковки, т.к. сами этим пользуются. Отправляют искать на просторах интернета, а потом говорят что ты этого ни где не найдёшь, и теперь даже не купишь. Это что, секретная разработка какая то? Или вы это купили по цене квартиры? Прям всё желание отбивает что то писать...
|
Цитата:
Если нужно удалить без перезагрузки, то можно сделать отдельный EXE, запускать его со своим ключом, передавая полный путь удаляемого файла деинсталлятора. В коде отдельного EXE, соответственно, нужно будет прочитать значение переданного пути файла деинсталлятора и, поместив в цикл с ожиданием и проверкой существования файла - пытаться удалять файл деинсталлятора Может есть еще какие более красивые методы, не особо интересовался этим вопросом последние "цать" лет :) Цитата:
В официальной справке есть Appendix G: Building NSIS, это вам поможет вам пересобрать билд. На вопрос "Как защитить инсталлятор от распаковки" отвечу вам просто: секретной кнопочки нет, которая бы делала это в 1 клик. Там в исходниках самого NSIS и в заголовочных файлах упаковщиков меняется пара надписей и всё это дело пересобирается. Скажите, лично вы, будете так заморачиваться? Прям вижу, как у вас появилось желание качнуть дистрибутив с исходниками NSIS и какой-нибудь Microsoft Visual C++ 2005... 1. Качаете исходники NSIS 2. Правите нужные файлы в нужных местах 3. Правите файлы заголовочных файлов упаковщиков 4. Собираете свой билд NSIS 5. Его все благополучно вскрывают, т.к. метод всем давно известный Так какой смысл в этой "защите"? |
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Код:
ClearErrors Скрытый текст
Код:
${If} ${Silent} |
AlekseyPopovv, мы уже вам всю обработку с нуля написали, и добавить еще одно условие с ключом /Y - это не сложная задача, учитывая то, как уже разжевана логика проверки ключей+я вам накидал несколько вариантов и пара из них "для новичков" с более простым кодом для понимания.
У меня вот вопрос нарисовывается, а вы вообще пытаетесь вникать в то, что мы тут вам пишем? Или просто копипастите? |
Цитата:
|
K.A.V.
Привет Подскажите, пожалуйста, самый простой способ (без использования winver) определить, что у пользователя установлена Windows10? Может по наличию какого-либо файла, который есть только в Win10? |
Цитата:
Цитата:
Если ключ есть, то следующий код в условии на проверку ключа I - проверка существования ключа Y Если ключа Y нет, то создавать ярлыки Простая логика же. Примеры построения логических конструкций есть в нашем справочнике. Цитата:
1. Можете проверять версию любого системного файла в папке System32 2. Либо в разделе Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion |
Цитата:
|
Цитата:
Это можно сделать так: Скрытый текст
Код:
; Создадим константу, которая содержит Путь установки по умолчанию |
Приветствую, кто нибудь может адаптировать https://nsis.sourceforge.io/mediawik...-in&oldid=6883 под NSIS 3.x
Или подсказать плаг что бы на странице распаковки файлов отобразить bmp/jpg и/или gif, перепробовал кучу на 2.46 работает на третьей версии нет. |
diakov, Под NSIS 3.04 примеры из архива с плагином компилируются, запускаются и отображают всё, что прописано.
|
diakov,
Есть ещё занятный китайский плагин - XZBHelper. Можно организовать в процессе установки слайд шоу из картинок или, как настроишь (время показа и затухания). Кроме того, каждая картинка может являться гиперссылкой на какой либо сайт. Единственное, не то чтобы неудобство, а момент - в инишнике(файл Slides.dat) обязательна "авторская" запись: [_www.xiazaiba.com], остальное редактируемо. Скачать плагин : https://yadi.sk/d/pnunedULcQdcwg Ну, и ессно можно поместить картинку на страницу обычным способом при помощи кучи кода... Примеры были. |
iglezz, я пробовал компилить в этой сборке https://sourceforge.net/projects/nsisbi/, ничего не отображает.
MKN, спасибо, гляну. |
diakov,
Стоило упомянуть, что используется не чистый nsis, ибо в сборках-модификациях поведение может отличаться от стандартного. Как и в этом случае. Сборка по умолчанию создаёт unicode-установщик, который, соответственно, передаёт не-unicode плагину unicode-строки, а не ansi. Как результат - плагин получает абракадабру вместо текстовых строк. Решение 1: Добавить в скрипт атрибут Unicode false Решение 2: Передавать в unicode-установщике ansi-плагину строки конвертированные в ansi. Как это можно сделать
Добавляем в скрипт макрос для перекодировки (вариант не идеальный, но для большинства случаев достаточный):
Код:
!define Unicode2Ansi "!insertmacro Unicode2Ansi" Код:
${Unicode2Ansi} "строка" $переменная Код:
Plugin::Command $переменная Таким образом строка Код:
ebanner::show /NOUNLOAD /HALIGN=LEFT /FIT=HEIGHT "$EXEDIR\wizard.jpg" Код:
${Unicode2Ansi} "/HALIGN=LEFT" $R1 Сокращённый вариант Example.nsi из архива плагина
Код:
;-------------------------------- |
Запускаю приложение командой:
ExecWait "Proga\Proga.exe" В этом приложении есть настройки, которые вступят в силу после перезагрузки приложения, естественно это приложение само выдаёт запрос на перезагрузку приложения. Как сделать так, что бы после перезапуска приложения, оно снова запустилось с моего "*.exe" файла? Либо какой то есть выход с самим процессом "Proga.exe"... |
AlekseyPopovv,
Что имеется в виду под "что бы после перезапуска приложения, оно снова запустилось с моего "*.exe" файла?" ? Какая цель преследуется? |
iglezz,
Всё, спасибо, додумался. |
AlekseyPopovv,
Решением, думаю, стоит поделиться -- может ещё сгодится кому-нибудь. |
iglezz, Придумал сам, может есть что то лучше и проще...
Скрытый текст
Код:
Replay: |
Добрый день. У меня проблема следующего характера. Инсталлятор не может прочитать путь, который указан в переменной по умолчанию. Игра у него установлена, следовательно есть данные в реестре для её удаления и последующего считывания директории.
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, потом его убрал. Ничего не изменилось. Как можно решить или обойти данную проблему? Просто охота, чтобы программа установки самостоятельно искала директорию куда была установлена игра. |
Cyberworm, Такое может быть под 64-бит системой. Путь для InstallDirRegKey надо указывать "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 17470"
|
Цитата:
В данной директории "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 17470" вообще ничего нет, как и самой важной ветки Steam App 17470. Я скомпилировал ради теста твой вариант с Wow6432Node, но это результатов не принесло. |
Cyberworm, Что-то я слона сразу не приметил :)
HKEY_LOCAL_MACHINE\ удалить надо. Какие, кстати? версия NSIS и разрядность Steam и Windows? |
Только что проверил. Как-то непонятно этот InstallDirRegKey работает - из HKCU читает, а из HKLM - нет
Обходной путь - установка значения $INSTDIR в .onInit: Скрытый текст
Код:
Name "RegReadTest" |
Цитата:
|
Всем привет.
Возникла следующая проблема: Необходимо задать картинку в качестве 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" Был бы благодарен за помощь! |
mss307, лучше код привести того, что не получается вместо этих обрывков, ибо есть подозрение на велосипедостроение..
|
Цитата:
|
Цитата:
К примеру, в таком виде у меня вроде всё нормально (a1.bmp - моя картинка) : Код:
!include "nsDialogs.nsh" |
Да, а ларчик просто открывался. Неожиданно, честно говоря. Это так очевидно было?
|
Вложений: 1
Как изменить цвет окна MessageBox?
|
Никак, это системный диалог.
|
Как изменить параметры в *.ini?
Пример: Код:
[Section] Если параметры не равны 5000 и 7000, то замена не нужна Код:
[Section] |
ReadINIStr, WriteINIStr
Примерно так: Код:
ReadINIStr $0 "filename" "section" "param1" |
Может кто знает как сделать, что бы например файл *.png открывался в программе (сама программа программа поддерживает открытие файла перетягиванием) перетягиванием на лаунчер?
Как исполнительному файлу это передать? |
AlekseyPopovv, Если под перетягиванием подразумевается перетягивание файла на ярлык/exe, то
Код:
!include "FileFunc.nsh" |
iglezz, лишние кавычки, обрамляющие имена программы и передаваемого файла, не нужны там?
|
Iska, Это в качестве домашнего задания :)
Если перетаскиваемый на лаунчер файл имеет в полном пути пробелы, то Проводник (и не только) обрамляет его в кавычки. NSIS эти кавычки не трогает, поэтому строку параметров можно передать в исходном виде. А если понадобится несколько указанных в параметрах файлов передать в программу по одному, то тогда понадобится немного подумать над алгоритмом разбора и реализовать его. Или поискать готовый... |
Цитата:
Exec — это в NSIS обёртка над ShellExecute()? Тут: Reference/Exec - NSIS этого нет, но про кавычки — кое-что есть. |
Цитата:
Понимание необходимости обрамлять в кавычки имя запускаемой команды, по моему, уже должно быть, поэтому уточнил только момент с параметрами, т.к. иногда встречаются "особенности" у некоторых представителей двоичного мира (wsh, total commander) |
При Unicode true ругается на !include "ProcessFunc.nsh".
Как быть? NSIS 3.04 |
Цитата:
|
Цитата:
Код:
Command line: |
Определённо, надо или править кодировку скрипта/включаемого файла, или указать её в !include через /CHARSET=***, или методом комментирования/удаления искать сбойные строки в ProcessFunc.nsh.
|
iglezz, не понял конечно ни чего, всё желание уже отбила "эта" программа, теперь даже морочиться с ней не буду. А вам спасибо за помощь.
|
Цитата:
|
Цитата:
Код:
warning: 7998: ANSI targets are deprecated |
Цитата:
Цитата:
|
Привет
Файлы моего инсталлятора в сумме превысили размер 2гб. Соответственно скрипт не компилируется. Ищу решение по архивации файлов, чтобы архивы распаковывались при установке, при этом незаметно для пользователя и без наличия дополнительных программ на его ПК. Всё должен сделать установщик. Понимаю, что тут нужен архиватор, умеющий распаковывать архивы в тихом режиме и его надо включать в дистрибутив инсталлятора. Пожалуйста, подскажите как решить вопрос. P.S. Надо обойтись без bat-ников, так как у многих пользователей они не запустятся из-за включенного UAC. |
Примерно так:
Код:
InitPluginsDir |
Программа запускается через лаунчер командой:
ExecWait "$EXEDIR\${APPEXE}" Вопрос: Как завершить процесс "${APPEXE}", если эта программа на закрывается по нажатию на "крестик", а сворачивается в трей? Цитата:
|
Цитата:
В любом случае, если это делать из лаунчера, надо процесс запускать не через ExecWait, т.к. здесь лаунчер будет ждать завершения ${APPEXE} для перехода к следующей инструкции. |
Всем доброго времени суток.
Подскажите по нубовскому вопросу. Например пишу запустить файл Код:
Exec '"$TEMP\Br Pr\Prrr.exe"' 'Как сделать код с таким условием, "если файл найден, то запустить файл (или например не запускать, а провести с ним другие действия), а если не найден, то вообще пропустить выполнение этого действия" ? |
Цитата:
Код:
IfFileExists "$TEMP\Br Pr\Prrr.exe" Next |
MKN,
Спасибо, но MessageBox MB_OK не нужен, как в таком случае? PS. Все, разобрался, еще раз спасибо. |
Всем доброго времени суток.
Помогите, пожалуйста с реестром. Как привязать реестр к папке установки, ведь некоторые данные указывают в реестре папку установки, ну чтобы не тупо прописать данные, а чтобы они менялись в зависимости от места установки. Как это делается? |
Цитата:
Например, InstallDir "$PROGRAMFILES\MyProg". Это - переменная $INSTDIR, которая фигурирует в скрипте, в частности в реестре. К примеру, WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninstall MyProg.exe" Собственно всё... :) Внимательно читаем "Справочник по NSIS" (ссылка в шапке темы). |
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" В справке ничего по моему вопросу не обнаружил. |
inco1,
InstallDir "любое изменяемое бла-бла". Это "любое изменяемое бла-бла" = $INSTDIR. $INSTDIR используй далее в скрипте, где угодно. Давно бы проэксперементировал и увидел что и как. :) |
MKN, Спасибо. Все просто и доступно. Жаль, что создатели справки не умеют объяснять вот таким простейшим способом.
|
Всем доброго времени суток.
В установщике с помощью ExecShell "open" "$INSTDIR\readme.txt" запускается текстовый документ. Но также продолжают срабатывать все последующие команды. Как нужно сделать, чтобы после запуска этого документа следующие команды в установщике не запускались до тех пор, пока пользователь сам не закроет этот документ. Или это сделать не возможно? |
inco1,
ExecShellWait |
Цитата:
Либо, как ответил iglezz, ExecShellWait, тогда запустится ассоциированная с txt программа. |
iglezz, Спасибо. Это именно то, что мне нужно. Потратил час на поиск в справке и не нашел, а вы мне за 3 минутки.
Begin2Fly, Благодарю. Экспериментну с обеими вариантами. |
Всем доброго времени суток.
Помогите, пожалуйста вот в каком деле. Стоит задача. Если язык в системе русский и на диске D в папке test имеется изображение test.gif , то оно должно показаться на две секунды. С другим языком это изображение не должно показываться. Сделал такой код: Код:
OutFile "Test.exe" Но почему тогда 9 антивирусников пишут всякую всячину по поводу этого файла? virustotal Помогите, пожалуйста поправить мой код, чтобы антивирусники замолчали. Видать они что то видят неправильное в коде. |
inco1,
Эта задача решается сугубо административными методами - обвешивание сертификатами, контакт с разрабами "антивирусов" на тему внесения своего безвредного творения в белые списки и т.п. |
iglezz, С антивирусниками ясно, но думается мне, что не разрешимо. Код сгодиться? Ничего править не нужно?
|
inco1,
Не стоит переносить данные в переменных общего значение ($0..$9, $R0..$R9) между разными блоками кода, они могут потеряться при использовании колбек-функций .onMouseOverSection, .onSelChange или плохо оформленного куска кода, который не заботится о сохранении состояния $0..$9, $R0..$R9. Код получения системного языка по умолчанию лучше поместить в отдельную функцию/макрос (или даже вынести в свой отдельный .nsh): Скрытый текст
Код:
Function GetDefaultLanguageFunc |
iglezz, Спасибо.
|
Если я вас еще не утомил, то, пожалуйста помогите еще с одним вопросом.
Как бы мне этак прописать. чтобы в самом начале запуска установщика была проверка учетной записи, и если учетка "пользователь" или "гость", даже, если запуск с правами администратора, то показывалось бы сообщение, что Вы, мил человек имеете совсем мало прав" и установка закончилась не начинаясь?. |
Цитата:
Код:
Name "UserInfo.dll test" |
MKN, Это то, что нужно. Попробую прикрутить к моему установщику. Спасибо. Этого в справке не видел.
PS. Всё красиво прикрутил, как в поставленной задаче и всё работает. Не ясен один момент, кто такой Power? |
Цитата:
Цитата:
https://docs.microsoft.com/en-us/pre...ectedfrom=MSDN |
Всем доброго времени суток.
Я в тупике. Существует ли способ, чтобы не дожидаясь завершения команды "newadvsplash::show 5000 100 100" сделать переход к следующей команде? Вариант с отдельным экзешником, как то не по взрослому. Может старожилы чего смогут подсказать? |
Цитата:
|
Begin2Fly, Я это пробовал в первую очередь. Пока эта команда не отработает следующая не начинается.
|
Цитата:
Если дадите более полный код, попробую с вашим. |
Да, у вас это работает. Видимо много чего имеет значение. Нужно некоторое время, чтобы собрать все до кучи. Пришлю в личку.
|
inco1, как вариант, можно воспользоваться плагином NsThread и создать функцию с отдельным потоком, в которой будет показываться изображение
Будет что-то типа: Код:
Function ThreadProc |
K.A.V., Спасибо. Begin2Fly предложил простой вариант:
Код:
newadvsplash::show /NOUNLOAD 5000 100 100 -2 /BANNER |
Всем доброго времени суток.
Столкнулся с двумя проблемами. В папке $WINDIR\System32\drivers\ хочу удалить файл .sys. В семерке этот файл спокойно удаляется с помощью макроса и команды: Скрытый текст
Код:
!insertmacro DisableX64FSRedirection В десятке почему то не удаляется. Когда начал пробовать в десятке удалить его вручную, то он пишет, что занят процессом. Но IObit Unlocker показывает, что никаким процессом он не занят и командой "разблокировать и удалить" спокойно его удаляет. Вот такой вопрос, имеется ли в nsis команда типа "снять все атрибуты, разблокировать и удалить", чтобы удалялся в десятке файл, как это делает IObit Unlocker? И вторая проблема. Имеется батник - это вполне рабочий генератор случайного 32 значного кода с записью в нужную область реестра: Скрытый текст
Код:
@echo off Помогите, пожалуйста сделать то же самое, что в батнике только кодом. |
Цитата:
Если "IObit Unlocker показывает, что никаким процессом он не занят и командой "разблокировать и удалить" спокойно его удаляет", то он, скорее всего, чего-то не договаривает (дабы не перегрузить пользователю мозг технической информацией ). Цитата:
Скрытый текст
макрос ${GetRandomHexStringG} OUTPUT LENGTH
Запишет в переменную OUTPUT строку длиной: LENGTH символов для 1 <= LENGTH <= 32 32 символа для других значений Код:
!include "Util.nsh" Код:
${GetRandomHexStringG} $9 10 |
iglezz,
Цитата:
|
inco1,
Код:
${GetRandomHexStringG} $0 32 ; записать сгенерированное значение (32 символа) в $0 |
iglezz, Спасибо, буду пробовать.
PS. Всё отлично работает. Правда буквы заглавные, но это не критично. Спасибо. |
Цитата:
Вот такой вариант генератора позволяет задавать регистр
Код:
!define GetRandomHexStringRL '!insertmacro GetRandomHexStringR x' Код:
${GetRandomHexStringRL} $0 32 ; lowercase |
Для генерации стандартного 32 значного GUID, вроде как достаточно :
Код:
OutFile CreateGuid-test.exe |
iglezz,
Цитата:
Рано я обрадовался. Тот первый вариант, что только с верхним регистром отлично вносит 32 знака в реестр и на семерке и на десятке. Этот вариант с нужным мне нижним регистром вносит 32 знака в реестр только на семерке. На десятке вносит 32 нуля. MKN, А как я могу прикрутить ваш код , чтобы добавлялось 32 знака из цифр и нижнего регистра в нужную ветку реестра? |
inco1,
Очевидно же : Код:
OutFile CreateGuid-test.exe |
MKN,
Это вообще не то. Я же выложил батник, он генерирует такой код d2b7daaed38c3532d7d7aa6895fb96ge iglezz выложил код, который отлично генерит в верхнем регистре 848D8134AB514E70ABE491A6551B5E99 Потом он выложил код с нижним регистром, но который генерит только в семерке, но не хочет генерить в десятке - записывает ноли. Вы выложили код, который генерит следующее {AE68BE6F-43A2-1FB4-423D-D0C358720163} это не то, что я спрашивал. |
Цитата:
x64, version 10.0.19041.264 inco1, Вот библиотечка и скрипт для тестирования. Оно нормально генерирует? Для статистики - какие версии и разрядность на используемых системах (и с рабочим результатом и с нерабочим) |
iglezz,
На семерках 32 и 64 от идима https://i.paste.pics/a21061b1ec34356...40262bc1c2.png На десятках 32 и 64 и 8х64 от монкруса https://i.paste.pics/205de24bee8fd46...7684f39adc.png Десятки 1809 17753.253 про и корпорат. Восьмерка про последняя от монкрус. |
Цитата:
Думаю это гораздо проще, чем городить портянки... Но дело хозяйское... |
inco1, Раз на некоторых системах генерятся нули, лучше на этот метод и не расчитывать, тем более что это функции из крипто апи, которое объявлено устаревшим и когда-нибудь будет внезапно выпилено из актуальных на тот момент систем. Да и не быстрое оно, если часто его дёргать.
|
iglezz, Для моего случая подходит и работает ваш первый вариант с заглавными буквами. Просто хотелось "по честному" :)
|
Вложений: 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: на некоторые вопросы я предполагаю ответы, но хочу узнать у более опытных людей. |
С вопросом выше полностью разобрался самостоятельно.
Оказывается при вызове функции из длл, переменные можно передать как через параметры, так и через стек. Здесь есть официальный пример. https://nsis.sourceforge.io/Examples/Plugin/exdll.c В местном справочнике по NSIS удалось найти зачем. В плагинах файл "System: Вызов функций из внешних библиотек" Как я понял как параметры можно передать ограниченное кол-во переменных, а через стек не ограниченно + через стек безопаснее. Цитирую Цитата:
И отвечая на свои же вопросы для моего примера: 1) В стеке находится то что в него засунули (ДА ЛАДНО?!), ну а именно в моём случае это параметры для функции. Ничего особенного в этом стеке нет. 2) В стек пишет NSIS, но он может доставать из стека например результат внешней функции. 3) Из стека читает функция (она сама разбирает стек и забирает нужное). 4) Стек располагается где-то в системе (не важно где). Он один и он глобальный (для всего процесса) т.е. для скрипта NSIS и всей подключённой либы вместе.. 5) Подробнее про подключение динамических библиотек можно почитать 5.1) официальная документация с примерами "https://nsis.sourceforge.io/Docs/Chapter4.html#plugindlls" 5.2) замечательный хелпер этого сообщества. Ссылка, я думаю излишняя По итогу. Свою проблему решил в полном объёме. Спасибо сообществу за замечательный хелпер без него как без рук уже (он у меня работает не корректно и не отображает содержимое страниц. Приходится доставать оттуда нужные html ручками хз почему, а форум хелпера мёртв). |
Всем доброго дня.
В Messagebox по умолчанию текст выравнивается по левому краю. Применив right можно выравнять по правому краю. А center не работает. Покажите , пожалуйста, как центрируются слова и предложения в Messagebox. А то применение пробелов для "центрации" как то не серьёзно и не совсем "центрально". |
Цитата:
https://nsis-dev.github.io/NSIS-Foru.../t-212400.html Или используй спец. плагины или делай свой Messagebox из окна и т.п. |
MKN, по данной ссылке некий DrO в 2005 году писал, что, когда закончит с почтовым плагином, то займется этим.
Дайте, пожалуйста ссылку этого самого спец плагина. |
inco1, Разумнее всего будет забыть про выравнивание по центру в MessageBox.
|
inco1,
Плагин(одну из вариаций самопальной messagebox.dll) однажды встречал у китайцев (на nsisfans.com). Где он там закопан, ищи уж сам. Есть еще интересная малюсенькая прожка Wbox.exe (www.horstmuc.de ). В ней точно есть центровка текста и много чего ещё. Теоретически можно приспособить в NSIS, если разобраться как приладить Callback... Но, ИМХО, в такой возне, смысла нет... |
Вложений: 1
Цитата:
Цитата:
Может быть, были более свежие версии, но у меня на диске сохранилась только эта, ибо много чего качал, когда начинал знакомство с NSIS... Что касается решения вопроса, то MKN выше уже вам дал ответ: Если так сильно нужна центровка текста, то делайте свою DLL и в ней создавайте свой диалог через WinApi функцию DialogBox с использованием заранее созданного ресурса с окном, присвоив стиль SS_CENTER Static-элементу, в котором будет располагаться непосредственно текст вашего сообщения |
Всем добрый вечер.
Вот опять застрял в одном деле. Имеется известная служба "AdobeARMservice". Подскажите, пожалуйста, как можно изменить тип запуска с "Автоматически" на "Вручную" ? |
inco1, sc config SERVICE_NAME start= demand через nsexec
|
iglezz, Спасибо. Это именно то, что нужно.
|
Привет. Подскажите, пожалуйста, как модифицировать данный код, чтобы кроме 1920*1080 добавить второе возможное разрешение по принципу: если у пользователя разрешение 1920*1080 или 1366*768, то продолжаем установку, если любое другое - аборт.
Не получается сопоставить логическую конструкцию. Код:
Function .onInit |
Serg866, Например, так:
Код:
System::Call 'user32::GetSystemMetrics(i 0) i .r0' ; Ширина в пикселях (основного дисплея) |
Всем доброй ночи.
Тут вот такое дело. Смотрю в CCleaner в "Запланированные задачи", там много всякой всячины. Такой вопрос: есть ли в 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 |
MKN, Спасибо. Наилучшим образом работает это:
Код:
nsExec::Exec 'schtasks /Delete /tn "My Task" /f' |
Здравствуйте. Такой вот вопрос. Если система неким уникумом установлена на диск D.
Будут ли в таком случае работать стандартные переменные? Интересует $PROGRAMFILES. |
inco1,
Будут. Цитата:
|
Всем доброго времени суток. Столкнулся с такой проблемой. Имеется команда "если файл не найден"
Код:
(${IfNot} ${FileExists} C:\test.exe |
Цитата:
|
Begin2Fly,
Ничего я там не понял, да и пример с ${AndIf} один единственный с равенством. Можете дать конкретный пример? |
!include Logiclib.nsh
${IfNot} ${FileExists} C:\test.exe ${AndIfNot} ${FileExists} C:\test1.exe ${AndIfNot} ${FileExists} C:\test2.exe MessageBox MB_OK "дыр-дыр-дыр" ${EndIf} |
Begin2Fly,
Спасибо, ну я и лошара. |
Кто подскажет в чем причина?
То, что крокозябрами должно быть Русским. Может кто сталкивался. ![]() PS: Вопрос снят, решение найдено. |
Цитата:
|
Serg866,
Ух.. Мой косяк :( ${OrIf} надо заменить на ${AndIf} |
Подскажите, как узнать, на какой странице прервалась работа инсталлера, чтобы отправить событие в аналитику. OnUserAbort же не дает такой инфы? (если уместно, я бы попросил возмездной помощи в целом по установке)
|
Hoha,
Можно объявить переменную и использовать callback-функции страниц для установки в эту переменную некоего значения, по которому в .OnUserAbort можно будет определить точку, на которой пользователь захотел выйти. |
iglezz, Спасибо!
Есть еще проблема с накладыванием текста по требованиям свободного места на диске после каждого измнения пути установки. ![]() Сечас решили как Function .onVerifyInstDir LockWindow off FunctionEnd |
Hoha, непонятно что за проблема с накладыванием текста. Тут надо пару скринов/анимация проблемы или компилируемый кусок скрипта.
|
Напомните пожалуйста, есть ли простой способ(код в одну строку :) ), чтобы удалить файлы из каталога, НЕ УДАЛЯЯ сам каталог ? (Что то мне кажется, что такового не существует в NSIS...) В две строки - удалив каталог с файлами и создав вновь- это как то топорно...
|
MKN, Delete "$DESKTOP\*.*"
|
AlekseyPopovv,
Мдя... Видел же в "Справочнике", под названием - "Удаление всех файлов с рабочего стола". Даже в голову не пришло, что оно и есть... :) |
MKN, но обратите внимание, что таким образом удалятся только файлы, папки останутся на месте.
|
MKN, Я сразу понял что что то не то тут... :)
|
Begin2Fly,
Действительно, любопытное поведение... А для удаления и папок, вроде как макрос какой то был... |
Есть ли способ создать файл *.ini в кодировке UTF-16LE?
|
Цитата:
UTF-16LE BOM: Код:
FileOpen $0 ИМЯ_INI_ФАЙЛА w Код:
FileOpen $0 ИМЯ_INI_ФАЙЛА w MKN, Ещё вариант в две строки :) Код:
SetOutPath DIR |
Цитата:
|
Вложений: 1
К сожалению, из ссылки справочника NSIS_Help-1.5.chm, до сих пор загружается устаревшая версия ProcessFunc.nsh для NSIS 2.XX размером в 13.7 КБ.
Обновленная последняя версия ProcessFunc.nsh для NSIS 3.XX, имеет размер 12.8 КБ и здесь на сайте находится на нее ссылка на яндекс-диск. Сразу я ее не нашел, поэтому и обратился к автору ProcessFunc.nsh. |
Вложений: 1
Отыскал полезный док файлик с примерами от kotkovets , как использовать ProcessFunc.nsh
|
Подскажите пожалуйста примеры по использованию SendMessage с ключем WM_GETTEXT.
Примером с WM_SETTEXT очень много, а с этим ни одного не нашел |
murlocks,
Для WM_GETTEXT и других сообщений, которые возвращают значения в wParam/lParam, встроенная инструкция SendMessage не подходит. Но можно воспользоваться плагином System. Пример, читающий текст с кнопки Next/Install/Close
Код:
GetDlgItem $0 $HWNDPARENT 1 Функция 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. |
Задача: узнать какие разрешения(права доступа), кто владелец конкретного ключа реестра ?
Первым делом попробовал имеющийся известный инструментарий - AccessControl plug-in с заявленным : Цитата:
Код:
!addplugindir . Или я что то не так делаю, или плагин... Также интересно, как можно использовать для этих целей RegGetKeySecurity фунукцию ? У кого какие соображения ? |
MKN, Формат вызова неверный
GetRegKeyOwner <rootkey> <regkey>
Код:
GetRegKeyOwner <rootkey> <regkey> Следовательно: Код:
AccessControl::GetRegKeyOwner "HKLM" "SYSTEM\ControlSet001\Control\AGP" |
Цитата:
|
MKN, Оно как-то странно работает или плохо документировано.
Скрытый текст
Для кода
Код:
AccessControl::GetRegKeyGroup "HKCU" "Software\7-Zip\" Код:
HKCU:R1: Software\7-Zip\ К тому же у этого плагина не очень с обработкой ошибок, судя по моему непрофессиональному взгляду в исходники. |
iglezz,
Значит этот плагин не годится... ( Придётся пользоваться PS, там с этим всё чётко, ну и можно "прикрутить" к Nsis... ) |
Всем привет.
У меня такой вот вопрос. Я, например, извлекаю реальное место установки программы так Код:
ReadRegStr $R9 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\test.exe" "Put" Можно ли как то прописать, чтобы указать дополнительное извлечения места с другого раздела. Код:
ReadRegStr $R9 HKLM "SOFTWARE\test" "Put" Нужно взять с первого раздела, а если раздел не найден, то со второго, но обязательно в одну переменную, например $R9. Если один из разделов или оба не найдены, то уведомление об этом не нужно. Как вот такое сотворить? |
inco1, Нужно просто последовательно читать необходимые значения, с прерыванием последовательности в случае успеха.
В простейшем случае с проверкой на пустое/несуществующее значение: Код:
ReadRegStr $R9 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\test.exe" "Put" |
iglezz, Спасибо, это то, что нужно. Все просто и работает.
|
...подскажите как сделать так чтобы nsis отсылал запрос на iplogger!?
Хочу получать статистику о запуске моего софта. |
pckassa, коли так — ну, так и делайте сие «в моём софте», а не в инсталляторе.
|
Это рекламная кампания.
Я пускаю траффик и мне нужно отслеживать конверт. В сам софт я лезть не имею права, да и откровенно говоря я дуб-дубом в коде, элементарный NSIS скрипт Еще могу написать, кое как, но не более... В общем нужно сделать именно так. Вдруг есть решение, подскажите пожалуйста! |
Всем желаю здравствовать.
У меня опять проблема. Подскажите, ну никак не могу решить. Делаю простейший экзешник, который вносит настройки в некую программу и добавляет в папку с этой программой текстовый документ. Настройки этой программы для каждого конкретного пользователя в реестре в ветке HKEY_CURRENT_USER. Вот код: Код:
Unicode true Если применить вот такой код: Код:
Unicode true Что я делаю не так? В идеале нужно, чтобы запустить экзешник и настройки добавились всем пользователям данного компьютера. Но ничего подобного я нигде не нашел. |
inco1,
Под какой версией/разрядностью Windows дело происходит? |
iglezz, Доброго вечера.
Испытывал на 10х64. Параметры контроля на низу ползунка. Добавлено. Пробовал на 7х64 с двумя пользователями админ и одним простым с включенным контролем ползунок по рекомендации. Простой пользователь отдаёт настройки реестра программы тому админу от кого получает разрешения. Как то это не правильно. |
inco1,
В первом случае всё понятно и правильно - установщик запускается от имени пользователя с админскими привилегиями и CURRENT_USER здесь уже не наш пользователь, запустивший установщик. Во втором случае тоже всё правильно - нефиг пользователю в системных папках делать, чай не 90-е на дворе :) Для внесения изменений в реестр сразу всем пользователям можно воспользоваться готовым решением в виде EnumUsersReg.nsh |
iglezz, Спасибо. Это именно то, что я искал. Путем нехитрых подстановок в мой тестовый экзешник получилось следующее:
Код:
Unicode true На работу это предупреждение не влияет, но может можно как нибудь его убрать, чтобы совсем по правильному было? |
Цитата:
|
MKN,
Спасибо. С этим разобрался. iglezz, Появилась попутная проблема. Это работает как надо: Скрытый текст
Код:
Unicode true И это работает как надо: Скрытый текст
Код:
Unicode true Но вот незадача, не работает первое и второе вместе. Скрытый текст
Код:
Unicode true При компиляции ошибка !include "EnumUsersReg.nsh" или !include "ProcessFunc.nsh" , в зависимости, что первой объявить. !include "EnumUsersReg.nsh" и !include "ProcessFunc.nsh" не совместимы? Или я что то не так слепил? |
inco1, Причина ошибок - одинаковые !define
По хорошему надо и в EnumUsersReg.nsh и в ProcessFunc.nsh добавить Код:
!include Win\WinNT.nsh |
iglezz, а разве в NSIS не пользуют какие-нибудь !IFNOTDEFINE и т.п.?
|
Iska, это можно, но на перспективу лучше не плодить сущности..
|
inco1, Модифицированные EnumUsersReg.nsh и ProcessFunc.nsh, которые не конфликтуют.
|
iglezz,
Спасибо за модификацию. Сейчас все компилируется и работает. Экзешник сделал через MessageBox MB_YESNO. YES - установка, NO - не установка. И тут опять проблема по моему незнанию. Как прописать, чтобы и Function CallbackFunction подчинялась кнопке NO. А то получается. если кликнул YES, то все правильно устанавливается. Ели кликнул NO, то файлы-майлы и прочее, как и требуется не ставится, а настройки в реестр все равно прописываются, ведь они в Function CallbackFunction, а MessageBox MB_YESNO в Section. |
inco1, Call CallbackFunction
|
iglezz, Спасибо. Вот теперь работает так как было в моих планах.
Какое же все таки классное решение EnumUsersReg.nsh, хоть и мало востребованное. Но для компьютеров с пользователями в пол аула с одинаковыми задачами это самое то. |
inco1, мало востребовано, ибо сценарии обычно простые - установка только текущему юзеру или общесистемная установка и дальше пользователь сам всё настраивает. Сложные сценарии - это, в основном, либо корпоративщина (а там - Windows Installer), либо плохо спроектированный софт, либо недостаток информации/знаний о продукте у собирающего установщик, либо сборки с включением разнообразных хотелок создателя/пользователя сборки.
Конкретно в образце выше точно есть необходимость писать в пользовательскую ветку? Это уместно, если - Акробат не в состоянии читать из HKLM при отсутствии настройки в HKCU - необходимо изменить уже имеющийся параметр у пользователя |
iglezz,
Что касаемо Акробат, то это именно тот продукт, где все его настройки хранятся отдельно для каждого пользователя в HKCU. После установки и настройки акробата, если зайдет другой пользователь, то все настройки для него будут по умолчанию пока этот пользователь их под себя не настроит. Что касаемо меня, то в связи с обилием свободного времени начал экспериментировать. Была для себя поставлена задача, чтобы в идеале один пользователь мог изменять HKCU другого или вообще всех. С вашей лёгкой подачи задача, которую я ставил для себя успешно разрешилась. В виду моего полного отсутствия знаний NSIS, да и всего остального для меня это очень важно. Вы, наверное программист или преподаватель, к чему я больше склоняюсь. Ваша помощь всегда корректно подается без рассуждений о пользе справке, как некоторые, не намёками, а конкретно. Еще раз благодарю вас за помощь. P.S. В личку отправил полный сценарий, что я сделал. |
Цитата:
Цитата:
Цитата:
|
Iska,
Я писал о акробат. Он написан, ну никак не криво. При первом запуске любого пользователя подтягиваются настройки по умолчанию. Но все дело в том, что по умолчанию. Изменение этих настроек, а их огромное множество, как раз и пишется только на того пользователя, который их совершает. Я не зря написал. что "для компьютеров с пользователями в пол аула с одинаковыми задачами". Если одним кликом можно нескольким пользователям дать идентичные настройки программы, то что в этом криминального. Суждения о пользе EnumUsersReg.nsh так и останутся суждениями. Другое дело, что в NSIS нету возможности прописать в инсталляторе, чтобы запуск мог произвести только админ. Все, что есть сработает только на висте и семерке с выключенным контролем учеток. |
inco1, для этих целей есть домен и политики. А то, что пытаетесь сделать Вы — называется иначе.
|
Цитата:
Цитата:
"Учите мат.часть" или работайте в Windows XP, где еще не было "такой сложной системы", с чего бы под юзером вам операционная система должна давать доступ в Program Files? В новых ОС это уже давно заблочено на уровне системы от шаловливых ручек, нужны права на запись в Program Files - дайте права админа программе Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Надеюсь, вы хоть виртуалкой/бэкапами пользовались, когда этот код тестировали, шерстя реестр всех юзеров? Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
В личных сообщениях он мне уже "доступным языком пояснил", кто я и что я должен сделать со своим "справочником" по NSIS |
K.A.V., боже, боже… :shot:
Вот так и теряешь веру в человечество. |
Господа товарищи. Прочитал весь форум, но так и не понял, как добиться уведомления для пользователя без прав, что установщик типа не для него и далее quit. Для пробы Win10 32, ничего не работает из того что здесь и в справке. Установщик все равно лезет устанавливать, появляется окно от имени админа, а мне нужно чтобы тупо quit. Что нужно написать в скрипте?
|
Цитата:
Попробуй так : Код:
OutFile "IsUserAdmin-test.exe" |
MKN, Скомпилировал ваш скрипт без изменений. Не работает. Точнее работает, но сначала появляется окно от имени админа и по нажатию да выдает "Есть права администратора". Все так же как и с другими способами.
|
Цитата:
|
iglezz, Если добавить RequestExecutionLevel user в тест от MKN то для пользователя без прав пишет правильно "Нет прав администратора". Но админу тоже пишет "Нет прав администратора". Что не так.
|
Цитата:
IsUserAdmin() возвращает 1 при наличии админских привелегий |
iglezz, Я же написал, если добавить RequestExecutionLevel user в тест от MKN.
Код:
OutFile "IsUserAdmin-test.exe" если изменить на RequestExecutionLevel admin то админу пишет "Есть права администратора", а у пользователя появляется окно разрешения от имени администратора. Почти голая десятка лицензия. Никакие твики шмихи не применял, ничего не регулировал. Как есть с установочного диска. Попробуйте сами, если не верите сниму видео. PS. Нашел код UserInfo::GetAccountType. Все точно так же. |
Путем тыка обнаружил, что адекватно себя ведет тест, если применить RequestExecutionLevel highest.
Админу пишет "Есть права администратора", пользователю "Нет прав администратора. До свидания !". Если же пользователю тест произвести правой кнопкой мыши "Запуск от имени администратора" то только тогда появляется окно от администратора. Вроде все правильно и адекватно. Но теперь мне не понятно какие привилегии потеряет установщик с RequestExecutionLevel highest в отличие от RequestExecutionLevel admin. |
Цитата:
Цитата:
В описании RequestExecutionLevel есть ссылка на статью MSDN с подробностями. user == asInvoker highest == highestAvailable |
Хотел подытожить. Для многих будет очень познавательно. Три рабочих примера.
Пример 1
Код:
Unicode true Пример 2
Код:
Unicode true Пример 3 для конкретики для кого запрет
Код:
Unicode true Эти примеры объединяет RequestExecutionLevel highest. По другому это совсем не работает. Есть нюанс. В виста и семь с выключенным UAC - это когда системный настройщик уведомлений в крайнем нижнем положении и в восемь и десять с полностью выключенным UAC - это когда системный настройщик уведомлений в крайнем нижнем положении и нужные отключения в реестре. В этом случае пользователи без прав не смогут запустить установщик, не двойным кликом, не от имени администратора. Как в ХР. Если же системный настройщик уведомлений будет в другом положении, то пользователь без прав не сможет запустить установщик двойным кликом, но все же сможет запустить его от имени администратора. Простыми словами: добиться Quit для пользователя без прав для установщика с большими привилегиями с включенным UAC не возможно. Исходя из того, что я написал эти коды на практике мало полезны. Зря потратил два дня на обобщение всего этого. Почему тогда этого нету в справке? Поправьте меня, если я ошибаюсь. |
динозавра, может, потому, что это достаточно странные хотелки?
|
Iska, Не понял вопроса? В чем странность? В том, что в справочнике устаревший код, который работает только в ХР и об этом ничего не указано? Или в том, что я хочу сделать установщик, который бы не запускался с малыми правами пользователя без всяких от имени? Или странность в том, что я первый об этом очень подробно написал?
|
динозавра,
Во-первых, второй пример не работает, т.к. после System::Call setupapi::IsUserAdmin()i.r0 в стеке ничего не появится и дальнейшее не имеет смысла. Цитата:
Серьёзно -- или система криво затвикана, или в исходных данных где-то ошибки. Цитата:
Пока вижу, что выложенные скрипты для полноценного тестирования условий запуска и получаемых результатов не содержат. Так-же подозреваю, что решать-то надо совсем другую задачу. Стоит её озвучить. Ибо происходящее похоже на типичную XY-проблему. XY-проблема
|
iglezz,
Цитата:
Цитата:
Цитата:
Юмор ценю. Спасибо. Чуть не забыл, вот видео, как в стеке ничего не появляется и дальнейшее не имеет смысла https://streamable.com/9hr0vi |
Цитата:
Цитата:
Цитата:
Для начала стоит конкретизировать условия (мини-ТЗ) и только потом уже подбирать решение. Если будет необходимость продолжать реализацию на UserInfo/IsUserAdmin, то предварительно следует изучить вывод этих команд при разных условиях запуска без условий {If/Else} -- тупо вызвать, забрать значение и вывести его в DetailPrint/MessageBox). А потом ещё, по-хорошему, следует проверить и наличие конкретных привилегий у пользователя (на запись в фс/реестр, ...) ... Ради чего это всё? Оно точно надо? Может всё-таки подобрать более популярное решение? Цитата:
|
iglezz,
XY-проблема. Читал углубленно. Напишу как было. При неком разговоре один грамотный человек мне сказал следующее: "Для инсталлятора с высокими правами, который будет применяться в системах с включенным UAC не существует железного способа автоматической отмены установки, если пользователь оказался с малыми правами. Это закончилось в эпоху ХР". Объяснять он не стал, господь не дал ему такой способности. Я насобирал в инете примеров авто отмены по привилегиям и решил доказать обратное. Но, увы все оказалось истинной. Потом я задал вопрос здесь, в надежде, что тут уже чего то придумали. Но тут началось обсуждение проблемы Y вместо X, на основе Z, почти не касаясь X. Подтянутся знатоки с регалиями, и не прочитав или не поняв фразы, которую сказал мне один грамотный человек подытожат XY на основе Z. Проще говоря весь смысл сведется к "сам дурак". Так что вопрос исчерпан. ЗЫ. Если у меня с вами проблема XY происходит по недоразумению из-за моей глупости, то в мировой политике сплошь и рядом и преднамеренно. Это шутка. Общие Правила конференции не нарушены. |
динозавра,
Цитата:
Конкретно эта формулировка не имеет смысла, т.к. в случае установщика, требующего админских прав, будет запрос UAC на старте. Прошёл - теперь права точно есть, установщик запускается и спокойно отрабатывает. А нестандартные сценарии должны быть головной болью админа системы, не сборщика установщика. А в случае установщика, которому где-то внутри нужны админские права, проверка прав ведёт к всё тому-же UAC, т.к. до него о наличии прав у пользователя достоверно неизвестно. Внутри установщика интересоваться админскими правами имеет смысл для ситуации, когда кроме обычной многопользовательской установки предлагается установка "только для текущего пользователя", установка портативки, и есть желание не дурить пользователю голову UAC'ом в этих случаях. Для этого есть в стандартной поставке плагин UAC. Цитата:
Цитата:
|
iglezz,
Цитата:
У вас не XY-проблема, а проблема начальника Философствуйте дальше. |
Вложений: 1
Ну вы даёте, ребята :o
Не в обиду будет сказано, но всё то, что выше описал динозавра о якобы некорректном коде с IsUserAdmin и RequestExecutionLevel прямо говорит о небольшом непонимании, как это всё работает. Может, вся проблема в том, что человек просто не понимает, для чего нужно RequestExecutionLevel/манифест и что происходит, когда он "повышает" права через 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" 4. При запуске установщика определяем тип учетной записи и имя пользователя, если нужно для дальнейших извращений - где-нибудь сохраняем 5. В нужном месте запускаем сами себя с просьбой о повышении прав Код:
${ShellExecEx} $0 'runas' '"$EXEPATH"' '' '' '' 2 Могу предположить, что такой метод, как вариант, может использоваться в установщике, где только 1 выборочный компонент из 10 требует повышения прав и не всегда необходимо тыкать пользователю о необходимости админских прав Или я тут жути нагнал и не понял, о чем вы? :dont-know |
Цитата:
… 3. Антон (админ) => RequestExecutionLevel admin => В скрипте: Антон (IsUserAdmin == 1) — так должно работать? |
Цитата:
|
K.A.V., спасибо, ясно.
|
Не могу сообразить! Подскажите, пожалуйста.
Нужно найти строку, например, 127.0.0.1 www.somesite.net в файле hosts и если строка существует, выполнить действие не связанное ни с найденной строкой, ни с самим файлом. |
Цитата:
|
Цитата:
Лучше использовать NewTextreplace плагин (поддерживает utf-8, utf-16LE / BE и все ANSI) : Код:
OutFile "NewTextReplaceTest.exe" |
Подскажите пожалуйста, как лучше (и попроще) реализовать такую задачу ? :
На кастомной странице есть созданное новое окно или область ListBox + разные элементы (чекбоксы, кнопки...). Необходимо, при наведении указателя мыши или курсора на какой либо элемент(например на чекбокс) послать в это окно или ListBox(отобразить в нём) некую информацию (из переменной) на время "наведения" (если указатель перемещён с элемента, инфа исчезает). Нечто по аналогии с выводом ToolTips, только не во всплывающем окне, а в имеющемся. ps Попутно вопрос - в ToolTip плагинах (ToolTips.dll или nsTips от kotkovets ) всплывающее сообщение через некоторое время закрывается-исчезает. Можно ли этого избежать ? (Т.е., пока курсор или указатель мыши находятся на элементе, сообщение "удерживается" на месте.) |
K.A.V., здравствуйте. Спасибо за разложенный по полочкам ответ. Все просто и в доступной форме.
Я сумел связаться с человеком из-за фразы, которого произошел весь этот сыр - бор. Напомню ее: "Для инсталлятора с высокими правами, который будет применяться в системах с включенным UAC не существует железного способа автоматической отмены установки, если пользователь оказался с малыми правами. Это закончилось в эпоху ХР". Я дал ссылку на мои попытки объяснить. Вот его ответ. В начале были смайлы смеха: "Настаиваю! Невозможно сделать установщик с высокими правами с предоставленными примерами кодов , чтобы запустил его бесправный пользователь при включенном UAC и всплыло инф. сообщение "Нет прав администратора. До свидания !", после которого последовала бы команда quit и произошло завершение. Такое с включенным UAC сделать не возможно. Система переберет права на себя и чихать она хотела на ваше написанное MessageBox MB_OK "Нет прав администратора. До свидания !" и следующее за ним quit. Такой фокус закончился в ХР. Ты в теме не верно задал вопрос, следовательно получил множество толкований не по сути. А суть я выше описал. Тебе должны были кратко ответить, что никакого сообщения и завершения с включенным UAC не будет. Точка. А тебе начали рассказывать о принципах работы контроля учетных записей. Я сейчас "на пальцах" тебе докажу, что те коды не рабочие и рабочие. В зависимости, что подразумевать под термином "рабочие". И так. Первый пример. Если ты в код пишешь проверку на "бесправного" с сообщением и завершением, а "бесправный" с включенным UAC сообщение не увидит, и завершение не произойдет значит код не исполнил записанные в нем действия. Код не рабочий. Точка. Второй пример. Если ты в код пишешь проверку на "бесправного" с сообщением и завершением и система правильно определила "бесправного", но проигнорировала заложенное в коде сообщение и завершение, тем самым дав возможность продолжить установку от админа, с условием, что запись админа не под паролем. Система предусмотрела, что админ с отсутствием пароля может доверять "бесправному". Код рабочий. Точка. Умная система игнорирует примитивный код." Лично я все понял. Действительно доступно и без высоких материй. А я считал, что этот человек совсем не умеет объяснять. Вопрос закрыт. |
Цитата:
Могу предложить вариант с помощью создания функции с таймером, в которй будем определять положение курсора и решать, что делать дальше, в зависимости от того, над каким элементом сейчас находится курсор Цитата:
о, готовый код
Код:
!include "nsDialogs.nsh" ps Красоту и качество кода не гарантирую, уж простите, давно этим не занимался |
Добрый денечек. Много лет читаю эту замечательную темку. Образования в этом деле не имею. Но с темы по мелочам все понятненько. Несколько раз делал шутки в виде сообщений в несколько ходов с вопросами и подсовывал их жене вместо ее браузера. Во смеху было. А сейчас совсем я в непонятках с этими RequestExecutionLevel. Такой вопросик. Какая получается разница если установщик позначен RequestExecutionLevel highest или RequestExecutionLevel admin. Интересует чтобы мой файлик смог сделать то что делает администратор. Для этого нужно только обязательно RequestExecutionLevel admin? Или подойдет RequestExecutionLevel highest? Как я понял в установщика с RequestExecutionLevel admin самые высокие права. Тогда какие функции теряет установщик с RequestExecutionLevel highest в сравнении с RequestExecutionLevel admin? Совсем не понятно. Если не тяжело, пожалуйста объясните простенько. Спасибочки.
|
Простая (казалось бы...) задача : Нужно определить наличие ключей в реестре.
ОС Windows 10 (20h2) x64, ключи : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsSelfHost\UI\Visibility HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender\Spynet Не тут то было... Права доступа похоже не при чём (да и вроде как не нужны для этого...). Пример, который нормально работает (проверял в W7) с "крутым" владельцем другого ключа ( с TrustedInstaller) : Код:
!addplugindir . В чём дело ? Кто "охраняет" конкретно эти ключи ? У кого какие соображения ? ps к слову сказать, эти ключи не находятся при получении ACL, и при использовании команд PowerShell, и при работе с subinacl.exe... |
Цитата:
Примерно таким макросом можно оформить проверку: Код:
# macro + def |
Цитата:
И я вроде как "выудил" эти ключи из реестра, в том же виде, какими они и были в x64... Или в рег-плагине необходимо конкретно указывать на разрядность ОС ? (в доке этого не видел...) Вероятно забыл про SetRegView 64... и как быть с репликой из ps ? |
MKN,
Да, в 32 битных их нет. Это легко увидеть, если открыть 32-битный %WINDIR%\SysWOW64\regedit.exe Ключей WindowsSelfHost и Windows Defender там не будет. Что до плагина, то он староват и не в курсе про реестр в x64. "В крации", реестр в x64 состоит из трёх загончиков (общий, 32бит, 64 бит), и для доступа во чужой загончик надо использовать волшебное слово при использовании функций WinAPI. Плагин таким фокусам не обучен, add: но на него действует SetRegView 64 Цитата:
|
Цитата:
Цитата:
|
Цитата:
Для остального можно дёрнуть ключ отдельно в 32 и 64 бит режиме и сравнить выхлоп. Даже батничком на `reg query %REGPATH% /ve` можно реализовать. Цитата:
|
Цитата:
Цитата:
Хотя AccessControl plug-in с большим трудом всё же упросил доработать, но нужный инфо-вывод в SDDL формате... Надо как то парсить-расшифровывать. Одна морока... |
MKN, Вот такой макрос получился
nsis RegKeyExists
Код:
# RETURN value: Если есть необходимость знать точно, существует ключ для 32 или 64 бит процесса, то чуть сложнее будет Внезапно оказалось, что SetRegView 64 благотворно влияет на плагин registry. Код:
${registry::KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender\Scan" $1 Цитата:
|
Цитата:
Цитата:
ps А что делает SetRegView lastused, если популярно разъяснить ? Возвращает в исходное состояние чтение\запись из\в реестре ? Т.е. всё равно это эквивалентно записи SetRegView32(64) в нужном месте кода ? |
Цитата:
Скрытый текст
для команды
Код:
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 По SetRegView: При выполнении SetRegView 32|64 предыдущее состояние (32/64) сохраняется и с помощью SetRegView lastused его можно восстановить обратно. |
Появилась UNICODE версия NSIS Simple Service Plugin
https://nsis.sourceforge.io/mediawik...icode_1.30.zip |
Здравствуйте
При установке обновлений для моего приложения, проверяется хеш-сумма файла (использую плагин md5). Возникла необходимость этот файл изменить, но при этом сохранить возможность установки уже выпущенных дополнений. Соответственно нужно изменить проверяющийся файл, сохранив его хеш сумму. По байтам размер останется прежним. Можно ли реализовать такую задачу и что вообще можно сделать в данной ситуации? Заранее спасибо! --- Сохранить хеш-сумму файла, скорее всего, не получится. Может как-то повлиять на проверку хеш-суммы в уже выпущенных инсталляторах, чтобы она в них не срабатывала на этом файле после того как будет установлена новая версия основной программы с обновлённым файлом. То есть в новую версию проги надо что-то включить, что могло бы запретить предыдущим инсталлерам выполнять проверку md5 конкретного файла. Проверка реализована так: задана хеш-сумма, если файл ей не соответствует, то аборт установки. А теперь, так как этот файл будет обновлен, юзер не сможет установить ранее выпущенные дополнения поверх новой версии основной программы. Вот и думаю, как сохранить хеш, либо что-то внедрить, чтобы проверка хеша не выполнялась (игнорировалась). Использовался MD5 plugin, код проверки: md5dll::GetMD5File "$INSTDIR\upd0.vers" Pop $0 ${If} $0 != "B30912CF87B0AC002A350AB8BD2314CE" MessageBox MB_OK|MB_ICONSTOP "Ошибка!" IDOK Quit |
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. |
MKN, патчи для инсталлов - не вариант. Если я правильно понял функции этих плагинов.
О подделке хеша я читал статьи (на Хабре есть статья 'Забавляемся с хешами'), но в моём случае хеш-сумма задана и надо точно такую же сделать на отредактированном файле (конкретный хеш, а не рандомный). В статьях я ничего не нашёл об этом. |
Serg866,
Я предположил, что инсталлятор "базовой" твоей проги тобой и написан. Патч входит в обновление и запускается первым изменняя базовой инсталлятор так, чтобы в нём отключилась проверка хэша. После чего запускается базовая установка и обновление. Или всё не так ? :) |
Непонятна логика обновления. Зачем "обновлять" новую версию старыми обновлениями? Или это не обновления, а какие - то файлы, сопутствующие основному исполняемому файлу?
|
MKN, Kopejkin, есть основная программа, есть дополнения для неё (и то, и другое сделано мной). В инсталлерах дополнений встроена проверка хеша. Но так как в новой версии основной программы проверочный файл изменится, то ранее выпущенные дополнения не смогут установиться поверх новой версии. А надо сделать так, чтобы устанавливались. При этом нужно обойтись без какой-либо правки инсталлеров дополнений, так как они давно выпущены и скачаны большим количеством пользователей.
|
Serg866,
Если файл "$INSTDIR\upd0.vers" не сильно большого размера, то можно обойтись костылём в виде сервисной программы типа "Установка дополнений от х.хх на новую версию х.хх", которая подменит новый upd0.vers на старый на время установки дополнений. |
iglezz, а как файл после подмены вновь заменится на новый? Это надо пояснять юзерам. С таким костылем может получиться так, что будет старый файл, а версия программы - новая. И наоборот. Тогда программа будет неправильно работать.
|
Serg866, как вариант: оставьте старый файл для совместимости и введите с последним обновлением ещё один, внеся соответствующие изменения в программу.
|
Цитата:
|
Begin2Fly, не получится, так как старый файл должен быть заменен на новый под тем же именем.
iglezz, у меня инсталлеры программы и дополнений построены таким образом, что исключены варианты, при которых юзер может произвести установку неправильно. В случае с костылем, такие варианты появляются - не нажмет кнопку 'дальше', закроет костыль раньше времени. Пока не вижу таких проверок, которые могли бы исключить ошибку со стороны юзера при взаимодействии с костылем. Но, будем думать) |
Ничего не придумал, костыль может ухудшить ситуацию при ошибке пользователя, поэтому тоже не вариант.
|
А каков размер этих дополнений? При нынешнем интернете гигабайт туда, гигабайт сюда - роли не играет. Объявляете своим преданным пользователям о глобальном апдейте, все (или не все, если нужно) актуальные дополнения пихаете в один новый инсталлятор без проверок контрольной суммы основного исполняемого файла. Проверки наличия файла с названием вашей программы будет вполне достаточно.
Код:
Function .onVerifyInstDir |
Kopejkin, главный исполняемый файл (ехе инсталлятора) никак не проверяется. Речь о проверочном файле, с которого считывают хеш-сумму инсталлятоы дополнений. В новой версии программы проверочный файл заменяется, соответственно дополнения не установятся поверх новой версии программы, ибо файл будет с другой хеш-суммой. Ищу вариант как сделать так, чтобы устанавливались, так как технически и с новым файлом дополнения совместимы.
|
Так я ж предложил...
Цитата:
Чаще всего, простое решение лучше сложного. P.S. можно ссылку на софт. Или это что-то слишком специализированное? Если не для "хомячков", тем более такое решение не вызовет проблем. |
Всем привет!
Подскажите пожалуйста, что не так с кодом удаления ранее установленной версии программы в оригинальном файле "makensis.nsi" находящемся по пути: (..\NSIS\Examples\makensis.nsi)? Судя по коду предоставленном на официальном сайте данный код "как я понял" он работает по поиску идентификатора, а в "makensis.nsi" он работает по версии записанной в реестре. Здесь на форуме нашел ещё один вариант (по поиску указанного файла) с функцией .onInit: Код:
Exec $INSTDIR\uninst-nsis.exe Сам "makensis.nsi" наверное нет смысла выкладывать, так как он идет по умолчанию в директории nsis. |
Adjective,
Цитата:
В 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,
Работает, если правильно собрать. Для текущего релиза это будет команда (текущий путь - ${__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 |
iglezz,
Спасибо, получилось выполнить сборку через командную строку: Код:
..\makensis.exe /DVERSION=3.06.1 /DVER_MAJOR=3 /DVER_MINOR=6 /DVER_REVISION=1 /DVER_BUILD=0 makensis.nsi |
Обновил 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 - всё ок |
MKN, возможно дело в неверно распознанной компилятором кодировки DelRegKey.nsh
По крайней мере у меня 3.08 и 3.06.1 считали этот файл как UTF8 Скрытый текст
Код:
!include: "C:\PortableApps\NSIS308\Include\DelRegKey.nsh" (UTF8) Это лечится явным указанием кодировки включаемого файла Код:
!include /charset=cp1251 delregkey.nsh |
Вложений: 3
Доброго времени суток, товарищи знатоки. Есть вопрос. При переходе с кастомной страницы nsDialog-а на стандартную страницу MUI выбора директории футер ломается в шрифтах и масштабировании. При возврате к предыдущей странице ломается и она. Собственно вопрос - в чем косяк? Что, где, когда искать и чего почитать? Код и скриншоты прилагаю.
Код:
!include nsDialogs.nsh |
Сырок Дружба,
Косяк, в самом проблемном контроле SysIPAddress32. Обходное решение (которое почему то не вошло в состав nsDialogs.nsh): https://nsis.sourceforge.io/NsDialogs_CreateIPaddress В nsDialogs_createIPaddress.nsh необходимо будет закомментировать или удалить строки Код:
!define __NSD_IPaddress_CLASS SysIPAddress32 |
iglezz, понял, принял, пощупал, работает. Благодарю за помощь.
Можно вопрос в образовательных целях. Смысл удаления/комментирования указанных вами строк? Я так полагаю просто для того что бы не было обращения к багнутому контролу; или там повторное использование переменных? Буду признателен за разъяснение. |
Сырок Дружба,
Комментировать/удалять те строчки надо из-за конфликта с этими же дефайнами в nsDialogs.nsh. |
iglezz, понял, принял. Ещё раз благодарю за помощь.
|
Доброго времени суток! Недавно задался вопросом, как определить Windows 11 в NSIS:
Начиная с ранней сборки "утекшей в сеть", в C:\Windows\System32 появился файл ntkrla57.exe. Так что сначала определяю, есть ли ключ в реестре только для 10ки, А потом проверяю, внимание! Не присутствие файла ntkrla57.exe, а его версию: Скрытый текст
Код:
ClearErrors Скрытый текст
Код:
ClearErrors Всё работает отлично! ЗЫ: Пробовал проверять присутствие файла - не работает. Через WMI - нужно получить строку, потом определить, есть ли в строке "11"... В общем, простыня кода. |
S60Team, А не достаточно просто номер сборки глянуть? Вроде десятка до 22000 не поднимается.
В целом для проверки версий есть GetWinVer и WinVer.nsh (текущая версия на гитхабе) |
iglezz, благодарю!
1. У 11ки номера сборок: 21996 и 22000. А вдруг билд 10ки 22H1 будет 22100? 2. Просто не хотелось подключать лишние библиотеки. Об этой версии не знал. ЗЫ: если интересно, исходный код: https://gist.github.com/S60Team/36a48718640205e14b8a068b2b809c1f |
Всем доброго вечера. Нужна помощь. Никак не могу сообразить, как удалить строчку с файла .xml.
Имеется файл Код:
<?xml version="1.0" encoding="utf-8" ?> Код:
<Data key="DelayPuk">999</Data> |
динозавра,
Пример почти такой же как и 2.5 года назад - тыц nsisXML::select с почти идентичным селектором nsisXML::parentNode вернёт в нужный регистр ссылку на родителя nsisXML::removeChild удалит найденное в ::select |
Спасибо. Буду дерзать. Совсем запутался.
. |
iglezz,
Ура, получилось. Удаляет эту строчку. Но не совсем ура. Удаляет только в том случае, если эта строчка имеется в файле .xml. Если ее нет, то экзешник крошится. Как прикрутить сюда проверку этой самой строчки, чтобы типа, если ее нет, то ничего не делать, а если есть, то удалить? |
динозавра, Ну это же в документации есть:
Цитата:
|
iglezz,
Спасибо. Все понятно. Работает. |
Всем доброго вечера. Опять нуждаюсь в помощи. Такая ситуация. На компе две или более учёток. Одна админ, остальные челядь. Установщик работает из под админа и устанавливает много чего в разные папки, реестр, драйвера. Но нужно установить обязательно всем пользователям папки с файлом по такому пути SetShellVarContext current $APPDATA\Папка\файл или $LOCALAPPDATA\Папка\файл. На всех компах учетки с разными именами. Абсолютный путь не катит. При такой прописке переменных, как я показал, кто бы не устанавливал, а достается одному админу. Остальным никак. Как это можно прописать, чтобы и остальным устанавливались папки?
|
|
Вложений: 1
динозавра,
Это можно сделать с помощью макроса от kotkovets. Код:
!include "MUI2.nsh" Будет установлено всем найденным пользователям и активным и не активированным. Незадача в том, что в директории "Пользователи" могут появятся папки не активированных пользователей таких, как "Гость", "Администратор". Как привинтить сюда фильтр, чтобы не устанавливалось не активированным пользователям понятия не имею. |
iglezz,
Спасибо, но там без чекушки ничего не понятно, а после чекушки вообще. inco1, Это правильно работает, но на семерке в папку SetShellVarContext current $APPDATA добавились 2 профиля встроенных пользователей Гость и Администратор. А на одиннадцатой к ним присоединились интернетовский и еще какой то. Все эти учетки не активны. Не могу прикрутить логику, чтобы их отсеять. Может знатоки помогут в этом деле. Пробовал вот так, но не отсеиваются. Видимо нужен подход не моего уровня. Код:
!include "MUI2.nsh" |
Приветствую! Пожалуйста, помогите разобраться, где косяк. Пытаюсь использовать плагин WPatch. Пример отлично отрабатывает изменение файлов, а мой сценарий - нет. Никаких ошибок. В общем, застрял я и не могу понять, в чем причина.
Пример
Код:
Name "Sample WPatch" |
Kopejkin,
Самое важное находится в WGenPatDir.nsh. Его содержимое вопросов не вызывает? |
Не вызывал, потому как и пример и мой сценарий работают с одним и тем же файлом WGenPatDir.nsh. Да и не знаю, что может в нем вызывать сомнения. Он создается автоматически при создании файла различий.
Если нужен: WGenPatDir.nsh
Код:
!ifndef ADDEDSOURCE |
Kopejkin, Не имея набора файлов (оба каталога для WGenPatDir.exe и каталог с файлами установленной программы), достаточного для сборки скрипта и теста результата, трудно сказать определённо.
Проблема только с пропатчиванием или также с секциями -Backup и -Main? Во втором случае стоит внимательно посмотреть на функцию CheckFile, она несколько путано написана. Можно поискать проблемное место методом отключения ненужных для проверки частей скрипта и выводом отладочной информации через DetailPrint или в файл через FileWrite. ЗЫ Блок Код:
Section |
Запускается все из одной папки, и "пример" и "мой". В "моем" все работает (проверяется, меняется, копируется), кроме пропатчивания. Смотрел DetailPrint на оба варианта. В "примере" пишет:
"Extract: WGenPatDir.pat...100%" В "моем": "Extract: WGenPatDir.pat" Может файл не извлекается? Почему? От безысходности пытался посмотреть, извлекается ли этот файл во временную папку. Но не увидел ни в первом, ни во втором варианте. Даже пытался тупо скопировать его во временную папку до начала процесса пропатчивания. Не помогло. |
Kopejkin, Небольшая модификация функции Patch в примере показала, что плагин ничерта не пропатчил
nsis 3.08, ansi/unicode, проверено на Win10 x64 21h2, Win7 x86 Тут к автору плагина стучаться надо, если это ещё возможно. Function Patch (modified)
Код:
Function Patch |
Спасибо, что заморочились. Для меня это сложновато. Накарябал кучу текста для штатного плагина VPatch. Все работает. Еще раз, спасибо!
|
Приветствую всех. Перелопатил всю справку, но не нашел переименования папки. Ткните носом, если это есть в нашей справке.
Нужно следующее: если по такому то пути найдена папка "Вася", то переименовать ее на "Вова". |
Цитата:
|
Begin2Fly, Спасиба, но вы дали переименование файла. Это в справке аж в двух местах указано. А мне нужно "если по такому то пути найдена папка "Вася", то переименовать ее на "Вова". Папка, не файл.
|
динозавра, не спорьте, а используйте Rename для переименования файлов и папок.
|
Begin2Fly, Хорошо, попробую. Но как тогда написать "если по такому то пути найдена папка". Я знаю только для файла
Код:
IfFileExists Код:
${If} ${FileExists} |
динозавра, и то, и то сработает. Используйте на своё усмотрение.
|
Как в NSIS создать текстовый документ.
А при удалении его, исполняемый файл не запускался, и выводил сообщение что удалён текстовый документ? |
ZVSRus,
Создание файлов - FileOpen/FileClose Проверка на существование - IfFileExists Примеры есть в справке |
iglezz
Может не внятно задал вопрос. Есть такой скрипт для создания портативной программы. При компиляции портативной версии нужно чтобы рядом с лаунчером создался пустой текстовый документ. В него ничего писаться не будет. При удалении данного документа лаунчер не запускался и выводил сообщение что текстовый документ удалён. PS: В скриптах NSIS полный 0. |
В процессе компиляции файл можно создать командой !appendfile
пример
Код:
!define MYLOCKFILE "CreateFileAtCompileTime.txt" ЗЫ. В шапке есть русскоязычный справочник - он несколько устарел и неструктурирован, но как базовый подойдёт. Язык NSIS по объёму небольшой, за пару вечеров основы усвоить можно. |
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 Заработало как и хотел. |
Цитата:
Цитата: "Функция .onInit выполняется после инициализации инсталлятора. Это самая первая функция, которая выполняется при запуске вашего инсталлятора." Не понятно зачем нужно создание файла "Readme.txt" при компиляции... Может нужно при запуске "портативной версии" создать файл "Readme.txt"? Не могу понять... |
Цитата:
"Readme.txt" название образное. Цитата:
|
ZVSRus, Ну тут вообще просто.
Как уже и писал "iglezz", только подробнее... Создаём переменную, что бы при смене имени файла не искать её по всему скрипту. +3 значит если файл есть, то переходим на три строки вниз, то есть "IfFileExists "$EXEDIR\${README}" +3 0" это первая строка. 0 значит файла нет и переходит на следующую строку. Код:
!define README "Readme.txt" |
AlekseyPopovv,
Думаю что вы поняли для чего вся эта возня. Пример работает прекрасно. Благодарен! |
Как в макросе проверить есть ли переменная?
Сам скрипт: Код:
!define APPEXE86 "Prog86.exe" Код:
!define CacheAppExeJump "!insertmacro DeleteCacheAppExeJump" Код:
!define APPEXE "Prog.exe" Код:
!define APPEXE86 "Prog86.exe" |
AlekseyPopovv,
команды !ifdef или !ifndef |
Как задать переменную для папки LocalLow?
|
Цитата:
Код:
!define FOLDERID_LocalAppDataLow {A520A1A4-1780-4FF6-BD18-167343C5AF16} Код:
GetKnownFolderPath $0 ${FOLDERID_LocalAppDataLow} |
Всем Привет!Этот установщик использует temp?нужна установка программы с запуском в конце скрипта или exe из конечной папки назначения(не из temp),конечный путь заранее не определён вообще без использования temp желательно(распаковкой туда,а потом копированием в конечный пункт)
Sfx конструкторы такого не могут. |
Lou Paloma,
Этот установщик использует %temp% для распаковки плагинов, графики и прочих временных файлов установщика. Остальное по желанию скриптописателя. |
iglezz, Это то что нужно.А может ли он распаковать архивы (7zip) напрямую в место назначения минуя %temp%?
|
Lou Paloma,
Первый архив, включённый в установщик, можно распаковать непосредственно из файла установщика -- 7-zip (и построенный на его основе плагин nsis7z) это умеет делать изначально. Для этого достаточно, чтобы заголовок архива был найден в первых 8Mb файла. Если архивов несколько, то простых решений нет. |
Всем привет. Есть ли возможность "дополнять" готовый установщик? Мне нужно, каким-то образом добавлять определенную строку в установщик, чтобы после установки программы и запуске, программа могла прочитать данную строку. Так как строка постоянно разная, то просто зашить ее не получится.
|
kiff86,
Помести эту строку в, скажем, INI файл, рядом с установщиком, откуда будет считываться изменяемая информация. |
Всем привет.
Я заиспользовал NSIS версии 3.x совместно с CMake/CPack для генерации простого инсталлятора. Я оставил в конфигурации только поддержку русского языка. Но при запуске установщика я вижу, что перенос слов в заголовке и содержимом (в общем - везде) некорректный. Оно переносит не по `словам` - а по `любым` местам. https://media.discordapp.net/attachm...399&height=310 Есть ли какой-либо вариант это поправить, чтобы перенос был именно по словам? |
Примеры непосредственно из каталога NSIS компилируются нормально?
Вобще в стандартном виндовом Static control, который здесь используется, текст так не переносится. |
> Примеры непосредственно из каталога NSIS компилируются нормально?
Не пробовал, да и зачем. > текст так не переносится. Если использовать Цитата:
Цитата:
Но мне то нужен именно русский язык. |
Что то тема заглохла...
Из последнего, достойного внимания : 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 нас бросил, а то бы помог, наколдовал бы давно... :) ) |
Цитата:
Код:
GetWinVer $0 Build Код:
${If} ${AtLeastBuild} 22000 Цитата:
Код:
!include "Integration.nsh" |
Цитата:
|
Вторую часть билда можно выдернуть из:
реестра: Код:
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "UBR" Код:
!define GetWinVerBuild2 '!insertmacro GetWinVerBuild2' Код:
nsExec::ExecToStack `"$SYSDIR\cmd.exe" /c for /f "tokens=4 delims=.]" %B in ('ver') do @echo %B` |
Цитата:
|
Цитата:
|
Добрый день.
Кто, как говорится, "съел собаку в NSIS" и может объяснить, дать совет по возникшей проблеме с ExecWait? Поскольку описание проблемы занимает много места, отправлю в PM. Заранее благодарен. |
Столкнулся с загадочным явлением:
В 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 - у меня не работает... |
MKN,
Не ли тут опечатки или разницы в поведении из-за разной разрядности (nsis x86, win x64) ? Для мини-проверки: Код:
!define REGROOT HKLM |
iglezz,
кракозябры в результате(первый Pop $0 наверное ? если нет, то ReadReg - без значения...) : ![]() Что за кодировка не понял... Пытался преобразовать через OemToChar - вообще ничего... Кстати, подобные кракозябры в результате и при использовании wmic в Windows 11. Причём в первом слове (Microsoft вроде...) При использовании OemToChar - выводится только слово Microsoft, остальное куда то пропадает... В W7 всё ок. |
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), это очень старая и полезная штука |
Цитата:
Цитата:
Ошибка: Не удается найти указанный раздел или параметр в реестре. Кодировка там была OEM866. /OEM помог(а как быть для ExecDos::exec ? ). И почему не сработал OemToChar ? |
Цитата:
Это очередное подтверждение, что 32-бит программе в 64-бит системе для доступа к ресурсам (реестру, файлам) стоит использовать соответствующие мехнизмы, а не надеятся, что сработает и так. Цитата:
|
Цитата:
Ввод-Вывод плагина ExecDos однобайтный (в основном), поэтому нужно использовать параметр m на входе OemToChar или выходе CharToOem: Код:
System::Call 'user32::OemToChar(mr0, t.r0)' Проверка на многострочном тексте показала, что этот способ портит символы \r, \n и, наверняка, другие спецсимволы. Более корректный универсальный ansi/unicode способ в виде макроса: Код:
!define OemToChar `!insertmacro OemToChar` Код:
SetOutPath "$DOCUMENTS" |
iglezz, благодарю за разъяснение и пример.
Обнаружил интересный многофункциональный плагин - NSutils https://github.com/negrutiu/nsis-nsutils В частности интересны его StartReceivingClicks и StopReceiveClicks - функции обратного вызова NSIS для пользовательских кнопок. Помнится в ряде случаев были сложности именно с "калбаками" для собственных кнопок в разных местах окон инсталлятора... Хорошо бы на базе этого плагина(если он умеет) примеры увидеть... |
MKN,
Кнопки для этого плагина нужно добавлять так-же как и для плагина ButtonEvent, через редактор ресурсов. Проблем с колбеками не должно было быть и раньше - нужно всего лишь один раз понять их логику. В WinAPI вобще везде так - надо понять как это всё работает, иначе постоянно будут какие-то непонятки. Вот примерчик для кнопки с NSutils: Скрытый текст
Код:
RequestExecutionLevel user Кнопка создаётся в рантайме, посему криво (про это я объяснял с соседней теме по AutoIt) Лучше кнопки добавлять в редакторе ресурсов. Их можно сделать изначально невидимыми (без атрибута WS_VISIBLE) и делать видимыми (и даже перемещать/менять размер) по мере необходимости. Если хочется без проблем добавлять всякие штуки налету то придётся предварительно подправить диалоги (их порядок и свойства). |
Приветствую всех.
Тут такое дело. Имеется батник, который имеет две функции: 1. Создает текстовый файл расширения .ics с добавлением в него нужных строк. 2. Если этот файл со своими строками уже имеется, то батник добавляет в готовый файл только нужные строки не трогая имеющихся и не дублирует те, которые нужно добавить, если таковы имеются Вот его код: Скрытый текст
Код:
@echo off Сделал точную работу этого батника в NSIS, работает отлично, но код какой-то громоздкой получился. Можно ли этот код каким нибудь образом упростить или усовершенствовать или он таким и должен быть? Скрытый текст
Код:
Function DelLine |
Цитата:
|
Цитата:
|
inco1, Код нужно усовершенствовать, ибо он дико неоптимален (сам язык в основе скуден, а комплектные библиотеки (nsh) по этой части страшны). Громоздкость хорошо заметается под макросы и прячется в отдельные библиотечки.
Батник корректно работающим можно назвать только в двух случаях: 1. добавляемых строк в файле нет; 2. строки уже были добавлены в формате, жёстко заданном батником (скорее всего самим же батником ранее). В остальных случаях он будет плодить мусор в виде дублирующихся неработающих записей. Основных проблем тут две. Первая - простая техническая. Добыть данные из файла. Обработать. Запихнуть обратно. В процессе ничего не сломать. И чтобы код можно было понимать и поддерживать спустя полгода. Правильная работа начинается с правильной обработки строк, а каждая строка-запись в максимуме может содержать IP-адрес, энное количество хостов и комментарий с пробелами или табуляциями в качестве разделителей. Обычные прелести минимально структурированного простого текста. Разбор всего этого в NSIS растянется на сотни строк, это не питон какой-нибудь, где строку можно распарсить одной регуляркой. Строки могут записаны так
Код:
0.0.0.0 martau.com #site1 или так
Код:
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 - это нужно только для отладки, если что-то вдруг пойдёт не так. |
iglezz, это наилучшее решение, имеющееся сегодня в NSIS для HOSTS.
Проверил практически на всех системах, и с UAC и без, и с пробелами в строках и без. Работает без сучка и задоринки. Мне прекрасно подходит. Чтобы работало для моего файла "hosts.ics" я поменял в hostsblock.nsh все 54 "hosts" на "hosts.ics" и переименовал на "hostsicsblock.nsh". Результат простейшего экзешника без Errors получился таким: Скрытый текст
Код:
Unicode true Я так думаю, что для моей задачи с файлом "hosts.ics" код можно использовать и без вставки обработки ошибок. Огромнейшая благодарность за проделанную работу над hostsblock.nsh. |
Цитата:
Цитата:
Цитата:
|
inco1,
1. Менять в hostsblock.nsh ничего не надо. Кроме случаев изменения функционала / правки ошибок. 2. В секции примера много лишнего. Её содержімое можно записать компактнее Скрытый текст
Код:
Section MKN, Цитата:
|
Цитата:
|
iglezz,
Цитата:
Даже адреса с 127.0.0.1 не пропускаются, а бекапятся и записываются как 0.0.0.0 Отступы и пробелы так же четко отрабатываются и не дублируются. Дааа..., код в несколько строчек для качественной правки HOSTS это нечто. Теперь понятно, сколько вложено труда в hostsblock.nsh. MKN, Так же огромная благодарность за отклик и проделанную работу. Но работа iglezz - шедевр. |
MKN, inco1,
В качестве замечания, на будущее и для лучшего понимания. ${LineRead} В подобных циклах - штука дико неэффективная. Алгоритм маляра Шлемиеля, как шутят. Для N-ой по номеру строки будет сделана куча работы - FileOpen, N FileRead'ов, FileClose, счётчики и проверки Простейший цикл последовательного чтения файла: Код:
FileOpen $handle $filename R |
iglezz,
Проверил множество раз. Ваш предложенный компактный вариант не работает, если файла hosts.ics не существует. Точнее сказать работает, но добавляет только четыре строки без первой. Если же файл hosts.ics уже существует, то работает правильно. как и задумано. Проверял самым простым экзешником: Скрытый текст
Код:
Unicode true Тот, что я предложил с лишними записями работает как надо, и когда файл hosts.ics отсутствует и когда он уже есть: Скрытый текст
Код:
Unicode true Так же правильно работает, как с уже созданным файлом "hosts.ics", так и без него такой вариант: Скрытый текст
Код:
Unicode true |
inco1, Файл исправлен по старой ссылке.
Косяков там на самом деле там было больше.. |
iglezz, Огромнейшая благодарность.
Теперь код, практически в семь строчек работает четко,красиво и правильно, и лучше, чем код в семьдесят строк из "справки", которую всем в свое время навязывал K.A.V. Ему было пытались объяснить, что его код с hosts не корректно работает, но в ответ было, типа "сам дурак, учи справку". |
Задача: нужна кастомная страница, на которой, к примеру, вверху страницы помещаются несколько кликабельных либо кнопок, либо текст-заголовков, не суть.
При клике на кнопке-заголовке - раскрывается соответствующий список с чекбоксами. При клике на другой кнопке-заголовке - предыдущий список закрывается, а новый открывается. Ессно запоминается состояние чекбоксов, иходя из которого применяются действия... Список с чекбоксами позволяет сделать плагин ListView. Но возможно ли сделать несколько раскрывающихся списков на кастомной странице ? И ещё, можно ли, имея статичную часть окна на странице с кликабельными заголовками, раскрывать списки с чекбоксами в виде других вновь созданных собственных окон с разными элементами в них ? (Совершенно не ясно, как в NSIS можно на одной странице переключать разные окна, при этом сохраняя статично-видимую часть окна откуда осуществляется переключение...) |
Цитата:
А дальше зависит от потребностей и фантазии.. пример
Код:
RequestExecutionLevel user |
iglezz,
Такой способ понятен, но списки хотелось бы выпадающие, а не пропадающие... Если всё же использовать несколько ListView размером во всю страницу, их получится переключать(скрывать) без проблем ? Они ведь будут друг на друге... И запомниться ли состояние выбранных элементов в LV при переключении ? |
MKN, А тут всё равно какой контент будет. Хоть Listview, хоть RichText, хоть видео...
На состояние контролов это не повлияет- они просто прячутся/показываются. |
iglezz, подскажи пожалуйста, как поместить в собственное окно (CreateWindowEx) чекбоксы и кнопки ?
Про размещение текста инфа есть, про прочее - не нашёл... Вероятно нужен какой то спец стиль ? |
MKN, Все стандартные контролы создаются одинаково через CreateWindowEx/CreateWindow, только у простого текста будет ClassName STATIC, у кнопки - BUTTON и т.д.
|
iglezz, т.е. в собственном окне, созданным с помощью CreateWindowEx, можно создать ещё 10 чекбоксов и кнопок ?
Хмм... Никак не получается... |
MKN, для вновь создаваемых окон-детей (в терминологии WinAPI) нужно в функции CreateWindowEx указать дескриптор окна-родителя.
В качестве микро-дополнения к моему примеру на прошлой странице: Код:
${NSD_CreateCheckBox} 40u 5u 40u 20u "111.1" Тоже самое можно сделать и через System::Call 'user32::CreateWindowEx... + SendMessage ... ${WM_SETFONT} Такие детки будут прятаться/показываться/перемещатся вместе с родителем. Сразу проблема - навешивание функций-обработчиков через ${NSD_OnClick} и т.п. не работает для таких деток. Так как события получает родитель, который должен иметь обработчик этих событий. Обработчик написать не проблема, а вот как в nsis получить дескриптор функции-обработчика (необходим для установки функции обработчиком) - хз Доступное костыльное решение (больше костылей богу костылей!) -- менять родителя туда-сюда (окно nsDialogs <--> своё окно) Минимальный пример не помешал бы для более конструктивного обсуждения и во избежание путаницы в терминах. А ещё лучше - короткий рассказ, зачем городить такую жесть на столь ограниченной платформе как nsis :) |
Подскажите, в чём проблема ? - не подключается !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 всё нормально |
Цитата:
Архив с nsis.sourceforge.io/Header_file_for_Listview такой проблемы не имеет, CommCtrl.nsh там в кодировке ANSI/ACP (только пришлось самому дописать отсутствующий !define _COMMCTRL_NSH_VERBOSE 1) Этот тип ошибок лечится принудительным указанием кодировки: !include /charset=кодировка файл |
Цитата:
Куда его правильно конкретно дописать ? (или просто 3 заменить на 1...) |
MKN, После скачивания и распаковки попытка компиляции примерок ведёт к ошибке
Цитата:
Т.е. ошибка в том что _COMMCTRL_NSH_VERBOSE не задан. Сейчас уже вижу, что мой быстрый фикс с добавлением !define _COMMCTRL_NSH_VERBOSE 1 был слишком быстрый, а правильный способ - замена _COMMCTRL_NSH_VERBOSE на _COMMCTRL_VERBOSE. Это явно было последнее изменение перед запаковкой, т.к. даже отступ изменён с двух пробелов на табуляцию в строках с _COMMCTRL_NSH_VERBOSE После исправления примеры компилируются без ошибок. |
iglezz,
У меня __NSD_LV_InsertColumn_Call on macroline 2 на 1292 строке... Изменил в макросе на !verbose ${_COMMCTRL_VERBOSE}. Ошибка... Может скинешь мне свой рабочий CommCtrl.nsh ? И с какой версией NSIS проверяешь ? С 3.0 ведь работает безо всяких правок... А !verbose ${_COMMCTRL_NSH_VERBOSE} у мня в хедере 14 штук... Все изменять ? - Изменил - ошибка та же... Преобразовал хедер в UTF-8 - та же ошибка... |
Вложений: 1
MKN, использую страндартную 3.08
|
Цитата:
Удалил, установил 3.0.6.1 и т.д. - всё работает... (Скрипт для теста - ранее всегда рабочий и даже пробовал пустой, только с CommCtrl.nsh) И что это такое ? :cool: Позже попробую на др. компе... ps Если в 3.08 заменить файл Program Files (x86)\NSIS\Bin\makensis.exe файлом из 3.06 - всё работает. Прочие файлы на работу вроде как не влияют... |
MKN, Есть у меня виртуалка с Win7x32 чистая 6.1.7601 без обновлений и модификаций - работает корректно. Проблема, видимо, зависит от каких-то специфичных вещей в конкретных сборках винды.
Такое лечить правильнее указанием кодировки !include /charset=... В порядке предположения, судя по исходникам, 3.07 у тебя должна так же сбоить. Сверху ещё можно накатить обнову с https://github.com/kichik/nsis/. Как минимум забрать папку Include\ - исправлен баг в LogicLib.nsh и обновление WinVer.nsh (определение вин 11 и билдов вин10 после 2021 года) |
Цитата:
Также видел у китайцев версии(ими названные) 3.0.8.1 - и x86 и даже x64. Причём с защитой от взлома, (вероятно имеется ввиду защита от декомпилляции), там почти все файлы другие и фейс китайский. (Но CommCtrl.nsh и с ними у меня не работает... :( ) |
Цитата:
Цитата:
Цитата:
Вот как раз это и наблюдается в хидере инсталляторов, собранных китайской версией. :yes: |
Всем доброго дня.
Подскажите пожалуйста, как правильно и оптимально кратко прописать проверку всех серверных версий, чтобы получилось примерно так: "Если запущено на любой серверной виндовс, то...". Код:
${If} ${IsWin2003} |
Должно быть достаточно ${If} ${IsServerOS} ...
|
Компилируется, но не уверен, что определит 2019 и 2022. Ведь мой вариант с ${IsWin2019} и ${IsWin2022} даже не компилируется, а только компилируется без них. Использую последнюю WinVer.nsh с хитхаба.
Нашел выход через реестр. Да и в этом варианте WinVer.nsh применять не нужно. Думаю, что в реестре для всех же серверных версий прописано [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion] "InstallationType"="Server" Код:
Function .onInit |
Цитата:
Так что будет определять, пока сами мелкомягкие не сломают. Цитата:
Цитата:
Те же ${IsWin2019} и ${IsWin2022} (как и любые другие проверки) можно легко добавить. И даже в основной пакет исправления/дополнения можно добавить -- патчи/пулреквесты принимаюся на github/sourceforge |
iglezz, Приветствую. Тут еще появилась проблема. Можно как то прописать, чтобы екзешник не запускал себя повторно , если найден процесс с его именем? Всё перерыл, ничего не подходит.
|
Цитата:
|
Пример из справочника плох тем, что он немного неправильный по части реализации и устаревший (${NSIS_VERSION} < 3 && ANSI).
Базовый пример для проверки на запуск копии приложения есть в базовой справке. Более правильный пример с автопереключеніем на уже запущенную копию есть на сайте - Allow only one installer instance. |
iglezz, приветствую.
Цитата:
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 |
Пример под спойлером годится для извлечения/поиска информации, для [пере]записи будет несколько по другому.
пример
Код:
ShowInstDetails show |
iglezz, Спасибо за пример, но я так вообще и не понял, как к этому примеру прикрутить мой файл "test.txt" и искомую фразу "test-test", как в моём примере выше.
|
inco1,
В этом примере Код:
${FileFindStr} результат файл строка |
iglezz, еще раз благодарю. Долго же до меня доходят очевидные вещи. Видать возраст.
|
Еще такой интересный вопрос. Как правильно сравнить две переменные?
Например, есть переменные $R5 и $R6. В обеих есть некое значение из цифр и английских букв. Это неизвестное значение может быть, как одинаковым, так и разным. Код, что ниже не работает, хотя я для теста специально ставил в переменные одинаковые значения - "0x03e700ff" , а показывало $R5 != "0x03e700ff", а когда менял местами $R5 и $R6, то показывало $R6 != "0x03e700ff". Что подтверждает, что значения в переменных одинаковы. Код:
StrCmp $R5 "$R6" 0 +3 |
Цитата:
Цитата:
StrCmp для чисел подходит только в случае, когда гарантированно совпадёт система счисления. Число 16 (десятичное) может быть записано как 0x10 (шестнадцатеричная) или 020 (восьмеричная) и для IntCmp все эти формы одинаковы. |
iglezz,
Ну да, должен работать, но не работает. Вот с этого кода скомпилите экзешник и сами убедитесь: Код:
RequestExecutionLevel user |
inco1, Достаточно заменить MessageBox на такой
Код:
MessageBox MB_OK "[$R7]$\n[$R8]" Прочитанную из файла строку надо чистить от них (TrimNewLines в TextFunc.nsh) |
Вот спасибо. Пол дня пытался понять, что не так. Я и подозревал, что что то считывается невидимое, потому что, если напрямую присваивал любые одинаковые значения, то было всё правильно.
Начну знакомство с очисткой. P.S. Я так понял, что нельзя в моём конкретном примере обойтись как нибудь без $\n и неизвестной для меня очистки? Ведь будет только одна строка. |
Самый простой способ хранения значений в файле - использовать ini-файл (ReadINIStr/WriteINIStr)
|
Попробую.
Добавлено: Всё получилось и работает как надо. Это я так хочу использовать "уникальную метку" системы. Но не уверен, что данные, те что я использую будут уникальными для всех систем: Код:
StrCpy $R6 "c:\" |
Цитата:
|
MKN, приветствую.
Как записать ID винта? Или ID винта это его серийный номер? |
Вложений: 1
inco1,
есть миниатюрный плагин для определения инфы о HDD (см. прикреплённый файл) или Цитата:
|
iglezz, Доброго вам дня и здоровья.
Походу в вашем коде поиска строки баг. Вчера целый день потратил, чтобы найти проблему. Я то ведь сразу вставлял ваш код в мой огромный код и строку не искало. А экзешник с одного вашего кода четко и быстро находит. Я потом давай убирать с моего кода по строкам всё, пока не нашел причину. Вот экзешник с вашим кодом, который прекрасно находит слово "Word.com" в файле hosts: Код:
RequestExecutionLevel user Код:
RequestExecutionLevel user |
inco1, да, в nsis вечно забываю сбрасывать error флаг
в макросе FileFindStr_macro перед Код:
FileOpen $2 $0 R Код:
ClearErrors |
iglezz,
Теперь заработало, как надо. Спасибо за оперативный отклик. P.S. Сравнивал скорость поиска по ${LineRead} и вашим кодом. Брал 400 строк и нужная вконце, одна строка - одно слово. Ваш код находит мгновенно, а через ${LineRead} около 8-10 секунд. |
Всем доброго дня.
Помогите, пожалуйста с такой проблемой. В одной из папок имеются одна папка с известным названием и несколько неизвестных папок ("Test kkkkkk", "Test ххх", "Test yyyyyyyy", "Test zzzz", ....). Во всех папок первое слово одинаковое. Нужно удалить неизвестные папки, у которых значения k, x, Y, z, ... непостоянные (неизвестные). Как вариант подойдет что нибудь типа "удалить все папки, кроме одной с известным названием". |
Для поиска файлов можно применить Locate из FileFunc.nsh
Для сопоставления имён файлов - WinAPI-функции PathMatchSpec/PathMatchSpecEx PathMatchSpecEx может сопоставлять строку с множеством шаблонов, разделяемых точкой с запятой (из-за чего ";" в шаблонах использовать нельзя). пример
Код:
!appendfile 'test ccc' '' |
Всем привет. Столкнулся недавно с файлами *.json.
Нашёл плагин NsJSON. Как создать файл с данными я понял: Код:
nsJSON::Set /file "$APPDATA\Prog\config.json" |
Цитата:
Код:
nsJSON::Delete [NodePath] /end Автор плагина давно пропал, так что надеятся на исправление ошибок особо не стоит. Лучше использовать более проверенный временем инструмент вроде jq |
Всем хорошего дня и здоровья.
Помогите разобраться. Не могу разобраться с условиями, когда все последующие условия привязаны к первому условию, а в этих последующих условиях есть свои условия.... Правильно ли расставил ${EndIf} с такими условиями. По предварительным тестам работает, но не уверен в правильности кода. Последовательность действий изменять нельзя: Скрытый текст
Код:
Section Run64 |
Цитата:
Так будет легче увидеть логические ошибки, которые не ловятся компилятором. Скрытый текст
Код:
Section Run64 Далее нужно избавляться от избыточной вложенности и/или сложности, порой с изменением структуры проекта. |
iglezz,
Цитата:
Скрытый текст
Код:
Section Run64 И еще вопрос, обязательно ли прописывать к примеру условие: "если файл найден" если следует команда на удаление этого самого файла или что то похожее в этом роде? Это будет "легче" для кода или нейтрально? |
Цитата:
Скрытый текст
Код:
ClearErrors |
И еще вопрос, может кто знает, по каким параметрам некоторые разработчики прописывают проверку, что программа запущена на виртуалке?
|
VM обнаруживается по записям с аппаратной конфигурации/драйверов, специфическим записям в реестре, файлам, процессам, сервисам.
В случае универсального детектора требуется проверить множество позиций как минимум для HyperV, VirtualBox, VMWare. |
Как удалить записи из реестра после работы приложения по путям:
Код:
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store |
AlekseyPopovv,
В первом случае сложностей не вижу Во втором случае вижу пару особенностей в виде необходимости получения SID и преобразования буквы диска в имя устройства Для получения SID текущено пользователя можно применить макрос GetCurrentUserSID GetCurrentUserSID
Код:
!define GetCurrentUserSID `!insertmacro GetCurrentUserSID ` Код:
${GetCurrentUserSID} $0 Если надо пройтись по всем пользователям, то можно использовать макрос Для преобразования пути в простейшем случае (c:\path -> \Device\HarddiskVolume3\path) можно использовать такой макрос: Скрытый текст
Код:
!define GetPathWithDeviceName `!insertmacro GetPathWithDeviceName ` Код:
${GetPathWithDeviceName} $0 "C:\path\to\file" |
Вложений: 1
Как покрасить эти места в белый?
Код:
Function MyGUIInit |
Кроме замены цвета фона окна (в .onGUIInit) надо ещё поменять цвет фона каждой страницы и всех элементов в ней (в show-функции для каждой страницы)
пример
Код:
!include WinMessages.nsh |
Фон также можно задавать для каждой отдельной страницы
пример
Код:
!include WinMessages.nsh |
Вложений: 1
Как переименовать кнопку отмена на кастомной странице ReadmePage?
|
Пример прямо в справке есть
Код:
GetDlgItem $1 $HWNDPARENT 2 1 = next 2 = cancel 3 = back |
Есть у кого ни будь пример кастомной страницы MUI_PAGE_INSTFILES?
|
Вложений: 1
Как убрать кнопку закрыть и сделать кнопку отмена активной?
|
Цитата:
Отмену активной сделать мало, там ещё много чего написать надо для обработки этой отмены - InstFiles Cancel - Allowing a user to cancel installation during InstFiles |
iglezz, как поменять шрифт над прогресс баром?
|
CreateFont + WM_SETFONT
Примеры в ${NSISDIR}\Examples\NSISMenu.nsi и ${NSISDIR}\Contrib\Modern UI\*.nsh |
Вложений: 1
iglezz, как исправить? DetailPrint друг на друга наваливается.
|
AlekseyPopovv, Цвет фона надо поменять с прозрачного на нужное значение цвета.
|
iglezz,
Код:
FindWindow $0 "#32770" "" $HWNDPARENT 0xFF8C00 тёмно оранжевый, а показывает в районе лазурного. Или может быть есть другой способ покрасить прогресс бар? |
AlekseyPopovv, Цвет здесь нужно подавать в формате BGR
И вместо магических чисел лучше использовать человекочитаемые константы из WinMessages.nsh. Код:
${RGB2BGR} $1 RGB_цвет_прогресса Код:
!define RGB2BGR `!insertmacro RGB2BGR ` |
На кастомной странице README имеется Link. Его задача по нажатию загружать разные файлы .rtf. Как сделать что бы при нажатии Link, файлы .rtf сбрасывались на начало документа?
|
Цитата:
Получится что-то вроде Код:
!define /ifndef /math EM_SETSCROLLPOS ${WM_USER} + 222 |
Скиньте пожалуйста WinVer2.nsh
У меня ругается на: Код:
!define VER_PLATFORM_WIN32s 0 |
VER_PLATFORM_WIN32s уже определён в Win\WinNT.nsh
А WinVer2.nsh во избежание конфликтов нужно доводить до соответствия актуальной версии NSIS: Подключить стандартный !include "Win\WinNT.nsh" Удалить дублирующий !define VER_PLATFORM.... |
Буду пробовать. Кстати вышла версия 3.09.
|
Всем доброго дня.
Тут застрял на такой проблеме, существует ли в NSIS команда, чтобы узнать, находится ли компьютер в домене? Нашел только это https://nsis.sourceforge.io/WmiInspector_plug-in но оно даже не компилится в юникоде. Тест выдает какие то китайские иероглифы. Нужно что нибудь простое, типа "да или нет". Как, например в батнике "wmic.exe ComputerSystem get PartOfDomain" |
inco1, А есть под рукой для теста комп в домене, на котором это проверить можно?
Наиболее подходящий вариант, похоже, NetGetJoinInformation Код:
; https://learn.microsoft.com/en-gb/windows/win32/api/lmjoin/nf-lmjoin-netgetjoininformation - 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" |
iglezz, Спасибо. Компа нету чтобы проверить, но буду искать и всё попробую.
|
iglezz,
Я правильно понял ваш код? Код:
RequestExecutionLevel user Код:
RequestExecutionLevel user |
inco1,
Для обеих функций результат будет иметь минимум три значения - да, нет, ошибка/не_знаю В случае NetGetJoinInformation полноценный вариант в виде макроса будет выглядеть так: NetGetJoinInformation macro
Код:
/* NetGetJoinInformation macro Для локальной машины ${NetGetJoinInformation} '' '' $R0 или ${NetGetJoinInformation} - - $R0 запишет в $R0 результат: - Отрицательный результат = ошибка - Неотрицательный результат: 3 = однозначно в домене 1,2 = однозначно не в домене 0 = неизвестно В простейшем случае, когда (однозначно в домене == Да, в остальных случаях == Нет), можно добавить LogicLib-тест Код:
!define IsInDomain `"" IsInDomain` Код:
${If} ${IsInDomain} '' |
Чтобы не лезть в дебри дал проверить на компе в домене. Отлично работает поиск через реестр. Работают обе строки. Этого более чем достаточно.
Код:
RequestExecutionLevel user Код:
RequestExecutionLevel user |
inco1,
В этом фрагменте нет смысла дублировать ReadRegStr: Код:
${If} ${RunningX64} Код:
${IfThen} ${RunningX64} ${|} SetRegView 64 ${|} Код:
${If} $Domain == "" |
iglezz,
А можно ли сократить, к примеру вот такой фрагмент: Код:
SetRegView 64 |
inco1,
Для эпизодически встречающихся одиночных инструкций можно написать макрос вроде такого: Код:
!define DeleteRegKey3264 `!insertmacro DeleteRegKey3264 ` Если есть группа ключей, то её можно вынести в макрос и использовать его вместе с SetRegView: Скрытый текст
Код:
!macro DeleteSomeKeys |
iglezz, как создать xml файл с таким содержимым: :o
Код:
<?xml version="1.0" encoding="UTF-8"?> Код:
<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"/> |
AlekseyPopovv,
Изначальный xml-файл (до внесения изменений) есть? Вот это вот похоже на некорректную запись (атрибуты записаны на простой текст): Код:
<Common>CreateBackupCopy="0" ShowSplashScreen="0"</Common> Код:
<Common CreateBackupCopy="0" ShowSplashScreen="0" /> Если нужно именно модифицировать существующий, то это делается через плагин (nsisXML by Wizou) |
iglezz,
Именно вот так выглядит оригинал. Код:
<?xml version="1.0" encoding="UTF-8"?> Но как потом удалить и снова добавить строку именно такую: Код:
<HunSpellDictionary Enabled="1">$EXEDIR\${APPDIR}\ru-RU.dic</HunSpellDictionary> |
AlekseyPopovv, Что-то в итоге понятнее не стало.
Лучше сначала и по порядку: 1. какое содержимое файла до запуска инсталлера 2. что нужно изменить 3. какое должно быть содержимое файла в итоге |
iglezz,
1. Код:
<?xml version="1.0" encoding="UTF-8"?> Код:
<HunSpellDictionary Enabled="1"></HunSpellDictionary> Код:
<HunSpellDictionary Enabled="1">$EXEDIR\${APPDIR}\ru-RU.dic</HunSpellDictionary> 3. Код:
<?xml version="1.0" encoding="UTF-8"?> |
AlekseyPopovv, это простейшее изменение
Код:
nsisXML::create |
Как записать в 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) |
Для начала ту часть строки, в которой нужно преобразовать слеши (в данном случае $EXEDIR) нужно обработать
Например, ${StrRep} $0 $EXEDIR / \ И потом только результат можно использовать в WriteIniStr: WriteINIStr "$EXEDIR\${DEFDIR}\${SETINI}" "OCR" "LanguagesPath" "@ByteArray($0/${DEFDIR}/OCR)" Полагаю, что у программы могут возникнуть проблемы, если в записываемом пути будут символы вне ANSI-кодировки. |
Цитата:
Код:
!include "StrFunc.nsh" |
Всем хорошего дня.
Есть такой вопрос. Существует ли в NSIS задержка определенной команды на несколько секунд. Чтобы была не задержка всего процесса, а только задержка одной команды. Нужно добавить в реестр запись через 10 секунд после определенной команды, но чтобы весь процесс не останавливался на 10 секунд, как это делает команда "Sleep 10000". |
|
Нужно что то подобное, без MUI. Есть варианты?
Код:
!include "MUI.nsh" |
AlekseyPopovv,
Разница между с MUI и без MUI в том, что с MUI пишется Код:
!insertmacro MUI_LANGUAGE "Russian" Код:
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf" Кроме того локалицацию проще и правильнее прописывать так: Код:
; Подключение языковый файлов Пример
Код:
!include SingleInstance.nsh SingleInstance.nsh
Код:
/* |
Ещё вопрос:
Можно ли "правильней" или "красивей" или по другому написать следующий код: Код:
SetRegView 64 |
inco1,
1. От метки с Goto надо избавляться, раз присутствует конструкция If/Else: Код:
SetRegView 64 Код:
SetRegView 64 Код:
!ifndef RegKeyExists Отсутствие ошибки EnumRegKey или положительный тест RegKeyExists значит, что ключ существует. Ошибка после EnumRegKey или отрицательный тест RegKeyExists значит, что ключ отсутствует ИЛИ недостаточно привилегий для доступа к ключу ИЛИ какая-то ошибка |
iglezz,
Для теста создал простой экзешник: Код:
OutFile "Test.exe" А мой вариант пишет правильно, что "Нету нужной записи в реестре". Код:
OutFile "Test1.exe" |
iglezz,
Код:
OutFile "Test.exe" |
iglezz,
В том то и дело,что я всегда проверяю с реальным реестром в двух реальных вариантах - на наличие записи, которую сам добавляю и на отсутствие,которую удаляю. Реально работает только мой вот этот вариант, который я просил усовершенствовать: Код:
OutFile "Test1.exe" |
inco1,
Обновил своё первое сообщение и поудалял некорректные/ненужные Пример компилируется и работает корректно. Если вдруг будут ошибки компилятора, то нужно читать, что именно не так. |
iglezz,
Огромнейшее спасибо за помощь. В процессе проб и тестов присмотрелся к своему первоначальному коду и упростил его. Получился простой код и работает, как и раньше корректно. Вот, что получилось: Код:
ClearErrors |
С помощью функций Win API возможна более корректная проверка ключей на не_существует/нет_доступа/другие_ошибки
пример
Код:
ShowInstDetails show RegistryFunc.nsh
Код:
!ifndef RegistryFunc.nsh SystemFunc.nsh
Код:
!ifndef SystemFunc.nsh |
Никогда не сталкивался с ограничением в 2 гига и вот опять, есть возможность обойти это без "Nsis7z"?
|
AlekseyPopovv, nsisbi
|
iglezz, Доброго дня.
Возникла проблема. Использую ваш метод добавления записей в реестр для всех имеющихся учетных записей. Всё отлично работает. Но как прописать, если в системе есть только одна активная учетная запись, то чтобы запись в реестр прописывалась только активной учетке? Подробнее на примере:
Используется код: Код:
Function SIDFilter_UsersOnly Потом в нужном месте вставляется вызов этих функций: Код:
${EnumUsersRegEx} ProcUsers SIDFilter_UsersOnly Всё отлично работает и всем учеткам системы добавляется в реестр запись. Как можно прописать, чтобы,если имеется только одна активная учетка, то прописывалось не вызов этих функций, а простая запись: Код:
WriteRegDWORD HKEY_CURRENT_USER "SOFTWARE\test" "tt" 0x1 Как это можно сделать? Неактивные и прочие учетки игнорировать. Буду очень признателен за ваше пояснение. |
inco1, Можно посчитать в некую переменную число залогиненных учётных записей.
А потом что, если их больше одной? |
iglezz,
Я, видимо не так объяснил. Если такое возможно, то хотелось бы сделать так, чтобы было некое условие, что если число пользователей "S-1-5-21" более одного, то срабатывает этот код: Код:
Function SIDFilter_UsersOnly Код:
Section |
Посчитать пользователей не сложно
Скрытый текст
Код:
!define CountOnlineUsers `!insertmacro CountOnlineUsers ` Но смысл в этом есть только для случая, когда выполняются разные действия для одного и нескольких пользователей. |
iglezz,
Премного-премного благодарю. Это как раз тот счетчик, что я хотел. |
iglezz, Доброго дня.
Рано обрадовался. Протестировал счетчик на практике. Как выяснилось, он видит только пользователей, которые вошли в систему. Если в систему вошел только один пользователь, то счетчик одного и видит. |
inco1, да, счётчик считает вошедших пользователей.
По какому критерию надо считать пользователей активными? |
iglezz, тех, что записаны в реестре в S-1-5-21 и не считать S-1-5-21-.............._Classes
|
Ближе к цели будет отфильтровать пользователей по наличию профиля
Скрытый текст
Код:
!define CountUsersR `!insertmacro CountUsersR ` |
iglezz,
Да. Работает корректно. Даже учетку "Администратор" , которую я когда то активировал на восьмерке сосчитало (это та, что S-1-5-21......................500 и которой нету в HKU). Огромнейшее спасибо. |
В 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 |
Ярлыки добавляю в меню пуск:
Код:
SetShellVarContext all Хотя в папке "C:\ProgramData\Microsoft\Windows\Start Menu\Programs" присутствует и папка ${APPNAME} и ярлыки ${APPNAME}.lnk и Удалить.lnk В чём проблема? |
Код:
UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico" |
Цитата:
Why does my app’s uninstaller disappear from the Start menu?
Цитата:
Цитата:
|
Вложений: 2
Как сделать как на первом скрине?
|
Browse for Folder
Вид и поведение окна настраивается через флаги ulFlags структуры BROWSEINFOW, передаваемой функции SHBrowseForFolderW |
iglezz, Пример бы посмотреть, самый простой.
|
iglezz,
Код:
!include "StrFunc.nsh" |
|
Цитата:
Код:
WriteRegStr HKCU "${APPREG}\OCR" "LanguagesPath" "@ByteArray(D:/Programs/OCR)" |
AlekseyPopovv, Если формат строки известен и постоянен, то очевидно, что достаточно отрезать @ByteArray( в начале строки и ) в конце
|
Как преобразовать?
Это: Код:
01-01-2023 00:00:00 RTZ 2 (ceia) Код:
01-01-2023 00:00:00 RTZ 2 Код:
${StrFilter} "$1" "12" " -:" "()абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz" $0 |
Цитата:
Код:
StrCpy $0 '01-01-2023 00:00:00 RTZ 2 (ceia)' |
Цитата:
|
Как сменить имя и папку деинсталлятора, когда его запускаешь?
Код:
$TEMP\~nsu1.tmp\Un.exe |
Как изменить размер окна инсталлятора на всех страницах без правки русурсов и плагина NsResize?
|
Цитата:
Если сильно надо, сделать дополнительный скрипт, который будет служить в этой роли. Цитата:
Для простого юзера нужно колхозить подчистку. Цитата:
|
Простейший способ подчистки за исполняемым файлом - запуск скрытого процесса перед завершением работы:
Скрытый текст
:read: :read: :read: Бездумное применение нижеприведённого кода отстрелит
Скрытый текст
Код:
SetAutoClose true |
Как сохранить статус CheckBox на кастомных страницах?
К примеру снимаю галочку с CheckBox и возвращаюсь на предыдущую страницу, потом обратно на следующую и галочка опять стоит. |
Цитата:
При создании страницы выставить статус галки из переменной. При выходе со страницы (leave-функция и onBack-колбэк) записать статус галки в переменную. Скрытый текст
Код:
ShowInstDetails show |
Всем хорошего дня.
Если на рабочем столе кликнуть правой кнопкой мыши, то там есть пункт "Обновить". Как эту команду прописать в NSIS? |
inco1, Можно программно нажать F5
Код:
System::Call 'user32::GetShellWindow()p.s' ; hwndShellWindow = GetShellWindow() |
Подскажите пожалуйста, как средствами NSIS переконвертировать(сделать читабельной) последовательность символов (Unicode Escape), к примеру такого вида : \u0412\u0430\u043b\u0435\u043d\u0442\u0438\u043d ?
|
Как победить подобную конструкцию?
Код:
!macro Test Такая конструкция работает, но это ужас: Код:
!macro Test |
Цитата:
пример
Код:
ShowInstDetails show |
Цитата:
Возможные решения: 1. Применять функции. Параметры передавать нужно через стек. А также делать раздельные функции для install/uninstall или писать дополнительную логику для объявления функции в install и/или uninstall. 2. Применять вызов через ${CallArtificialFunction} (Util.nsh) Параметры передавать нужно через стек. Реализация через установку метки и Goto на неё делает невозможным воздействие на код макроса флагами извне отдельно на каждый вызов, но это скорее понадобится для создания библиотечных макросов со сложной логикой. 3. Добавить в качестве префикса к метке уникальное в пределах текущего вызова макроса значение. LogicLib.nsh использует такой метод (но в отличной от примера реализации). пример
Код:
!macro DigitIsOdd return value 4. Изменить структуру кода, использовать LogicLib, если это возможно и не ухудшает читаемость кода. |
iglezz, - замечательно ! (и где такому "волшебству" учат ? :) )
Некоторые детали кода не оч. понятны... largelog.exe в моих дистр-ах NSIS отсутствует(нужен для лога-проверки ?) Почему на выходе три варианта ${StrUnicodeUnescape} - "[$0]" ? Будет ли декодироваться не кириллическая таблица символов ? |
MKN, Вся видимая сложность тут для ускорения и некоторых дополнительных плюшек. А так, тут нет никакой магии, только примитивный парсинг строки и знание, что с помощью плагина System можно преобразовывать код символа в символ и обратно.
Цикл в StrUnicodeUnescape_ очень простой, умеет обнаруживаь и преобразовывать последовательность \u#### в юникод-символ. Без каких либо дополнительных проверок на корректность читаемых данных. По хорошему, надо, как минимум, добавить проверку на то, что после '\u' есть ровно четыре символа, которые являются валидным hex-числом. largelog.exe - это мой специальный тестовый UI большего размера (230% оригинала) для дебага через DetailPrint. Три варианта демонстрируют возможность читать строку со стека и записывать результат в стек. Это может быть полезно в сочетании в вызовами WinAPI функций через System::Call. Декодируются все коды формата \u#### |
Задача: "просмотреть" в папке все файлы и записать из них только нужное в другой файл. (соответственно с каждой строкой необходимо произвести манипуляции по нахождению-извлечению нужного)
Скрытый текст
PHP код:
Для чтения-записи использую макрос с циклом FileRead. "Проверочный" MessageBox "фиксирует" данные в переменной из каждой строки каждого файла, но записываются данные только из одного файла, либо после обработки строк, вообще нечто рэндомное... В чём здесь ошибка ? |
MKN,
Код:
FileOpen $R5 "$EXEDIR\data.txt" w |
Как "пропустить" ошибку:
"Невозможно открыть файл для записи:" Т.е. если файл занят, просто пропустить его копирование без MessageBox. |
Всем хорошего дня.
Помогите, пожалуйста с удалением папок. Нигде не нашел, как удалить папки с расширением, например папки с расширением .tmp Этот вариант не работает: Код:
SetOutPath "$TEMP\*.tmp" |
inco1, Стандартная команда RMDir /r не удалит папки по расширению. Надо знать как папки называются.
|
AlekseyPopovv, Я правильно понял, что в NSIS есть только команда удаления по маске файлов, а удаление по маске папок даже не предусмотрено?
|
inco1, Да.
|
AlekseyPopovv, Странно как то всё это, если для этой цели даже батник есть в одну крохотную строчку:
Код:
for /d %%d in (*.tmp) do rd /s /q %%d |
Цитата:
inco1, Цитата:
Разница лишь в том, что в у интерпретатора командной строки есть готовые команды для циклов, а в nsis - нет. |
Задача : необходимо в txt файле заменить конкретную строку на другую. Т.е. ,например, строку №5 удалить и заменить на содержимое из переменной и т.д.
Пробовал функцию - https://nsis.sourceforge.io/Replace_...ecified_string Не работает... (там правда не конкретная строка заменяется, а вроде как строка имеющая определённое вхождение, что тоже интересно, но тоже не заработало...) Как решить такую задачу ? |
MKN, Та функция вполне рабочая, хотя и перемудрена немного. Но применяемый там метод записи ломает хард/софт-линки
Вот так можно построить обработку конструкциями в стиле LogicLib: Код:
ShowInstDetails show |
iglezz, спасибо !, но очень мудрёно... Наивный практический вопрос - как выглядит то запрос на замену ? Скажем, входной файл In.txt , строка для замены №7, заменить на содержимое из $data.
ps Можно ли оформить функцию как .nsh ? (чтобы не очень пугала... :) ) |
Цитата:
Код:
${FileReadByLine} $0 $1 'In.txt' '' Цитата:
В примере оно из разных nsh подёргано. |
iglezz,
Почему то после замены строки, следующая строка, имеющаяся в файле "прилепляется" к концу заменённой, т.е. после строки замены отсутствует перенос строки... Можно конечно после Line добавить $\r$\n, а может лучше в код функции добавить перенос, куда следует добавить ? И можно ли в ${FileReadByLine} $0 $1 использовать свои переменные(вместо $0 $1) ? |
Цитата:
Можно просто добавлять $\r$\n к переменной Line, если нет желания использовать EOL-символы для конкретной обрабатываемой строки. Цитата:
Тут, кстати, надо учитывать, что на строках длиннее NSIS_MAX_STRLEN работа может быть некоректной. Для таких случаев нужна отдельная версия этой конструкции, в которой побочно и EOL-символы получатся в отдельной переменной. |
В файле длинная строка, в ней нужно найти такие данные:
Код:
"download":{"default_directory":"C:\Пользователи\Downloads"} Надо заменить на: Код:
"download":{"default_directory":"$EXEDIR\${DEFDIR}\Downloads"} |
Подскажите пожалуйста - как приспособить RegistryFunc.nsh (из Справочника) для работы с UNICODE версиями NSIS ?
К сожалению сказано, что "библиотека полностью совместима только ANSI версией компилятора NSIS"... |
MKN,
Посмотрев код по диагонали, могу сказать, что потребуется вдумчиво прогнать всё через дебаггер в голове на предмет выявления мест, где идёт работа на уровне байт, а не символов. Параллельно можно и оптимизировать немного на производительность. |
Цитата:
|
MKN, Большого смысла адаптировать RegistryFunc.nsh не вижу, проще новый написать с нуля.
|
Какие функции из RegistryFunc.nsh в первую очередь интересуют?
|
Цитата:
В ANSI варианте это - ${RegFind} "${HKLM}\SOFTWARE\Classes\CLSID" "/T=REG_BINARY /V=0" EnumReg Ну и хорошо бы поиск в таком то разделе таких то ключей и значений... |
Думаю, RegistryFunc.nsh можно отправлять на пенсию.
Плагин Registry умеет всё и быстрее. |
iglezz, действительно, плагин летом обновился, попробую...
|
Можно как-либо исправить нечеткое отображение текста элементов при масштабировании дисплея?
Скрытый текст
![]() Так выглядит окно инсталлятора при стандартном масштабировании 125%. Как видно, четким остается только текст заголовка окна. У меня разрешение экрана небольшое (1366х768). На дисплеях FHD это выглядит еще хуже. |
Kopejkin,
Код:
ManifestDPIAware System ; System DPI on Vista/7/8/8.1/10(<10.1607(AU)) |
Спасибо за подсказку и отсылку на форум Winamp.
Теперь осталось определиться, действительно ли оно мне так уж нужно. |
Это решение можно найти и на sf.net и на stackoverflow и даже просто перебором доступных значений (детали в документации и исходниках nsis)
Эта комбинация хорошо работает в многомониторной конфигурации с разным масштабом у мониторов при переносе окна установщика с одного монитора на другой. При этом реализации Per-Monitor V2 DPI Awareness в nsis пока нет. Свои изображения можно избавить от мыла через подготовку изображений под несколько значений масштабирования (100,125,150,..%) до или в процессе сборки установщика. При запуске - получить от системы используемый масштаб и загрузить подходящее изображение. С MUI такое не прокатит без переписывания кода, отвечающего за изображения. Если в Win API найдутся методы качественного масштабирования битмапов - можно будет применить их. |
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. |
Наиболее адекватный способ работы с файлом hosts в nsis на сегодня - использование программы вроде BlueLife Hosts Editor.
Обработка hosts-записей не столь тривиальна, как это может казаться на первый взгляд. |
iglezz,
Цитата:
|
inco1, BlueLife Hosts Editor умеет работать с командной строки, при этом достаточно одного 32-битного hEdit.exe
|
iglezz, Спасибо, это меняет дело. Попробую.
|
Всем доброго дня.
Есть вопрос, на который я нигде не нашел ответа. Помогите, пожалуйста. Как известно некоторые программы в реестре прописывают свое место установки в кавычках и в конце ставят слэш \. Это в реестре выглядит так: InstallLocation REG_SZ "C:\Program Files\" или InstallLocation REG_SZ "C:\Program Files" Ни первое, ни второе, если это считать с реестра и записать в переменную не работает для определения файла из этой папки. Для считывания и записи в переменную использую ReadRegStr В связи с этим вопрос, как можно удалить кавычки и слэш, чтобы в переменную записалось правильно C:\Program Files, без кавычек и слэша в конце? |
В большинстве сборок портативных программ созданных с помощью NSIS которыми пользуюсь, есть директория \App\AppInfo\Launcher с файлами настроек. Это ведь не нативная фишка NSIS, где найти пример такого исходника?
|
VV189,
Лаунчеры в портативках, которыми вы пользуетесь, созданные в PortableApps com, а не в NSIS. Лаунчеру, созданном в NSIS не нужен файл сценария App\AppInfo\Launcher\"Прога".ini, потому что работа идет напрямую без "посредника". Это, примерно, как передаешь сообщение с уст в уши посыльному, а посыльный передает со своих уст в уши нужному человеку, а не прямое сообщение с уст в уши нужному человеку. PortableApps com имеет свою собственную оболочку, на основе NSIS. Для "нормальных" лаунчеров сама оболочка PortableApps com скудненькая и всё равно придется дополнительно писать скрипт "Custom.nsh", который немного расширяет возможности оболочки. Некоторые возможности NSIS даже не удастся реализовать через PortableApps com. |
30 марта NSIS обновился.
Текущая версия: NSIS 3.10 |
Я создал свою версию репака для IDM с собственным брендингом, заголовком, заставкой и музыкой в фоновом режиме, а установщик не автоматизирован, просто распаковываю файлы в папку Program Files, но у меня есть проблема, связанная с расширением браузера для Chrome, Brave и Firefox, я не могу понять, как их интегрировать в браузеры?
|
Здравствуйте. Для модификации файлов JSON пробовал использовать плагин nsJSON. Столкнулся с проблемой, файл перезаписывается, остается только новая запись. У автора плагина, в docs, про модификацию написано мало, примеров вообще нет: Modifying JSON
------------------------------------------------------------------------ nsJSON::Set [/tree Tree] [NodePath] /value "Value" Sets the value of the given node. The value can be any single value or it can be JSON code. The node will be created if it does not exist. Multiple JSON trees can be manipulated at the same time. Add /tree Tree (where Tree is the tree name) before all other plug-in arguments to specify which JSON tree you are manipulating. В этом "tree name" кажется все и дело, как правильно написать, перепробовал очень много вариантов- замена вообще не происходит, в случае "" вместо "tree name" - перезапись файла. Пробовал по автору плагина: nsJSON::Set /tree Tree 'i18n' 'locale' /value '"en"' /file "$EXEDIR\Data\EDRLab\state.json" ,где Tree у меня должна быть нода 'i18n', начало ветки, и старше нет, NodePath тоже с нее начинается. Пробовал писать по разному. nsJSON::Serialize /file "$EXEDIR\Data\EDRLab\state.json" Решение нашел, простой заменой текста другим плагином, но помогите разобраться с nsJSON. |
Доброго времени суток, товарищи знатоки. Есть вопрос. Подскажите толковый способ, плагин, макрос снять IP адрес с ПК? Необходим для сверки в процессе установки.
Процесс поиска пока приводит к старым либо неподдерживаемым плагинам. |
inco1
"В связи с этим вопрос, как можно удалить кавычки и слэш, чтобы в переменную записалось правильно C:\Program Files, без кавычек и слэша в конце?" Запишите вашу переменную в текстовый файл, можно ini, config, без разницы. Сразу увидите, что нужно удалить, заменить. А дальше используйте что-нибудь, вроде ReplaceInFile3 для замены/удаления символов. Дальше считываете в переменную. Если по краям символы, то можно и без текстового файла обойтись, а использовать возможности StrCpy по обрезке, так проще. |
Тема помогла
|
Время: 06:07. |
Время: 06:07.
© OSzone.net 2001-