|  | 
| 本帖最后由 chiannet 于 2013-9-13 14:13 编辑 
 unit WindowsSysVersion;
 interface
 uses
 Registry, windows  ;
 {$IFDEF CONDITIONALEXPRESSIONS}
 {$IF Defined(TOSVersionInfoEx)}
 {$DEFINE TOSVERSIONINFOEX_DEFINED}
 {$IFEND}
 {$ENDIF}
 {$IFNDEF TOSVERSIONINFOEX_DEFINED}
 type
 POSVersionInfoEx = ^TOSVersionInfoEx;
 TOSVersionInfoEx = packed record
 dwOSVersionInfoSize: DWORD;             {结构大小}
 dwMajorVersion: DWORD;                  {主编号}
 dwMinorVersion: DWORD;                  {次编号}
 dwBuildNumber: DWORD;                   {建立编号}
 dwPlatformId: DWORD;                    {作业平台}
 szCSDVersion: array[0..127] of AnsiChar;{更多说明}
 wServicePackMajor: Word;
 wServicePackMinor: Word;
 wSuiteMask: Word;
 wProductType: Byte;
 wReserved: Byte;
 end;
 
 const
 VER_SERVER_NT = $80000000;
 {$EXTERNALSYM VER_SERVER_NT}
 VER_WORKSTATION_NT = $40000000;
 {$EXTERNALSYM VER_WORKSTATION_NT}
 VER_SUITE_SMALLBUSINESS = $00000001;
 {$EXTERNALSYM VER_SUITE_SMALLBUSINESS}
 VER_SUITE_ENTERPRISE = $00000002;
 {$EXTERNALSYM VER_SUITE_ENTERPRISE}
 VER_SUITE_BACKOFFICE = $00000004;
 {$EXTERNALSYM VER_SUITE_BACKOFFICE}
 VER_SUITE_COMMUNICATIONS = $00000008;
 {$EXTERNALSYM VER_SUITE_COMMUNICATIONS}
 VER_SUITE_TERMINAL = $00000010;
 {$EXTERNALSYM VER_SUITE_TERMINAL}
 VER_SUITE_SMALLBUSINESS_RESTRICTED = $00000020;
 {$EXTERNALSYM VER_SUITE_SMALLBUSINESS_RESTRICTED}
 VER_SUITE_EMBEDDEDNT = $00000040;
 {$EXTERNALSYM VER_SUITE_EMBEDDEDNT}
 VER_SUITE_DATACENTER = $00000080;
 {$EXTERNALSYM VER_SUITE_DATACENTER}
 VER_SUITE_SINGLEUSERTS = $00000100;
 {$EXTERNALSYM VER_SUITE_SINGLEUSERTS}
 VER_SUITE_PERSONAL = $00000200;
 {$EXTERNALSYM VER_SUITE_PERSONAL}
 VER_SUITE_BLADE = $00000400;
 {$EXTERNALSYM VER_SUITE_BLADE}
 VER_SUITE_EMBEDDED_RESTRICTED = $00000800;
 {$EXTERNALSYM VER_SUITE_EMBEDDED_RESTRICTED}
 VER_SUITE_SECURITY_APPLIANCE = $00001000;
 {$EXTERNALSYM VER_SUITE_SECURITY_APPLIANCE}
 VER_SUITE_WH_SERVER = $00008000;
 {$EXTERNALSYM VER_SUITE_WH_SERVER}
 PROCESSOR_ARCHITECTURE_AMD64 = 9;
 {$EXTERNALSYM PROCESSOR_ARCHITECTURE_AMD64}
 SM_SERVERR2 = 89;
 {$EXTERNALSYM SM_SERVERR2}
 const
 VER_NT_WORKSTATION = $0000001;
 {$EXTERNALSYM VER_NT_WORKSTATION}
 VER_NT_DOMAIN_CONTROLLER = $0000002;
 {$EXTERNALSYM VER_NT_DOMAIN_CONTROLLER}
 VER_NT_SERVER = $0000003;
 {$EXTERNALSYM VER_NT_SERVER}
 
 {$ENDIF} // TOSVERSIONINFOEX_DEFINED
 
 
 //取操作系统信息填充到结构
 function GetOSVersionInfo(var Info: TOSVersionInfoEx): Boolean;
 //windows系统类型 0表示取不到 1表示非服务器 2表示服务器
 function GetWindowsSystemType: integer;
 //取windows系统版本信息,主函数
 function GetWindowsSystemVersion: string;
 // 判断是否64位OS
 function IsWin64: Boolean;
 
 implementation
 
 function IsWin64: Boolean;
 var
 Kernel32Handle: THandle;
 IsWow64Process: function(Handle: Windows.THandle; var Res: Windows.BOOL): Windows.BOOL; stdcall;
 GetNativeSystemInfo: procedure(var lpSystemInfo: TSystemInfo); stdcall;
 isWoW64: Bool;
 SystemInfo: TSystemInfo;
 const
 PROCESSOR_ARCHITECTURE_AMD64 = 9;
 PROCESSOR_ARCHITECTURE_IA64 = 6;
 begin
 Kernel32Handle := GetModuleHandle('KERNEL32.DLL');
 if Kernel32Handle = 0 then
 Kernel32Handle := LoadLibrary('KERNEL32.DLL');
 if Kernel32Handle <> 0 then
 begin
 IsWOW64Process := GetProcAddress(Kernel32Handle,'IsWow64Process');
 GetNativeSystemInfo := GetProcAddress(Kernel32Handle,'GetNativeSystemInfo');
 if Assigned(IsWow64Process) then
 begin
 IsWow64Process(GetCurrentProcess,isWoW64);
 Result := isWoW64 and Assigned(GetNativeSystemInfo);
 if Result then
 begin
 GetNativeSystemInfo(SystemInfo);
 Result := (SystemInfo.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64) or
 (SystemInfo.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_IA64);
 end;
 end
 else Result := False;
 end
 else Result := False;
 end;
 
 function GetWindowsSystemType: integer;
 var
 info: TOSVersionInfoEx;
 begin
 result := 0;
 if (GetOSVersionInfo(info) = false) then exit;
 case info.wProductType of
 VER_NT_WORKSTATION:       Result:= 1; //非服务器
 VER_NT_SERVER:            Result:= 2; //服务器版
 VER_NT_DOMAIN_CONTROLLER: Result:= 2; //域服务器
 end;
 end;
 
 
 
 function GetWindowsSystemVersion: string;
 var
 info: TOSVersionInfoEx;
 sysInfo: Tsysteminfo;
 ARegistry : TRegistry;
 begin
 Result :='None';
 windows.GetSystemInfo(sysInfo);       //系统信息
 try
 if (GetOSVersionInfo(info) = false) then exit;
 with info do begin
 case dwMajorVersion of         //主版本
 3: if dwMinorVersion=51 then Result :='NT 3.51';
 4: case dwMinorVersion of    //次版本
 0: case dwPlatformId  of
 VER_PLATFORM_WIN32_WINDOWS:  if (szCSDVersion[1] ='B') or (szCSDVersion[1] ='C') then Result :='95 OSR2' else Result :='95';
 VER_PLATFORM_WIN32_NT: case wProductType of
 VER_NT_WORKSTATION: Result :='NT Workstation 4.0';
 VER_NT_SERVER: if wSuiteMask = VER_SUITE_ENTERPRISE then  Result :='NT Advanced Server 4.0' else Result :='NT Server 4.0';
 end;
 end;
 1: if szCSDVersion[1] = 'A' then Result :='98 SE' else Result :='98';
 9: Result :='Me';
 end;
 5: case dwMinorVersion of
 0:  case wProductType of
 VER_NT_WORKSTATION: Result := '2000 Professional';
 VER_NT_SERVER: if wSuiteMask and VER_SUITE_DATACENTER <> 0 then  Result :='2000 Datacenter Server'
 else if wSuiteMask and VER_SUITE_ENTERPRISE <> 0 then Result :='2000 Advanced Server'
 else Result :='2000 Server';
 end;
 1: if wSuiteMask and VER_SUITE_PERSONAL <> 0 then Result :='XP Home Edition' else Result :='XP Professional';
 2: begin
 if GetSystemMetrics(SM_SERVERR2) = 0 then Result :='Server 2003'  else Result :='Server 2003 R2';
 if wSuiteMask and VER_SUITE_DATACENTER <>0 then Result :=Result +' Datacenter Edition'
 else if wSuiteMask and VER_SUITE_ENTERPRISE <>0 then Result :=Result +' Enterprise Edition'
 else if wSuiteMask and VER_SUITE_BLADE  <>0 then Result :=Result +' Web Edition'
 else if wSuiteMask = VER_SUITE_WH_SERVER  then Result :='2003 Home Server'
 else Result :=Result +' Standard Edition';
 end;
 end;
 6: begin
 case dwMinorVersion of
 0: if wProductType = VER_NT_WORKSTATION then Result :='Vista' else Result :='Server 2008';
 1: if wProductType = VER_NT_WORKSTATION then Result :='7' else Result :='Server 2008 R2';
 2: if wProductType = VER_NT_WORKSTATION then Result :='8' else Result :='Server 8';
 3: if wProductType = VER_NT_WORKSTATION then Result :='8.1' ;
 end;
 ARegistry := TRegistry.Create;
 with ARegistry do
 begin
 RootKey :=HKEY_LOCAL_MACHINE;
 if OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion',false ) then Result :=Result+' '+ReadString('EditionID');
 CloseKey;
 Destroy;
 end;
 end;
 end;
 Result:='Windows '+Result;
 if iswin64 then Result:=Result+' X64';
 if dwMajorVersion>=5 then  Result:=Result+' '+szCSDVersion;
 end;
 except
 exit;
 end;
 
 end;
 
 
 
 function GetOSVersionInfo(var Info: TOSVersionInfoEx): Boolean;
 begin
 FillChar(Info, SizeOf(TOSVersionInfoEx), 0);
 Info.dwOSVersionInfoSize := SizeOf(TOSVersionInfoEx);
 Result := GetVersionEx(TOSVersionInfo(Addr(Info)^));
 if (not Result) then
 Info.dwOSVersionInfoSize := 0;
 end;
 end.
 | 
 |