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.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值