2016-08-01 6 views
0

Ich möchte die Produktversion (optional string) von einer gegebenen ausführbaren Datei (eigentlich vom Installer, den ich versuche zu erstellen, wenn es einen Unterschied macht) lesen, wenn es im Lauf möglich ist -Zeit. Diese Zeichenfolge wird außerdem zum Herunterladen von Dateien von einem Link verwendet.Produktversions - String von einer Exe - nition

Vielen Dank!

+0

@Anders, die Ausgabe dieser Funktion ist 'DetailPrint:„ProdVer: $ R2 . $ R3. $ R4. $ R5 "' .... und ich brauche die tatsächlichen Werte ... – gigiman

+0

Es funktioniert gut für mich, aber es bekommt den Wert zur Laufzeit und das ist, was Sie gefragt haben ("keep es in eine Variable "). Wenn Sie es in einer Definition zur Kompilierzeit wollten, dann sollten Sie danach gefragt haben ... – Anders

+0

@Anders, bitte verzeihen Sie meinen Mangel an Wissen. Ich möchte nur den Produktversionsnamen des Installers verwenden (es ist wirklich nur ein Name, nicht etwas wie xx.xx.xx.xx oder was auch immer), um auf einen Link zum Herunterladen von Dateien zuzugreifen, die für genau diese Produktversion benötigt werden. Ich kenne keine Herangehensweise und dachte darüber nach, sie in einer 'var' zu speichern. Kannst du mir bitte sagen, was meine Wahl ist oder mir ein gutes Beispiel geben? – gigiman

Antwort

0

NSIS hat keine native Unterstützung für etwas anderes als VS_FIXEDFILEINFO Lesen ->dwFileVersion so müssen Sie direkt die Windows-API-Aufruf:

; 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 
+0

Ok, ich habe jetzt eine klarere Sicht. Danke, dass Sie sich die Zeit genommen haben, mir zu helfen, es wird sehr geschätzt. – gigiman

Verwandte Themen