您的位置:首页 > 编程语言 > Delphi

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

2016-06-20 15:58 441 查看
今天测试了WIN8, WIN8.1, WIN10 系统下GetVersionEx 函数,居然取出来的版本都是6.2 。 于是网上查找各种获取内核版本号的方法, 终于找到几种有用的方法, 记录下来以作备忘。

方法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.

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息