Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Nullsoft Scriptable Install System | NSIS

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117

Открыть новую тему     Написать ответ в эту тему

Nep



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

 
NSIS (Nullsoft Scriptable Install System)
Скриптовая система создания инсталляционных пакетов от авторов Winamp

Основные характеристики:
 
  • Размер дистрибутива около 1,5 МБ
  • Наличие в базовом пакете файлов с примерами и подробной справки
  • Чрезвычайная гибкость при создании инсталляций для своих программ
  • Открытый исходный код
  • Использование различных алгоритмов сжатия (ZLIB, BZIP2, LZMA)
  • Наличие различных плагинов
     
    Новейшая версия ветки 2.х: NSIS 2.51 (от 1 апреля 2016 г., статус ветки - Old Releases)
    Новейшая версия ветки 3.х: NSIS 3.10 (от 30 марта 2024 г.)  
     
     
    Ссылки:
    NSIS: страница загрузкирусификатор ветки 2.xx (без гарантии, что подходит!)2.513.10NSIS 3 Pre-releaseNSIS 2 Pre-releaseисходники (SVN)
     
    Дополнительно: [ плагины, примеры и полезности ] • [ форум разрабочиков ] • [ Wiki ]
     
    Редактор для скриптового языка NSIS: [ скачать ] • [ домашняя страница ]
     
    NSIS Unpacker
    7-zip начиная с версии 4.40 beta поддерживает распаковку из некоторых типов инсталляций.  
    Обратите внимание, что 7za не поддерживает распаковку.
     
    Полноценного русификатора пока нет, но кто хочет, может перевести сообщения в исходных текстах NSIS и скомпилировать всё заново – это единственный корректный вариант. Из файлов поддаётся корректному переводу только меню интегратора NSIS, поскольку там HTML, а остальные переводы – это в основном "русификаторы" с непредсказуемыми последствиями применения.
     
    64-х битное развитие идей NSIS. В разработке, аннотация разработчика nsisbi.
     
    Просьба к тем, кто будет править шапку, сначала сверяться с http://nsis.sourceforge.net/Main_Page и не выдавать желаемое за действительное.

  • Всего записей: 41940 | Зарегистр. 24-06-2001 | Отправлено: 14:21 06-10-2001 | Исправлено: DimmY, 11:10 31-03-2024
    kot280379



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Victor_VG
    Т.е можно упаковать сам инсталлятор после компиляции проекта?

    Всего записей: 185 | Зарегистр. 01-11-2009 | Отправлено: 10:32 27-12-2010
    Victor_VG



    Tracker Mod
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kot280379
     
    А почему бы и нет? Сжимается каталог вместе с файлами. NTFS это дело умеет делать ещё с 1994-го года, с Windows NT 3.5.0 (Dytona), другое дело, пользуетесь этим лично Вы и как это делаете. Предупрежу сразу - корневой каталог тома (/) сжимать нельзя иначе он чудить станет.

    ----------
    Жив курилка! (Р. Ролан, "Кола Брюньон")
    Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

    Всего записей: 33227 | Зарегистр. 31-07-2002 | Отправлено: 13:00 27-12-2010
    sawerx



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kot280379
    Посоветуй простой способ вычислить, но только точно, что машина пользователя является именно NT7 (Vista and Win7),
    и если да, тогда следует что-то добавить в установку. Желательно по возможности не использовать OS плагин или другие....

    Всего записей: 61 | Зарегистр. 21-11-2010 | Отправлено: 21:20 10-01-2011
    820815



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    sawerx

    Код:
    !include WinVer.nsh
     
    Function .onInit
      ${IfNot} ${AtLeastWinVista}
        MessageBox MB_OK|MB_ICONSTOP 'Windows Vista or higher required'
        Quit
      ${EndIf}
    FunctionEnd

    Всего записей: 645 | Зарегистр. 18-12-2006 | Отправлено: 22:38 10-01-2011 | Исправлено: 820815, 22:40 10-01-2011
    Victor_VG



    Tracker Mod
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    820815
     
    Не годится. Проще:

    Цитата:
      Version::GetWindowsVersion
      Pop $0 ; $MajorVersion
      Pop $1 ; $MinorVersion
      StrCpy $0 $0$1
      Pop $1
      Pop $1
      Pop $1
      StrCpy $1 0
      IntCmpU $0 60 Vista Old +1
      IntCmpU $0 61 Win7 Vista WinNew

    плагин прочитает версию ОС, а дальше уходим по меткам на нужные ветки алгоритма. Без использования плагина, Вам придётся руками считывать Реестр и писать достаточно громоздкий парсер для его значений. Плагин Version выполнит эту работу за нас, а результат положит на стек. На семёрке он работает, проверялся.

    ----------
    Жив курилка! (Р. Ролан, "Кола Брюньон")
    Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

    Всего записей: 33227 | Зарегистр. 31-07-2002 | Отправлено: 01:08 11-01-2011 | Исправлено: Victor_VG, 01:11 11-01-2011
    820815



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Да куда уж проще...

    Код:
    ${If} ${IsWinVista}
      MessageBox MB_OK 'Running on Vista'
    ${ElseIf} ${IsWin7}
      MessageBox MB_OK 'Running on Seven'
    ${EndIf}

    Всего записей: 645 | Зарегистр. 18-12-2006 | Отправлено: 03:59 11-01-2011
    Victor_VG



    Tracker Mod
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    820815
     
    Да, до пользовательской ругани, проходили критику за интерактивные диалоги. Нормальный вариант с простейшим парсером вот:

    Код:
       ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentVersion"
       StrCpy $1 $0 1 -1
       StrCpy $0 $0 1 1
       StrCpy $0 $0$1
       IntCmpU $0 60 Vista Old +1
       IntCmpU $0 61 Win7 Vista WinNew

    просто читаем значение номера версии из Реестра, разбираем, переходим. Шесть строк простейшего кода не привязанного к неизвестным макросам как у Вас. В стандартной поставке NSIS 2.46 ANSI такого кода в библиотеках не реализовано, да я согласен, либа типа моей ProcLib это позволит сделать элементарно, но нам стоит задача предельно простым способом проверить номер версии ОС не пользуясь плагинами или любыми  средствами отсутствующими в минимальной поставке NSIS (только стандартный инсталлятор с SF.net) и по нему произвести переход на нужную нам ветку алгоритма. Проще прямого чтения Реестра и его разбора ничего нет. Я ждал что Вы уведите этот код после лобовой подсказки, ну да ладно, сам дам, раз уж Вы на этих макросах застряли, и исходники их даже не глянули - а как раз из них видно, что в данном случае это решение не приемлемо. Хотя я и согласен, можно и их использовать, но не в данном случае - мы нарушаем условие постановки задачи вот этим кодом:

    Код:
      !macro __WinVer_Call_GetVersionEx STRUCT_SIZE
     
        System::Call '*$0(i ${STRUCT_SIZE})'
        System::Call kernel32::GetVersionEx(ir0)i.r3
     
      !macroend

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

    ----------
    Жив курилка! (Р. Ролан, "Кола Брюньон")
    Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

    Всего записей: 33227 | Зарегистр. 31-07-2002 | Отправлено: 04:40 11-01-2011 | Исправлено: Victor_VG, 05:11 11-01-2011
    kot280379



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Victor_VG

    Цитата:
    ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentVersion"

    Согласен, проще не бывает, но  проще и бывает изменить значение CurrentVersion
    Итог будет ясен.
    Я лично использую winver.nsh. Эта библиотека использует system.dll. - наиболее часто используемый
    плагин в скриптах, а при использовании еще MUI2 - грех не воспользоваться.
    Дык и надежней.

    Код:
     
    !include "WinVer.nsh"
    OutFile "setup.exe"
     
    Function .onInit
       ${WinVerGetMajor} $1
       IntCmp $1 6 +3
       MessageBox MB_OK|MB_ICONSTOP "Запуск возможен только в Windows Vista/7"
       Quit
    FunctionEnd
     
    Section "Main"
    SectionEnd
     

     

    Всего записей: 185 | Зарегистр. 01-11-2009 | Отправлено: 12:41 11-01-2011 | Исправлено: kot280379, 15:24 11-01-2011
    Victor_VG



    Tracker Mod
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kot280379
     
    Да, этот фокус возможен, но нам поставлено конкретное условие, и приведённое решение написано точно под него. Собственно для того и писалось. Я могу себе позволить любую чертовщину где угодно, но в рамках ТЗ, а здесь оно меня чётко ограничивает в выборе средств - только коды NSIS, никаких плагинов. Согласен? Я вот сейчас вожусь со сборкой TDM-GCC 4.5.1 R1 - переделываю в очередной раз. Там я ограничен только одним - размером скрипта. Сейчас это почти 1,7 Мб, в итоге HM NIS ругается что ОЗУ не хватает. Ну, с этим справляется лобовой вызов makensis из под Far Manager благо NSIS специально в пути прописан. Посему достаточно по Ctrl+G его вызывать универсальной командой makensis !.! и сам far перебрасывает скрипт на компилятор. И всей возни сейчас - подобрать имя пакета так, чтобы оно влезло в окно инсталлятора. Всё остальное в порядке. Скромное количество - 1027 каталогов, 13672 файла - либы, хидеры, бинарники. А куда я денусь? Там в одном пакете C/C++/C#/Ada/Fortran95 компиляторы с обвеской, рунтаймом и кучей UNIX утиля. Вышло в сумме 29227 строк. На чём с учётом объёма возни HM NIS падает. Ну, сиё его проблемы.

    ----------
    Жив курилка! (Р. Ролан, "Кола Брюньон")
    Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

    Всего записей: 33227 | Зарегистр. 31-07-2002 | Отправлено: 13:40 11-01-2011 | Исправлено: Victor_VG, 13:41 11-01-2011
    kot280379



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    меня чётко ограничивает в выборе средств - только коды NSIS, никаких плагинов. Согласен?

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

    Цитата:
    подобрать имя пакета так, чтобы оно влезло в окно инсталлятора

    Ну если вы используете MUI, то решение есть в справочнике по NSIS, который я выкладывал.
    Victor_VG
    Вы не знаете способ, как внести запись в ветку HKLM, под ограниченной учеткой пользователя?
    Есть плагин http://nsis.sourceforge.net/AccessControl_plug-in - как я понял, дает права админа пользователю. Но с кучей бесполезных попыток на WinXP - не удалось внести запись в ветку HKLM
     
     
     

    Всего записей: 185 | Зарегистр. 01-11-2009 | Отправлено: 14:48 11-01-2011
    sawerx



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо, что откликнулись!
    Смысл предложных решений, вроде простой и понятный, но в этом случае как мне передать какой нибудь секции, которая находится в конце (в пост инстале) что ей можно выполнить при условии, что в начале скрипта найдено, что это Win7-Vista, и без всяких лишних окон.

    Всего записей: 61 | Зарегистр. 21-11-2010 | Отправлено: 19:22 16-01-2011
    Victor_VG



    Tracker Mod
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kot280379
     
    Под XP только одним способом, но гарантированным - вызвать установку с правами админа. Или писать что-то по смыслу похожее на утилиты типа "Run as...." запускающими специально напасанный модуль с админскими правами и запросом пары логин - пароль. Но могу точно сказать - я такое писал года два назад для одной работы, и у меня тогда вышел монстр от которого я мигом отказался и код его потёр - громоздкий код, очень неудобный в применении и вдобавок слишком не предсказуемым вышло его поведение. Потому я думаю, что проще использовать системную команду "Run As..."
     
    sawerx
     
    А зачем Вам окна выводить? Ставите в заголовке программы блок переменных-семафоров (var ...), в .onInit присваиваете этим переменным значение 0, и если условие их срабатывания соблюдено, то ставим им 1, а потом переход с проверкой их как условия. Сам так делаю. У меня в Far Manager SE целая куча подобных проверок имеется, и без семафоров реализовать тот ИИ, что заложен в программу я бы не сумел.
     
    Только учтите, что если Вы сами не инициализируете переменную, её начальное значение буден непредсказуемо. Инициализация любых переменных до их первого применения - это надёжный метод предотвращения связанных с их начальным состоянием ошибок, и делать это надо всегда

    ----------
    Жив курилка! (Р. Ролан, "Кола Брюньон")
    Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

    Всего записей: 33227 | Зарегистр. 31-07-2002 | Отправлено: 19:44 16-01-2011
    kot280379



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Victor_VG
    Понял, запустил от админа - пошло дело. Спасибо за подсказку!

    Цитата:
    sawerx

    В последнем примере, если это Vista/7, в переменную $1 cваливается значение 6. По этой переменной можно определять какие фунции выполнять:

    Код:
     
    Section "Vista_7"  
     StrCmp $1 6 0  notVista_7
       ;здесь будут команды выполняться только в Vista/7
     notVista_7:
    SectionEnd  

    1) учитывать, что отметил Victor_VG
    2) Обязательно, проверяем, чтобы значение $1 не изменялось, командой или функцией, а для надежности объявить свою переменную.

    Код:
     
    var GetWin
    --  
    Section
     StrCmp $GetWin 6 0  notVista_7
       ;здесь будут команды выполняться только в Vista/7
     notVista_7:
    SectionEnd  

    Вариантов много реализации - насколько хватит фантазии
     

    Всего записей: 185 | Зарегистр. 01-11-2009 | Отправлено: 22:48 16-01-2011
    dimbat



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    К слову о встроенной возможности - WinVer.nsh всё таки дает сбой.
    Пользую в одном скрипте ${If} ${AtMostWin2000} (т.е. версии ХР и выше) - два раза давала сбой на ХР (сервис-паки 1 и 2) и почему-то только на Home Edition. И это были не левые самосборы, а оригинальные винды.
    Хз почему не проходит проверку, но как факт.
    ---
    "SOFTWARE\Microsoft\Windows NT\CurrentVersion" тоже не идеален - ведь достаточно случаев изменения этого параметра с целью там например приручить какую-нить игру к не поддерживаемой операционке, ну или около того...

    ----------
    In Search We Trust

    Всего записей: 1034 | Зарегистр. 23-08-2003 | Отправлено: 23:41 16-01-2011 | Исправлено: dimbat, 23:52 16-01-2011
    Victor_VG



    Tracker Mod
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kot280379
     
    Обязательно используйте свою группу переменных-семафоров с понятными Вам именами! Переменные с именами $0 - $19 это регистры с именами $r0 - $r9 ($0 - $9) и $R0 - $9 ($10 - $19)  соответственно. Их начальное значение так же не предсказуемо.
     
    Пример как это обычно реализую я:

    Цитата:
    ....
    /* $s0 - $s17 - это глобальные переменные-семафоры для отслеживания состояния событий. благодаря их глобальному объявлению. они доступны во всей нашей программе.  
     
    Пр необходимости мы можем в нужных секциях или функциях определить локальные семафоры, но лучше тогда использовать регистры предварительно сохранив их в стеке и сразу после завершения участка кода где мы это делаем восстановив их оттуда. */
    var s0
    var s1
    .....
    var s17
    .....
    Function .onInit
      !insertmacro MUI_LANGDLL_DISPLAY
    /* инициализируем объявленные семафоры */
    StrCpy $s0 0
    StrCpy $s1 0
    ....
    SytCpy $s17 0
    /* Инициализируем остальные переменные и регистры $0 - $19, последние можно конечно не сбрасывать, но сразу после старта программы в них мусор, потому лучше их тут вычистим */
    ....
    FunctionEnd
    .....
    /* здесь в отдельных функциях сидят разные проверки и вывод диагностических сообщений. В .onInit этому коду делать нечего! Он там только вызовет сбои!*/
    ....
    Section  
    /* первая неименованная секция играет роль основного модуля управления программы, весь код управления или код который не должен быть пропущен кидаем в нё */
    SectionEnt
    Section "Main"
    .....
    SectionEnd

    С такими приёмами работает в основном без ошибок, но и то они иной раз вылезают, и порой трудно уловимые.
     
     
    Добавлено:
    dimbat
     
    Да, я согласен. Остаётся только один вариант с вызовом плагина GetVersion и с его помощью читать версию ядра и сервис пака. Эти метки обычно надёжнее. Я так всегда и поступаю. Те вызовы API что применяет WinVer это примерно то же что я выше писал - чтение из HKLM, только разница в том, кто именно данный алгоритм отработал WinAPI или мы сами.

    ----------
    Жив курилка! (Р. Ролан, "Кола Брюньон")
    Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

    Всего записей: 33227 | Зарегистр. 31-07-2002 | Отправлено: 00:03 17-01-2011
    dimbat



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Victor_VG

    Цитата:
    один вариант с вызовом плагина GetVersion

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

    ----------
    In Search We Trust

    Всего записей: 1034 | Зарегистр. 23-08-2003 | Отправлено: 00:14 17-01-2011
    Victor_VG



    Tracker Mod
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dimbat
     
    Да согласен, ошибки в нём автор правит исправно. Вот ещё бы Registry автор поправил, но там я ещё сам не точено понял отчего не понятную кодировку вместо кириллицы словил. При случае проверю.

    ----------
    Жив курилка! (Р. Ролан, "Кола Брюньон")
    Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

    Всего записей: 33227 | Зарегистр. 31-07-2002 | Отправлено: 00:30 17-01-2011
    sawerx



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем спасибо кто откликнулся, за семафоры отдельное мерси, оно стоит того, и ещё спасибо за то, что ваше обсуждение выявили то, в чем я подспудно сомневался.
     
    И ешё мне интересно, кто, как проверяет свои творения на предмет ошибок.

    Всего записей: 61 | Зарегистр. 21-11-2010 | Отправлено: 22:26 17-01-2011
    Victor_VG



    Tracker Mod
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sawerx
     
    Я поступаю просто - сомнительные куски кода проверяю на тестовых сборках, типа такого варианта:

    Код:
    OutFile test.exe
    ShowInstDetails show
    Var s17
    Section
       GetVersion::WindowsVersion
       Pop $s17
       StrCpy $1 $s17
       Push $0
       StrCpy $0 $s17 1
       StrCpy $s17 $s17 1 -1
       StrCpy $s17 $0$s17
       Pop $0
      DetailPrint "$$1 == $1"
      DetailPrint "$$s17 == $s17"
    SectionEnd

    идея простая - если где что не так, то на таком тестовом модуле отловить ошибку много проще, чем искать её в десятках тысяч строк кода (тот же Far Manager SE2 10455 строк кода только в основном модуле, не считая порядка 7000 строк в различных инклюдах и макросах, комментариев в коде нет - если что возня с разбором будет адова). Кстати, приведенный пример вытащит номер версии ядра в формате "minor""major" без точки - специально для сравнения операцией IntCmpU. А дальше пойдём по нужному ветвлению согласно алгоритму. Собственно для вытаскивания номера версии ОС нужны строки кода до pop $0, а DetailPrint это отладочные сообщения для контроля того, что мы получили.

    ----------
    Жив курилка! (Р. Ролан, "Кола Брюньон")
    Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

    Всего записей: 33227 | Зарегистр. 31-07-2002 | Отправлено: 22:52 17-01-2011 | Исправлено: Victor_VG, 22:58 17-01-2011
    Victor_VG



    Tracker Mod
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ну, кому свежих багов отсыпать? К автору сего "творения" обращаться бесполезно - парень на баг-репорты отвечает просто "Не вижу необходимости исправлять!". Пары месяцев бодания с ним и в итоге не исправленного бага ( не просто так он там до сих пор висит!) хватило.  
     
    На сей раз баг снова в старом месте, Reg2Nsis. Только поковарнее будет. Проявляется он просто - при конвертации автомат убирает ведущие нули сдвигая строку вывода в NSH-файле влево. Итог - например сбитые параметры запуска программы, на что я в Far Manager SE2 нарвался. Причём доказать себе, что это именно баг конвертера, а не моя собственная ошибка стоило времени и сил. Вот какие параметры имеет конвертер:

    Цитата:
    Reg2Nsis version 0.14 (C) Artem Zankovich <aarrtteemm@nm.ru>
    Converts registry informarion into NSIS-script commands
     
    Usage:
        Reg2Nsis (reg-file | reg-key) [-r] [(-o nsis-file | -O)]
     
    Parameters:
        reg-file     -- take values from the specified REG-file
        reg-key      -- take values from the specified registry key
        -r           -- iterate through registry subkeys recurrently (if
                        source is registry key)
        -o nsis-file -- send output to the specified file
        -O           -- send output to the file with the same name as
                        inputed REG-file but with the .nsh file extention
        -s           -- disable special folder substitution

    параметра управления удалением/усечением символов в них нет, следовательно мы вправе ожидать получения не искажённой информации, но....
     
    Вот вам пример:
     
    test1.reg:

    Цитата:
    REGEDIT4
     
    [HKEY_CURRENT_USER\Software\Far2\System]
    "ElevationMode"=dword:ffffffff

    test2.reg:

    Цитата:
    REGEDIT4
     
    [HKEY_CURRENT_USER\Software\Far2\System]
    "ElevationMode"=dword:0fffffff

    Обратите внимание на значение и размер строки:
    размер строки 4 байта, 8 hex-цифр, и значения:
     
    в первом случае "ElevationMode"=dword:ffffffff , а во втором "ElevationMode"=dword:0fffffff
     
    И вот результат конверсии:
     
    первый случай:
     
    WriteRegDWORD HKEY_CURRENT_USER "Software\Far2\System" "ElevationMode" 0xffffffff
     
    значение содержит 8  цифр
     
    И второй случай:
     
    WriteRegDWORD HKEY_CURRENT_USER "Software\Far2\System" "ElevationMode" 0xfffffff
     
     
    значение содержит 7  цифр - это что за фортеля
     
    внешне, на первый взгляд всё выглядит правильно, но! посчитайте во первых число цифр, и во во вторых сравните значения на входе конвертера и его выходе. На лицо потеря данных и их искажение.  
    В итоге параметры запуска программы сбиваются, и как проявление этого видим такой диалог на ровном месте:
     

     
    получается, что мне по милости этого халтурщика придётся в том же Far Manager SE2 перелопачивать вручную почти 170 Кб реестровый скрипт, не говоря уже о других проектах - видимо не менее 1/3 баг-репортов по ним были заложены этим его решением "убирать ведущие нули". Да, это допустимо в некоторых случаях, но если это цифровые значения такой фортель не допустим абсолютно. А если по его милости будет изменён код запуска ядерной ракеты? И что потом говорить что из-за его художеств мы получили вторую Хиросиму? Да за такие вещи надо башку отрывать вместе со всем что выступает за пределы корпуса ещё в роддоме.


    ----------
    Жив курилка! (Р. Ролан, "Кола Брюньон")
    Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

    Всего записей: 33227 | Зарегистр. 31-07-2002 | Отправлено: 05:26 19-01-2011 | Исправлено: Victor_VG, 05:36 19-01-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117

    Компьютерный форум Ru.Board » Компьютеры » Программы » Nullsoft Scriptable Install System | NSIS


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru