如何取得OS正確版本,包含Win7 X64 |
尚未結案
|
g9221712
高階會員 發表:145 回覆:344 積分:162 註冊:2006-07-06 發送簡訊給我 |
各位前輩:
不知道有無寫到關於OS辨識的部分,自己有搜尋一下,不過測試好像再取得win7版本會有異常 是否可以各位前輩指正。 感謝 [code delphi] unit GetWinVersionInfo; interface uses Windows, Registry, SysUtils; type _OSVERSIONINFOEX = 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; TOSVERSIONINFOEX = _OSVERSIONINFOEX; function GetVersionExA(var lpVersionInformation: TOSVERSIONINFOEX): BOOL; stdcall; external kernel32; const VER_NT_WORKSTATION: Integer = 1; VER_SUITE_ENTERPRISE: Integer = 2; VER_NT_SERVER: Integer = 3; VER_SUITE_DATACENTER: Integer = 128; VER_SUITE_PERSONAL: Integer = 512; const PRODUCT_BUSINESS = $00000006; { Business Edition } PRODUCT_BUSINESS_N = $00000010; { Business Edition } PRODUCT_CLUSTER_SERVER = $00000012; { Cluster Server Edition } PRODUCT_DATACENTER_SERVER = $00000008; { Server Datacenter Edition (full installation) } PRODUCT_DATACENTER_SERVER_CORE = $0000000C; { Server Datacenter Edition (core installation) } PRODUCT_ENTERPRISE = $00000004; { Enterprise Edition } PRODUCT_ENTERPRISE_N = $0000001B; { Enterprise Edition } PRODUCT_ENTERPRISE_SERVER = $0000000A; { Server Enterprise Edition (full installation) } PRODUCT_ENTERPRISE_SERVER_CORE = $0000000E; { Server Enterprise Edition (core installation) } PRODUCT_ENTERPRISE_SERVER_IA64 = $0000000F; { Server Enterprise Edition for Itanium-based Systems } PRODUCT_HOME_BASIC = $00000002; { Home Basic Edition } PRODUCT_HOME_BASIC_N = $00000005; { Home Basic Edition } PRODUCT_HOME_PREMIUM = $00000003; { Home Premium Edition } PRODUCT_HOME_PREMIUM_N = $0000001A; { Home Premium Edition } PRODUCT_HOME_SERVER = $00000013; { Home Server Edition } PRODUCT_SERVER_FOR_SMALLBUSINESS = $00000018; { Server for Small Business Edition } PRODUCT_SMALLBUSINESS_SERVER = $00000009; { Small Business Server } PRODUCT_SMALLBUSINESS_SERVER_PREMIUM = $00000019; { Small Business Server Premium Edition } PRODUCT_STANDARD_SERVER = $00000007; { Server Standard Edition (full installation) } PRODUCT_STANDARD_SERVER_CORE = $0000000D; { Server Standard Edition (core installation) } PRODUCT_STARTER = $0000000B; { Starter Edition } PRODUCT_STORAGE_ENTERPRISE_SERVER = $00000017; { Storage Server Enterprise Edition } PRODUCT_STORAGE_EXPRESS_SERVER = $00000014; { Storage Server Express Edition } PRODUCT_STORAGE_STANDARD_SERVER = $00000015; { Storage Server Standard Edition } PRODUCT_STORAGE_WORKGROUP_SERVER = $00000016; { Storage Server Workgroup Edition } PRODUCT_UNDEFINED = $00000000; { An unknown product } PRODUCT_ULTIMATE = $00000001; { Ultimate Edition } PRODUCT_ULTIMATE_N = $0000001C; { Ultimate Edition } PRODUCT_WEB_SERVER = $00000011; { Web Server Edition } PRODUCT_UNLICENSED = $ABCDABCD; { Unlicensed product } function GetOSInfo: string; var {$EXTERNALSYM GetProductInfo} GetProductInfo: function(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion: DWORD; var pdwReturnedProductType: DWORD): BOOL stdcall = NIL; implementation function GetOSInfo: string; var NTBres, BRes: Boolean; OSVI: TOSVERSIONINFO; OSVI_NT: TOSVERSIONINFOEX; tmpStr: string; dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType: DWORD; begin Result := 'Error'; NTBres := FALSE; try OSVI_NT.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFOEX); NTBres := GetVersionExA(OSVI_NT); OSVI.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO); BRes := GetVersionEx(OSVI); except OSVI.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO); BRes := GetVersionEx(OSVI); end; if (not BRes) and (not NTBres) then Exit; Move(OSVI, OSVI_NT, SizeOf(TOSVERSIONINFO)); case OSVI_NT.dwPlatformId of VER_PLATFORM_WIN32_NT: begin if OSVI_NT.dwMajorVersion <= 4 then Result := 'Windows NT '; if (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 0) then Result := 'Windows 2000 '; if (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 1) then Result := 'Windows XP '; if (OSVI_NT.dwMajorVersion = 6) then begin if (OSVI_NT.dwMinorVersion = 0) then begin if OSVI_NT.wProductType = VER_NT_WORKSTATION then Result := 'Windows Vista' else Result := 'Windows Server 2008'; end else if OSVI_NT.dwMinorVersion = 1 then begin if OSVI_NT.wProductType = VER_NT_WORKSTATION then Result := 'Windows 7' else Result := 'Windows Server 2008 R2' end else Result := 'After Windows 7 Version. Not Supply this version'; if Assigned(GetProductInfo) then begin GetProductInfo(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType); case pdwReturnedProductType of PRODUCT_BUSINESS: tmpStr := 'Business Edition'; PRODUCT_BUSINESS_N: tmpStr := 'Business Edition'; PRODUCT_CLUSTER_SERVER: tmpStr := 'Cluster Server Edition'; PRODUCT_DATACENTER_SERVER: tmpStr := 'Server Datacenter Edition (full installation)'; PRODUCT_DATACENTER_SERVER_CORE: tmpStr := 'Server Datacenter Edition (core installation)'; PRODUCT_ENTERPRISE: tmpStr := 'Enterprise Edition'; PRODUCT_ENTERPRISE_N: tmpStr := 'Enterprise Edition'; PRODUCT_ENTERPRISE_SERVER: tmpStr := 'Server Enterprise Edition (full installation)'; PRODUCT_ENTERPRISE_SERVER_CORE: tmpStr := 'Server Enterprise Edition (core installation)'; PRODUCT_ENTERPRISE_SERVER_IA64: tmpStr := 'Server Enterprise Edition for Itanium-based Systems'; PRODUCT_HOME_BASIC: tmpStr := 'Home Basic Edition'; PRODUCT_HOME_BASIC_N: tmpStr := 'Home Basic Edition'; PRODUCT_HOME_PREMIUM: tmpStr := 'Home Premium Edition'; PRODUCT_HOME_PREMIUM_N: tmpStr := 'Home Premium Edition'; PRODUCT_HOME_SERVER: tmpStr := 'Home Server Edition'; PRODUCT_SERVER_FOR_SMALLBUSINESS: tmpStr := 'Server for Small Business Edition'; PRODUCT_SMALLBUSINESS_SERVER: tmpStr := 'Small Business Server'; PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: tmpStr := 'Small Business Server Premium Edition'; PRODUCT_STANDARD_SERVER: tmpStr := 'Server Standard Edition (full installation)'; PRODUCT_STANDARD_SERVER_CORE: tmpStr := 'Server Standard Edition (core installation)'; PRODUCT_STARTER: tmpStr := 'Starter Edition'; PRODUCT_STORAGE_ENTERPRISE_SERVER: tmpStr := 'Storage Server Enterprise Edition'; PRODUCT_STORAGE_EXPRESS_SERVER: tmpStr := 'Storage Server Express Edition'; PRODUCT_STORAGE_STANDARD_SERVER: tmpStr := 'Storage Server Standard Edition'; PRODUCT_STORAGE_WORKGROUP_SERVER: tmpStr := 'Storage Server Workgroup Edition'; PRODUCT_UNDEFINED: tmpStr := 'An unknown product'; PRODUCT_ULTIMATE: tmpStr := 'Ultimate Edition'; PRODUCT_ULTIMATE_N: tmpStr := 'Ultimate Edition'; PRODUCT_WEB_SERVER: tmpStr := 'Web Server Edition'; PRODUCT_UNLICENSED: tmpStr := 'Unlicensed product' else tmpStr := ''; end; { pdwReturnedProductType } Result := Result tmpStr; NTBres := FALSE; end; { GetProductInfo<>NIL } end; { Vista } if NTBres then begin if OSVI_NT.wProductType = VER_NT_WORKSTATION then begin if OSVI_NT.wProductType = VER_NT_WORKSTATION then begin case OSVI_NT.wSuiteMask of 512: Result := Result 'Personal'; 768: Result := Result 'Home Premium'; else Result := Result 'Professional'; end; end else if OSVI_NT.wProductType = VER_NT_SERVER then begin if OSVI_NT.wSuiteMask = VER_SUITE_DATACENTER then Result := Result 'DataCenter Server' else if OSVI_NT.wSuiteMask = VER_SUITE_ENTERPRISE then Result := Result 'Advanced Server' else Result := Result 'Server'; end; end { wProductType=VER_NT_WORKSTATION } else begin with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; if OpenKeyReadOnly( 'SYSTEM\CurrentControlSet\Control\ProductOptions') then try tmpStr := UpperCase(ReadString('ProductType')); if tmpStr = 'WINNT' then Result := Result 'Workstation'; if tmpStr = 'SERVERNT' then Result := Result 'Server'; finally CloseKey; end; finally Free; end; end; { wProductType<>VER_NT_WORKSTATION } end; { NTBRes } end; { VER_PLATFORM_WIN32_NT } VER_PLATFORM_WIN32_WINDOWS: begin if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 0) then begin Result := 'Windows 95 '; if OSVI.szCSDVersion[1] = 'C' then Result := Result 'OSR2'; end; if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 10) then begin Result := 'Windows 98 '; if OSVI.szCSDVersion[1] = 'A' then Result := Result 'SE'; end; if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 90) then Result := 'Windows Me'; end; { VER_PLATFORM_WIN32_WINDOWS } VER_PLATFORM_WIN32s: Result := 'Microsoft Win32s'; else Result := 'Unknown'; end; { OSVI_NT.dwPlatformId } end; { GetOSInfo } initialization @GetProductInfo := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'GetProductInfo'); end.[/code]
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」 程式寫的越久,卻發現自己越來越不會寫程式! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |