Работаю с 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)
- Создать функцию (например, назвать VersionComparison)
- Прочитать локальную версию из реестра
- 'Прочитать' версия установки из двоичного файла (например, .DLL или .exe)
- Используйте VersionCompare (! include WordFun c .n sh) для выполнения фактического сравнения.