Сравните "установленную-версию" с "устанавливаемой-версией" - PullRequest
0 голосов
/ 06 мая 2020

Работаю с NSIS (v3.05) уже несколько недель. Делает то, что нужно. Я преследовал следующую проблему в течение нескольких дней и не мог полностью ее понять. Постановка проблемы: Сравните две (2) версии друг с другом. Много способов реализовать. Я выбрал следующее: 1-я «версия» (строка) извлекается из файла .txt установленной в данный момент версии через (функцию) LineRead (! Include TextFun c .n sh) следующим образом:

IfFileExists "C:\$PROGRAMFILES64\...\VERSION.txt" 0 +31 # Open the file and perform N FileRead 
    DetailPrint "VERSION.txt found!"   
    ${LineRead} "C:\$PROGRAMFILES64\...\VERSION.txt" "7" $4  # $4 = '1.x.y.z' (for example)

2-я «версия» извлекается с помощью следующего кода:

!getdllversion "C:\...\application_name.exe" expversion_
StrCpy $7 ${expversion_}  # pass the define string 'expversion' to $7

В последней части я использую следующий код для сравнения 4 и 7 долларов:

${VersionCompare} $4 $7 $R0

Это может работать только так, как я точно знаете, что '$ 4' (строка версии # 1) и '$ 7' (строка версии # 2) являются правильными входными данными для VersionCompare (выход: $ R0)

Вопрос: есть ли способ отобразить (для test / check) содержимое $ 4 (@ время компиляции), чтобы точно знать, что var $ 4 содержит правильную строку, которая должна быть передана в функцию VersionCompare? (попробовал 'DetailPrint $ 4'; не преобразуется в ожидаемую строку (полученную функцией 'LineRead'). (Я знаю, что 'DetailPrint' отображается только во время выполнения установки '.exe. файла, поэтому имеет смысл не видеть, что @ compile время.)

Output from MakeNSIS:
IfFileExists: "C:\$PROGRAMFILES64\...\VERSION.txt" ? 0 : +31
DetailPrint: "VERSION.txt found!"
!insertmacro: LineReadCall
!insertmacro: end of LineReadCall
DetailPrint: "The version number of the currently installed app: $4"

Как получить разрешение $ 4 в строку версии (для целей тестирования) во время компиляции)?

Вопрос номер 2: я использую команду препроцессора! GetDLLVersion 'в функции для получения номера версии устанавливаемой версии' приложения '(через установщик NSIS ...). MakeNSIS отображает правильное разрешение версии:

Function: "VersionRetrievalBinary"
!getdllversion: C:\1_SW_dev\...\app.exe (1.8.47.5)->(expversion_<1..4>)

Вопрос: Что такое «expverion_» ?; вар или определение? Если определение (которое я прочитал здесь => Ссылка /! Getdllversion ), нужно ли мне определять его в моем скрипте следующим образом?:

!define expverion_1 " "  # Major; single digit
!define expverion_2 "  "  # Minor; 2-digit
!define expverion_3 "   " # Build; 3-digit
!define expverion_4 "   "# Revision; 3-digit

Неуверенный, что такое 'expversion_' точно есть и работает / работает MakeNSIS выдает следующее предупреждение, что -Я думаю- явно указывает на что-то не так:

warning 6000: unknown variable/constant "{expversion_}" detected, ignoring (C:\1_SW_dev\...\app_client.nsi:295)

Тревожная часть - это слово ' ignoring ' в сообщении компиляции MakeNSIS . Могу ли я сделать вывод из вышеупомянутого предупреждающего сообщения, что присвоение строки, полученной из (define?), С именем «expversion_» не передается в var $ 7 с помощью команды:

StrCpy $7 ${expversion_}

После сообщения MakeNSIS (@ compile time), похоже, подтверждает это:

StrCpy $7 "${expversion_}" () ()

Кажется, что он разрешает пустой (не уверен, правильно ли я прочитал это сообщение MakeNSIS).

Хотя я многому научился по NSIS (и мне это нравится) и просмотрел большую часть соответствующей документации, я не могу понять это.

Заранее спасибо за решение этой конкретной c части головоломки.

Решил головоломку сам. Решение для сравнения версий довольно «простое». Существенные части при этом: (добавить в .onInit)

  1. Создать функцию (например, назвать VersionComparison)
  2. Прочитать локальную версию из реестра
  3. 'Прочитать' версия установки из двоичного файла (например, .DLL или .exe)
  4. Используйте VersionCompare (! include WordFun c .n sh) для выполнения фактического сравнения.

1 Ответ

0 голосов
/ 06 мая 2020

Я сначала займусь проблемой !getdllversion. Он извлекает 4 16-битных числа из начала информационного блока версии и сохраняет их в 4 определениях. Он просто использует имя, которое вы передаете, плюс число при именовании определений.

!getdllversion "$%windir%\explorer.exe" foo
!warning ${foo2} ; This prints the minor version

Не указано c количество цифр, как ожидается в ваших комментариях. Каждое из 4 чисел go от 0 до 65535.

Вы можете выполнить базовую c проверку этих чисел во время компиляции:

!if ${foo1} < 1
!error "Major version must at least be 1, we don't ship beta software :) " 
!endif

Вторую задачу решить сложнее . Переменные можно раскрыть только при запущенной программе установки. Единственный вариант - создать и запустить «установщик» из основного .nsi:

!makensis vertest.nsi = 0
!execute '"$%temp%\vertest.exe" /S' = 0
!defile "$%temp%\vertest.exe" 

, где vertest.nsi будет выглядеть примерно так:

OutFile "$%temp%\vertest.exe" 
RequestExecutionLevel user
SilentInstall silent

Section
Do version test here and Goto.. 
fail:
Abort
success:
SectionEnd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...