易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录

根据内核准确判断操作系统版本   [复制链接]

    2023-02-08 08:40:05
    模块控件源码
    易语言资源网
    2307 次浏览
    来源链接

本贴简介

为了让易语言程序准确获取操作系统类别版本,我使用了可靠的获取Windows内核版本和build号的未文档化的api(适用于Windows 2000及以上),编写了几道可靠的命令,可准确判断Windows系统类别版本,获取主、次版本号和build号,判断是服务器或客户Duan系统。命令截图和下载链接见末尾

概述

大家在使用易语言的时候,或多或少都碰到过获取操作系统类别版本(比如XP、7、8之类的)的问题吧!易语言系统提供的 获取操作系统类别2 命令十分的不可靠,尤其是Win10及以上系统直接失效 。分析了一下,发现Windows系统的api中常用用于获取系统版本的函数已经被弃用。包括GetVersion和GetVersionEX在Win8.1以上版本不可用(并且存在一些问题,返回值并不十分准确,会受到程序兼容性设置的影响),将始终返回对应Windows8.1的值。而在Win10中,VerifyVersionInfo也被弃用,在Windows系统提供的已文档化的api中,常用的已经没有可用来准确获取系统版本的了。

(如文末图,来自Microsoft Docs,已声明弃用。而版本帮助程序函数是适用于C++的类库,而非易语言直接可用的Windows api)

因此,我在网上查阅了大量的资料,发现了几个可行的方法

本模块提供的4道命令使用了系统ntdll.dll提供的命令RtlGetNtVersionNumbers 和shlwapi.dll的命令IsOS(简单明了,但由于是未文档化的命令,显得有些不为人知)

本模块提供的命令在Windows 2000及以上的客户Duan系统以及Windows Server 2003及以上的服务器系统可用,除了那些古老版本,几乎均可使用。

dll命令如文末图

运行原理

在dll获取了详细版本后,根据 Microsoft Docs中各版本系统的主版本和次版本参考 和 百du百科中一些较高版本系统的build号 来逐一判断并返回系统版本,绝对可靠。客户Duan版本系统中从Windows10开始,主版本号和次版本号不再改变,因此得根据build号范围判断Win10和Win11。服务器版本从Windows Server 2016开始,主版本号和次版本号不再改变,也得根据build号范围判断系统版本。

RtlGetNtVersionNumbers命令由于未文档化,Microsoft官网尚不能找到,网上信息也较少。这里是Wine API中对RtlGetNtVersionNumbers命令的声明和参数信息https://source.winehq.org/WineAPI/RtlGetNtVersionNumbers.html

具体判断过程见源码内

Microsoft Docs中声明已弃用几个函数

Windows api命令的调用





点我下载 (已有 153 次下载)

引用模块





引用支持库


源码文件名 支持库文件名 支持库标识
准确获取系统类别版本.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325


[错误报告]   上一篇:GdiplusNew v5.9 模块...     下一篇:【扩展界面支持库一Ex】 导出数据 10...