2013-01-19 31 views
5

In NSIS gibt es eine Möglichkeit festzustellen, welche Version von Windows der Benutzer gerade ausführt?NSIS Detect Windows Version

Der Grund, warum ich das tun möchte, ist, weil mein Installationsprogramm auf einem Windows XP-Computer anders aussieht. Mein Installer verwendet MUI2, aber ich habe nicht die gleichen GUI-Schaltflächen (ich glaube, es heißt XP-Stil) wie ich in Windows 7 und das Hauptfenster des Installationsprogramms ist viel größer als in Windows 7 (wo es etwa 500 mal 400 Pixel). Ist es normal, diese Unterschiede in einem Installer mit MUI2 zu haben?Ich dachte MUI2 machte den Look konsistent in Windows-Versionen XP und höher?

Um den Unterschied in der Größe des Installer-Fensters zu überwinden, ist es meine Lösung zu erkennen, ob der Benutzer Windows XP verwendet und das Fenster entsprechend skaliert. Ist das möglich?

Ich muss das Fenster eine bestimmte Größe haben, weil ich ein Hintergrundbild habe und das Bild 500px breit ist, wenn das Installerfenster größer ist, habe ich eine leere Lücke. Ich kann das Hintergrundbild ändern, um breiter zu sein, aber die einfachste Lösung für mich ist die oben beschriebene

+0

Vielleicht Screenshots von XP und 7, damit wir sehen können, worüber Sie sprechen? – Anders

Antwort

4

MUI ändert die Fenstergröße nicht basierend auf der Windows-Version. Die Fenstergröße hängt jedoch von der Schriftart und den DPI-Einstellungen ab.

Verwenden Sie WinVer.nsh, um die Windows-Version zu erkennen. Dieses Modul ist standardmäßig im Ordner NSIS includes enthalten.

5

Falls Anders' answer nicht explizit genug ist (brauchte ein paar Stunden, um es richtig zu machen), hier ist eine mehr "anfängerfreundliche" Version.

Sie müssen !include WinVer.nsh in den oberen Abschnitt der Datei cd.nsi hinzufügen.

Anschließend können Sie folgenden Code verwenden:

${If} ${IsWinXP} 
    MessageBox MB_OK|MB_ICONEXCLAMATION "We have Win XP" 
${EndIf} 

Dies ist die einzige Funktion, die ich getestet, aber die WinVer.nsh Datei beginnt mit einem Mini-Handbuch mit seinen Funktionen, darunter:

  • AtLeastWin<version> überprüft, ob das Installationsprogramm mindestens so wie unter Windows ausgeführt ausgeführt wird.
  • IsWin<version> überprüft, ob das Installationsprogramm unter Windows genau wie angegeben ausgeführt wird.
  • AtMostWin<version> überprüft, ob das Installationsprogramm höchstens wie angegeben unter Windows ausgeführt wird.

<version> kann mit den folgenden Werten (und vielleicht auch mehr, je nachdem, wie Neuaufnahmen WinVer.nsh Datei ist) ersetzt werden: 95, 98, ME, NT4, 2000, XP, 2003, Vista, 2008, 7 , 2008R2

Es gibt einige weitere Funktionen und einige Anwendungsbeispiele in WinVer.nsh Datei, die wahrscheinlich irgendwo wie C: \ Programme \ NSIS \ Include, wie:

  • AtLeastServicePack der prüft, ob das Installationsprogramm auf Windows Service Pack-Version mindestens wie angegeben ausgeführt wird.
  • IsServicePack überprüft, ob das Installationsprogramm unter Windows Service Pack-Version genau wie angegeben ausgeführt wird.
  • AtMostServicePack überprüft, ob das Installationsprogramm maximal wie angegeben auf dem Windows-Dienstversions-Pack ausgeführt wird.
  • IsWin2003R2 (nicht mehr Details geliefert)
  • IsStarterEdition (keine weiteren Details geliefert)
  • OSHasMediaCenter (keine weiteren Details geliefert)
  • OSHasTabletSupport (keine weiteren Details geliefert)
