我在当初制作 foobar2000 曾查看过 NSIS 的帮助文件,这是安装脚本的一段,比较简单,只是判断了一下是否为 NT 内核,就是说:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"CurrentVersion 的值为空是肯定是 9X 内核。
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
StrCmp $R0 "" 0 lbl_winnt
DetailPrint "你的电脑操作系统为 9X 内核,现在将安装 ANSI 版本"
File "filewin98foobar2000.exe"
goto lbl_OK
lbl_winnt:
DetailPrint "你的电脑操作系统为 NT 内核,现在将安装 Unicode 版本"
File "filewinntfoobar2000.exe"
lbl_OK:
......
以下是 NSIS 帮助文件中的说明:
; GetWindowsVersion
;
; Based on Yazno's function,
http://yazno.tripod.com/powerpimpit/ ; Returns on top of stack
;
; Windows Version (95, 98, ME, NT x.x, 2000, XP, .NET Server)
; or
; '' (Unknown Windows Version)
;
; Usage:
; Call GetWindowsVersion
; Pop $R0
; ; at this point $R0 is "NT 4.0" or whatnot
Function GetWindowsVersion
Push $R0
Push $R1
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
StrCmp $R0 "" 0 lbl_winnt
; we are not NT.
ReadRegStr $R0 HKLM SOFTWARE\Microsoft\Windows\CurrentVersion VersionNumber
StrCpy $R1 $R0 1
StrCmp $R1 '4' 0 lbl_error
StrCpy $R1 $R0 3
StrCmp $R1 '4.0' lbl_win32_95
StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98
lbl_win32_95:
StrCpy $R0 '95'
Goto lbl_done
lbl_win32_98:
StrCpy $R0 '98'
Goto lbl_done
lbl_win32_ME:
StrCpy $R0 'ME'
Goto lbl_done
lbl_winnt:
StrCpy $R1 $R0 1
StrCmp $R1 '3' lbl_winnt_x
StrCmp $R1 '4' lbl_winnt_x
StrCpy $R1 $R0 3
StrCmp $R1 '5.0' lbl_winnt_2000
StrCmp $R1 '5.1' lbl_winnt_XP
StrCmp $R1 '5.2' lbl_winnt_dotNET lbl_error
lbl_winnt_x:
StrCpy $R0 "NT $R0" 6
Goto lbl_done
lbl_winnt_2000:
Strcpy $R0 '2000'
Goto lbl_done
lbl_winnt_XP:
Strcpy $R0 'XP'
Goto lbl_done
lbl_winnt_dotNET:
Strcpy $R0 '.NET Server'
Goto lbl_done
lbl_error:
Strcpy $R0 ''
lbl_done:
Pop $R1
Exch $R0
FunctionEnd
就是说,CurrentVersion 的值为 4.0 则是 NT 4.0,值为 5.0 则是 2000,值为 5.1 则是 XP,值是 5.2 则为 net,2003 我没有安装过,具体不能确定。
当然,如果这个值为空,则是 9X 内核,转到注册表以下键值判断:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion]
"Version"="Windwos 98" 那肯定是 98,Windows 95 印象中好象就是“Windows 95”,当时查过。