2013-01-19 39 views
5

Trong NSIS có cách nào để xác định phiên bản nào của người dùng hiện đang chạy?NSIS Phát hiện Phiên bản Windows

Lý do tôi muốn làm điều này là do trình cài đặt của tôi trông khác trên máy tính Windows XP. Trình cài đặt của tôi sử dụng MUI2 nhưng dường như tôi không có các nút GUI giống như tôi làm trong Windows 7 và cửa sổ trình cài đặt chính lớn hơn nhiều so với Windows 7 (khoảng 500 x 400 pixel). Việc sử dụng MUI2 có bình thường với những khác biệt này không?Tôi nghĩ MUI2 đã tạo nên sự phù hợp trong các phiên bản Windows XP trở lên?

Để khắc phục sự khác biệt về kích thước cửa sổ trình cài đặt, giải pháp của tôi là phát hiện xem người dùng có sử dụng Windows XP và thay đổi kích thước cửa sổ tương ứng không. Điều này có thể không?

Tôi cần phải có cửa sổ kích thước cụ thể vì tôi có hình nền và hình ảnh rộng 500px nên nếu cửa sổ trình cài đặt lớn hơn, tôi có khoảng trống. Tôi có thể thay đổi hình nền thành rộng hơn nhưng giải pháp đơn giản nhất cho bản thân tôi là giải pháp tôi đã giải thích ở trên

+0

Có thể đăng ảnh chụp màn hình của XP và 7 để chúng tôi có thể xem bạn đang nói về điều gì? – Anders

Trả lời

4

MUI không thay đổi kích thước cửa sổ dựa trên phiên bản Windows. Tuy nhiên, kích thước cửa sổ bị ảnh hưởng bởi cài đặt phông chữ và DPI.

Sử dụng WinVer.nsh để phát hiện phiên bản Windows. Mô-đun này được bao gồm trong NSIS bao gồm thư mục theo mặc định.

5

Trong trường hợp Anders' answer không đủ rõ ràng (đã cho tôi một vài giờ để làm cho nó đúng), đây là một phiên bản "thân thiện với người mới bắt đầu" hơn.

Bạn cần thêm !include WinVer.nsh vào phần trên cùng của tệp cd.nsi.

Sau đó bạn có thể sử dụng mã như thế này:

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

Đây là chức năng duy nhất tôi được thử nghiệm, nhưng các tập tin WinVer.nsh bắt đầu với một thủ công mini với chức năng của mình, trong đó bao gồm:

  • AtLeastWin<version> kiểm tra xem trình cài đặt có đang chạy trên phiên bản Windows ít nhất là được chỉ định hay không.
  • IsWin<version> kiểm tra xem trình cài đặt có đang chạy trên phiên bản Windows chính xác như được chỉ định hay không.
  • AtMostWin<version> kiểm tra xem trình cài đặt có đang chạy trên phiên bản Windows tối đa được chỉ định hay không.

<version> có thể được thay thế bằng các giá trị sau (và có thể hơn, tùy thuộc vào cách gần đây tập WinVer.nsh của bạn là): 95, 98, ME, NT4, 2000, XP, 2003, Vista, 2008, 7 , 2008R2

Có một số chức năng khác và một số ví dụ sử dụng trong WinVer.tập tin NSH, mà có lẽ là nằm ở đâu đó như C: \ Program Files \ NSIS \ Bao gồm, như:

  • AtLeastServicePack mà kiểm tra nếu trình cài đặt đang chạy trên Windows phiên bản gói dịch vụ tối thiểu theo quy định.
  • IsServicePack kiểm tra xem trình cài đặt có đang chạy trên phiên bản gói dịch vụ Windows chính xác như được chỉ định hay không.
  • AtMostServicePack kiểm tra xem trình cài đặt có đang chạy trên gói phiên bản dịch vụ Windows tối đa được chỉ định hay không.
  • IsWin2003R2 (không thêm chi tiết cung cấp)
  • IsStarterEdition (không có thêm chi tiết cung cấp)
  • OSHasMediaCenter (không có thêm chi tiết cung cấp)
  • OSHasTabletSupport (không có thêm chi tiết cung cấp)
+1

N.B. Theo trang http://nsis.sourceforge.net/Get_Windows_version, 'WinVer.nsh' khá lạc hậu. Tốt hơn là thêm chức năng 'GetWindowsVersion' là [tiếp tục xuống trang] (http://nsis.sourceforge.net/Get_Windows_version#Alternate_Script_With_Server_Versions). Điều đó đã được mở rộng để phù hợp với tối đa Windows 10/Server 2016. Chỉ cần sao chép và dán tập lệnh vào đầu tệp '.nsi' của bạn. Sau đó, bạn có thể so sánh đầu ra thông qua '$ {GetWindowsVersion} $ R0',' StrCmp $ R0 "10.0" win10 not_win10' (Bạn cũng có thể lấy Windows 7/8.1 khi bạn mong đợi Windows 10 nếu bạn đã nâng cấp). – icc97

1

Đoạn chương trình dưới đây cách xác định Phiên bản Windows với nhiều chi tiết như tôi có thể tưởng tượng là hữu ích:

!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

Bạn cũng có thể đọc từ registry trực tiếp:

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

Tiếp theo, bạn có thể so sánh nó sử dụng "==", ví dụ:

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

hoặc bạn có thể sử dụng StrContains để kiểm tra xem phiên bản windows chứa "Windows XP"

+0

giải thích hay – Mark

Các vấn đề liên quan