Строка версии продукта из exe - nsis

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

Большое спасибо !

 gigiman02 авг. 2016 г., 22:20
@ Ответы хорошо, я изменил вопрос
 gigiman02 авг. 2016 г., 21:07
@ Андерс, я ищу необязательную строку ...
 gigiman02 авг. 2016 г., 14:32
@ Андерс, вывод этой функцииDetailPrint: "ProdVer: $R2.$R3.$R4.$R5" .... и мне нужны фактические значения ...
 Anders02 авг. 2016 г., 15:37
Я уже указал вам на то, что дает вам именно то, о чем вы просили - getdllversion для 64-битной версии продукта, хранящейся в фиксированном блоке в информации о версии.
 gigiman02 авг. 2016 г., 15:57
@ Андерс, тогда я не знаю, как его использовать ... Кстати, я использую 32-битную систему.
 Anders02 авг. 2016 г., 19:15
Я не говорил о 64 против 32-битной Windows. Я говорил о числе, хранящемся в ресурсе версии, потому что в какой-то момент вы сказали, что хотели имя, а не xx.xx.xx.xx, но getdllversion получает только это число, поэтому трудно сказать, чего вы на самом деле хотите. Вы хотите строку или число? Вы хотите это во время компиляции в! Define или во время выполнения в переменной $?
 gigiman02 авг. 2016 г., 19:51
@ Андерс, извините за то, что я неясен. Для меня xx.xx.xx.xx означает версию файла exe, и я ищу версию продукта (которая, в моем случае, просто строка). Я думаю, что в! Определить является лучшим.
 Anders02 авг. 2016 г., 20:56
То, что вы не понимаете, это то, что вы называете «Версия продукта» на самом деле две вещи, число хранится вVS_FIXEDFILEINFO и необязательная строковая версия этого числа. GetDllVersion получает версию от VS_FIXEDFILEINFO.
 Anders02 авг. 2016 г., 15:09
Он прекрасно работает для меня, но он получает значение во время выполнения, и это то, что вы просили («сохранить в переменную»). Если вы хотели это в определении во время компиляции, то вы должны были просить об этом ...
 gigiman02 авг. 2016 г., 15:30
@ Андерс, пожалуйста, прости меня за недостаток знаний. Я просто хочу использовать имя версии продукта установщика (на самом деле это просто имя, а не что-то вроде xx.xx.xx.xx или что-то еще), чтобы получить доступ к ссылке для загрузки некоторых файлов, необходимых именно для этой версии продукта. Я не знаю никакого подхода, и я подумал о том, чтобы сохранить его вvar , Не могли бы вы сказать мне, каков мой выбор, или дать верный пример?
 Anders02 авг. 2016 г., 21:22
Ну, вы попросили GetDllVersion, который читает версию продукта. Вы должны отредактировать или удалить этот вопрос и перефразировать его так, чтобы было ясно, что вы хотите строку. Вы также должны указать, хотите ли вы это во время компиляции или во время выполнения. Время компиляции намного сложнее и требует хакерского обходного пути. Если вы передаете строку в! System, чтобы выполнить загрузку, тогда она понадобится вам во время компиляции ...

Ответы на вопрос(1)

Решение Вопроса

VS_FIXEDFILEINFO->dwFileVersion так что вам нужно вызвать Windows API напрямую:

; Add some version information so we have something to test
VIProductVersion 1.2.3.4
VIAddVersionKey "ProductVersion" "One Two Three Four"
VIAddVersionKey "FileVersion" "Whatever"
VIAddVersionKey "FileDescription" "Whatever"
VIAddVersionKey "LegalCopyright" "(C) Whatever"

!include LogicLib.nsh
Function GetFileVerFirstLangProductVersion
System::Store S
pop $3
push "" ;failed ret
System::Call 'version::GetFileVersionInfoSize(t"$3",i.r2)i.r0'
${If} $0 <> 0
    System::Alloc $0
    System::Call 'version::GetFileVersionInfo(t"$3",ir2,ir0,isr1)i.r0 ? e'
    pop $2
    ${If} $0 <> 0
    ${AndIf} $2 = 0 ;a user comment on MSDN said you should check GLE to avoid crash
        System::Call 'version::VerQueryValue(i r1,t "\VarFileInfo\Translation",*i0r2,*i0)i.r0'
        ${If} $0 <> 0
            System::Call '*$2(&i2.r2,&i2.r3)'
            IntFmt $2 %04x $2
            IntFmt $3 %04x $3
            System::Call 'version::VerQueryValue(i r1,t "\StringFileInfo\$2$3\ProductVersion",*i0r2,*i0r3)i.r0'
            ${If} $0 <> 0
                pop $0
                System::Call *$2(&t$3.s)
            ${EndIf}
        ${EndIf}
    ${EndIf}
    System::Free $1
${EndIf}
System::Store L
FunctionEnd

Section
Push "$ExePath" ; Read our own version information in this example
Call GetFileVerFirstLangProductVersion
Pop $0
DetailPrint "ProductVersion=$0"
SectionEnd
 gigiman04 авг. 2016 г., 10:03
Хорошо, теперь у меня есть более четкое представление. Спасибо, что нашли время, чтобы помочь мне, это высоко ценится.

Ваш ответ на вопрос