+1

N.B. Laut der http://nsis.sourceforge.net/Get_Windows_version Seite ist 'WinVer.nsh' ziemlich veraltet. Es ist besser, die 'GetWindowsVersion'-Funktion hinzuzufügen, die [weiter unten auf der Seite] (http://nsis.sourceforge.net/Get_Windows_version#Alternate_Script_With_Server_Versions) ist. Dies wurde erweitert, um zu Windows 10/Server 2016 zu passen. Kopieren Sie einfach das Skript und fügen Sie es am Anfang Ihrer '.nsi' Datei ein. Dann können Sie die Ausgabe über '$ {GetWindowsVersion} $ R0',' StrCmp $ R0 "10.0" win10 not_win10' vergleichen (Sie können auch Windows 7/8.1 erhalten, wenn Sie Windows 10 erwarten, wenn Sie ein Upgrade durchgeführt haben). – icc97

1

Snippet unten zeigt wie man die Windows Version mit so vielen Details identifiziert, wie ich mir das vorstellen kann:

!include WinVer.nsh 
!include "LogicLib.nsh" 

Function LogWinVer 

    ${WinVerGetMajor} $R0 
    ${WinVerGetMinor} $R1 
    ${WinVerGetBuild} $R2 
    ${WinVerGetServicePackLevel} $R3 

    ; determine windows product name 
    ${If} $R0 == 5 
      ${If} $R1 == 0 
        DetailPrint "Windows 2000 SP $R3" 
      ${ElseIf} $R1 == 1 
        DetailPrint "Windows XP SP $R3" 
      ${ElseIf} $R1 == 2 
        DetailPrint "Windows Server 2003 SP $R3" 
      ${EndIf} 
    ${ElseIf} $R0 == 6 
      ${If} $R1 == 0 
        ${If} ${IsServerOS} 
          DetailPrint "Windows Server 2008 SP $R3" 
        ${Else} 
          DetailPrint "Windows Vista SP $R3" 
        ${EndIf} 
      ${ElseIf} $R1 == 1 
        ${If} ${IsServerOS} 
          DetailPrint "Windows Server 2008 R2 SP $R3" 
        ${Else} 
          DetailPrint "Windows 7 SP $R3" 
        ${EndIf} 
      ${ElseIf} $R1 == 2 
        ${If} ${IsServerOS} 
          DetailPrint "Windows Server 2012 SP $R3" 
        ${Else} 
          DetailPrint "Windows 8 SP $R3" 
        ${EndIf} 
      ${ElseIf} $R1 == 3 
        ${If} ${IsServerOS} 
          DetailPrint "Windows Server 2012 R2 SP $R3" 
        ${Else} 
          DetailPrint "Windows 8.1 SP $R3" 
        ${EndIf} 
      ${EndIf} 
    ${EndIf} 

    ; version 
    DetailPrint "Kernel $R0.$R1 build $R2" 


    ; x86 or x64: 
    Call LogWinVer 
    System::Call "kernel32::GetCurrentProcess() i .s" 
    System::Call "kernel32::IsWow64Process(i s, *i .r0)" 
    StrCmp $0 "0" is32bit is64bit 

    is32bit: 
      DetailPrint "32 bit" 
      Goto exit 
    is64bit: 
      DetailPrint "64 bit" 
    exit: 
FunctionEnd 
1

Sie können auch direkt aus der Registrierung gelesen:

ReadRegStr $WinEdition HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "ProductName" 

Als nächst Sie es vergleichen mit „==“, zum Beispiel:

${If} $WinEdition == "Windows XP" 

oder Sie könnten StrContains, wenn die überprüfen verwenden Windows-Version enthält "Windows XP"

+0

nette Erklärung – Mark