線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2260
推到 Plurk!
推到 Facebook!

如何取得OS正確版本,包含Win7 X64

尚未結案
g9221712
高階會員


發表:144
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-02-14 00:24:09 IP:123.240.xxx.xxx 訂閱
各位前輩:
不知道有無寫到關於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]

------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
系統時間:2017-12-14 14:21:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!