delphi 判断WIN8 , WIN8.1 , WIN10 系统版本

来源:http://blog.csdn.net/loverceo/article/details/20855413

似乎第三种方法好用

方法1:   GetVersionEx, 该方法在WIN8.1以后无效  

参看: https://msdn.microsoft.com/en-us/library/ms724451.aspx

procedure TForm1.Button1Click(Sender: TObject);
var
  str : string;
  ss : TStringStream;
  buf: array[0..6] of byte;
  OSVI : OSVERSIONINFO;
  version : string;
begin
  OSVI.dwOSversioninfoSize:=Sizeof(OSVERSIONINFO);
  GetVersionEx(OSVI);
  Edit4.Text := IntToStr(OSVI.dwMajorVersion) + ','
  +IntToStr(OSVI.dwMinorVersion)+ ','
  +IntToStr(OSVI.dwBuildNumber)+ ','
  +IntToStr(OSVI.dwPlatformId)+ ','  +OSVI.szCSDVersion;
end;


方法2: 通过FWMIService查询系统表Win32_OperatingSystem, 该方法可以正常读取系统版本WIN8(6.2), WIN81(6.3), WIN10(10)


function GetWMIProperty(WMIType, WMIProperty: string): string;
const
  WbemUser ='';
  WbemPassword ='';
  WbemComputer ='localhost';
var
  FSWbemLocator, FWMIService, FWbemObjectSet, Obj: OleVariant;
  C: Cardinal;
  i,Len:integer;
  tempItem:IEnumVariant;
  count : integer;
  msg : string;
begin
  try
  result := '';
  FSWbemLocator:= CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet := FWMIService.ExecQuery('Select * from Win32_' + WMIType);
  tempItem := IEnumVariant(IUnknown(FWbemObjectSet._NewEnum));
  Result:='';
  count := 0;
  while (tempItem.Next(1, obj, c) = S_OK) do
  begin
    Obj := Obj.Properties_.Item(WMIProperty, 0).Value;
    if not VarIsNull(obj) then
    begin
      if(count > 0) then
        result := result + ',';
      Result := Result + trim(Obj);
      Inc(count);
    end;
  end;
  except
    On E : Exception do
    begin
       msg := Format('GetWMIProperty Error,WMIType:%s, WMIProperty:%s, Msg:%s',
             [WMIType, WMIProperty, E.ToString]);
       ShowMessage(msg);
    end;
  end;
  if(lowercase(result) = 'none') then
    result := '';
end;

调用 :   GetWMIProperty('OperatingSystem', 'Version');


方法3:通过ntdll.dll , NetServerGetInfo函数获取内核版本 


program Project5;

{$APPTYPE CONSOLE}


uses
  SysUtils, Windows;


type
  NET_API_STATUS = DWORD;


  _SERVER_INFO_101 = record
    sv101_platform_id: DWORD;
    sv101_name: LPWSTR;
    sv101_version_major: DWORD;
    sv101_version_minor: DWORD;
    sv101_type: DWORD;
    sv101_comment: LPWSTR;
  end;
  SERVER_INFO_101 = _SERVER_INFO_101;
  PSERVER_INFO_101 = ^SERVER_INFO_101;
  LPSERVER_INFO_101 = PSERVER_INFO_101;


const
  MAJOR_VERSION_MASK = $0F;


function NetServerGetInfo(servername: LPWSTR; level: DWORD; var bufptr): NET_API_STATUS; stdcall; external 'Netapi32.dll';
function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall; external 'Netapi32.dll';

type
  pfnRtlGetVersion = function(var RTL_OSVERSIONINFOEXW): LongInt; stdcall;
var
  Buffer: PSERVER_INFO_101;
  ver: RTL_OSVERSIONINFOEXW;
  RtlGetVersion: pfnRtlGetVersion;
begin
  Buffer := nil;
  // Win32MajorVersion and Win32MinorVersion are populated from GetVersionEx()...
  WriteLn(Format('GetVersionEx: %d.%d', [Win32MajorVersion, Win32MinorVersion])); // shows 6.2, as expected per GetVersionEx() documentation


  @RtlGetVersion := GetProcAddress(GetModuleHandle('ntdll.dll'), 'RtlGetVersion');
  if Assigned(RtlGetVersion) then
  begin
    ZeroMemory(@ver, SizeOf(ver));
    ver.dwOSVersionInfoSize := SizeOf(ver);


    if RtlGetVersion(ver) = 0 then
      WriteLn(Format('RtlGetVersion: %d.%d', [ver.dwMajorVersion, ver.dwMinorVersion])); // shows 10.0
  end;


  if NetServerGetInfo(nil, 101, Buffer) = NO_ERROR then
  try
    WriteLn(Format('NetServerGetInfo: %d.%d', [Buffer.sv101_version_major and MAJOR_VERSION_MASK, Buffer.sv101_version_minor])); // shows 10.0
  finally
    NetApiBufferFree(Buffer);
  end;
  ReadLn;
end.


Delphi获取Windows版本号、描述等信息,可获取到主版本号、次版本号、系统描述、系统平台、构建号等,相关代码如下:   //设置版本信息结构的大小    GetVersionEx(OSVI);    //获取版本信息    is98orlater:=    //判断是否98或以后版本    (osvi.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS) and    ((osvi.dwMajorVersion>4) or    ((osvi.dwMajorVersion=4) and (osvi.dwMinorVersion>0)));   //DOWNLOAD BY HTTP://WWW.CODEFANS.NET    //下面开始显示信息    case OSVI.dwPlatformId of    //根据OSVI.dwPlatformId的数值的不同显示具体的平台描述    VER_PLATFORM_WIN32s:    // Windows 3.1平台    s:='Windows 3.1';    VER_PLATFORM_WIN32_WINDOWS:    // Windows 95/98平台    if(is98orlater) then    //98    s:='Windows 98'    else    //95    s:='Windows 95';    VER_PLATFORM_WIN32_NT:    // Windows NT平台    s:='Windows NT/XP';    end;    Edit1.Text:=s;    Edit2.Text:=IntToStr(OSVI.dwMajorVersion);    Edit3.Text:=IntToStr(OSVI.dwMinorVersion);    case OSVI.dwPlatformId of    //根据平台的不同具体处理OSVI.dwBuildNumber信息    VER_PLATFORM_WIN32_WINDOWS:    // Windows 95/98平台则取OSVI.dwBuildNumber的低位字    Edit4.Text:=IntToStr(LOWORD(OSVI.dwBuildNumber));    VER_PLATFORM_WIN32_NT:    // Windows NT平台则取所有位的值    Edit4.Text:=IntToStr(OSVI.dwBuildNumber);    else    Edit4.Text:='';   // Windows 3.1平台此值位空    end;    Edit5.Text:=OSVI.szCSDVersion;   end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值