zoukankan      html  css  js  c++  java
  • delphi 判断WIN8 , WIN8.1 , WIN10 系统版本

    今天测试了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, 'rootCIMV2', 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.

  • 相关阅读:
    Java JDBC 连接ORACLE ORA-12505错误解决方法
    SqlServer 打开/关闭列自增
    【小程序】倒计时
    【MySQL 主从同步延迟的原因及解决办法】
    【Linux Mysql主从配置】整理主从配置遇到的坑!
    关于post和get传递参数的区别
    CSS基础属性介绍
    js-06-字符串
    js-07-事件
    js-08-数组学习
  • 原文地址:https://www.cnblogs.com/blogpro/p/11453907.html
Copyright © 2011-2022 走看看