检查 W10 上的 Windows 版本

2023-11-23

有谁知道 TOSVersion.Name 是否仍然适用于 Windows 10?

我有一个 vcl 应用程序,它有一个表单显示事件,该事件获取操作系统详细信息并使用 SysUtils 中的 TOSVersion 记录将它们显示在 TMemo 框中。

with mmoOSInfo.Lines do 
 begin
    Clear;
    Add(TOSVersion.ToString);
    Add('');
    Add('Architecture: ' + OSArchitectureToStr(TOSVersion.Architecture));
    Add('Platform: ' + OSPlatformToStr(TOSVersion.Platform) +
     IntToStr(PlatformFromPointer));
    Add('Build: ' + IntToStr(TOSVersion.Build));
    Add('Major: ' + IntToStr(TOSVersion.Major));
    Add('Minor: ' + IntToStr(TOSVersion.Minor));
    Add('Name: ' + TOSVersion.Name);
    Add('Service Pack - Major: ' + IntToStr(TOSVersion.ServicePackMajor));
    Add('Service Pack - Minor: ' + IntToStr(TOSVersion.ServicePackMinor));
 end;

该代码在 XP(是的,我们仍在使用它(羞愧地垂下头))、Vista、Windows 7、Windows 8.1、台式电脑、笔记本电脑和 Surface Pro 上执行没有任何问题,但安装在 Windows 10 上时则不然。

当我使用 paserver 进行调试时,TOSVersion.Name 返回为 := 'Windows 8'。 我是否做错了什么,或者我对 TOSVersion 检测 Windows 10 的期望过高?没有异常被触发。在我可以访问的 2 台 Windows 10 计算机中,一个迁移路径是从 Windows 8.1 迁移,另一迁移路径是从 Windows 7 迁移。

非常感谢


有两件事会阻止您的代码返回正确的版本:

  1. 您使用的 XE8 RTL 早于 Windows 10,因此不了解 Windows 10。
  2. 您的可执行文件本身并不支持 Windows 10,因此GetVersionEx, which TOSVersion依赖,会谎报版本。

碰巧的是,我相信 XE8 update 1 更改了版本检测以使用NetWkstaGetInfo这不受此版本谎言的约束。尽管致电NetWkstaGetInfo确实泄漏内存,但这可能并不重要,因为它只被调用一次。

与此主题相关的一些链接:

  • Windows 8.1 和 Windows Server 2012 R2 中的操作系统版本更改
  • 为什么 Windows 8.1 有时会告诉您它是 Windows 8.0
  • GetVersionEx
  • 将您的应用程序定位为 Windows
  • 还有很多很多......

如果您绝对必须向用户报告版本,那么您有多种选择:

  • Add the supportedOS选项到您的清单并包含 Windows 10 的 GUID。这将停止GetVersionEx来自说谎。然后使用修改后的版本TOSVersion或其他方式来获取版本。
  • 使用 WMI 查询。
  • Call NetServerGetInfo.
  • Call NetWkstaGetInfo.
  • Call RtlGetVersion.

这个问题的更多细节:如何检测真实的Windows版本?尽管请注意,接受的答案已经过时了。

作为 WMI 方法的示例,您可以使用以下代码:

function OperatingSystemDisplayName: string;

  function GetWMIObject(const objectName: string): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;
    Moniker: IMoniker;
  begin
    OleCheck(CreateBindCtx(0, bindCtx));
    OleCheck(MkParseDisplayName(BindCtx, PChar(objectName), chEaten, Moniker));
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
  end;

  function VarToString(const Value: OleVariant): string;
  begin
    if VarIsStr(Value) then begin
      Result := Trim(Value);
    end else begin
      Result := '';
    end;
  end;

  function FullVersionString(const Item: OleVariant): string;
  var
    Caption, ServicePack, Version, Architecture: string;
  begin
    Caption := VarToString(Item.Caption);
    ServicePack := VarToString(Item.CSDVersion);
    Version := VarToString(Item.Version);
    Architecture := ArchitectureDisplayName(SystemArchitecture);
    Result := Caption;
    if ServicePack <> '' then begin
      Result := Result + ' ' + ServicePack;
    end;
    Result := Result + ', version ' + Version + ', ' + Architecture;
  end;

var
  objWMIService: OleVariant;
  colItems: OleVariant;
  Item: OleVariant;
  oEnum: IEnumvariant;
  iValue: LongWord;

begin
  Try
    objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
    colItems := objWMIService.ExecQuery('SELECT Caption, CSDVersion, Version FROM Win32_OperatingSystem', 'WQL', 0);
    oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
    if oEnum.Next(1, Item, iValue)=0 then begin
      Result := FullVersionString(Item);
      exit;
    end;
  Except
    // yes, I know this is nasty, but come what may I want to use the fallback code below should the WMI code fail
  End;

  (* Fallback, relies on the deprecated function GetVersionEx, reports erroneous values
     when manifest does not contain supportedOS matching the executing system *)
  Result := TOSVersion.ToString;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查 W10 上的 Windows 版本 的相关文章

  • Delphi - 自XE8以来如何正确注册图形类?

    我正在编写一个 Delphi 包 它提供了一个新的自定义 TGraphic 对象 允许读取 VCL 组件 如 TImage 中的新图像格式 我最初使用 RAD Studio XE7 开发了这个包 并且运行良好 然而 我最近迁移到了较新的 R
  • 使用Delphi检查HTML代码中是否有对象属性值

    如何使用Delphi检查HTML代码中是否有输入对象属性值 there isn t value attribute
  • UWP 关闭信息亭模式

    我有一个发布到 Windows 应用商店的 UWP 应用程序 并且该应用程序可以启动进入信息亭模式 分配访问权限 它工作得很好 但我尝试在应用程序上创建一个按钮来关闭信息亭模式并返回到 Windows 登录屏幕 我尝试了文档中给出的代码 h
  • 为什么我们需要不同的指针数据类型?

    基本上指针是一个用于存储内存地址的变量 它总是十六进制 内存地址 那么为什么我们需要不同的数据类型来存储地址 例如 int a 我们可以用这个 a 来存储浮点地址吗 并非所有指针 必须具有 相同的大小 如果您有一个需要对齐到 10 MB 的
  • 如何在 Java 应用程序中使用系统的文件上下文菜单?

    我想显示文件搜索的结果 我想启用文件选择的上下文菜单 这将是系统的上下文菜单 例如 如果用户右键单击 Windows 中的文件 我想显示带有选项的弹出菜单 Open 打开用 Edit 发给 Copy Cut etc 并且 如果可能的话 该菜
  • Async InputQuery 不处理“取消”按钮

    我正在使用一个简单的调用TDialogServiceAsync InputQuery 使用单个输入 它只是忽略了Cancel按钮和窗口的X关闭按钮 But the Ok按钮工作正常 这是我的代码 uses FMX DialogService
  • (nasm x86实模式)如何在引导加载的扇区中写入/读取字符串?

    我正在使用 NASM 为 x86 实模式编写一个最小操作系统 用于教育目的 我想使用 512 字节引导扇区加载包含操作系统其余部分的更大扇区 我已经成功创建了一个加载另一个扇区的引导扇区 但我似乎无法在加载的扇区中写入 读取字符串 这是我的
  • 退出代码大于 255 — 可能吗?

    如果是 在哪个操作系统 shell 或其他操作系统上 考虑以下 Java 程序 我使用 Java 只是作为示例 任何语言都适合这个问题 这更多地与操作系统有关 public class ExitCode public static void
  • Windows 10 IoT Raspberry Pi 2:自动启动已发布的应用程序

    我开始体验在 Windows 10 上进行 Raspberry Pi 2 开发 我想知道如何配置 Raspberry Pi 2 以自动启动我在 Visual Studio 中开发的自己发布的应用程序 此外 如何在我的设备上设置时间和区域 非
  • Delphi 2009 IDE结构视图折叠功能

    现在有谁知道折叠 Delphi 2009 IDE 结构视图中的所有项目吗 我不知道折叠所有项目 这使我很难从视图中找到我的课程 Thanks 选择根节点 类 并按数字键盘上的 除号 那会让一切崩溃 然后按数字键盘上的 加号 键 第一级将展开
  • 石和磅的格式正确吗?

    我有一个图表 用于显示重量 以英石和磅 lbs 为单位 该图表由记录中的数据填充 对于权重 数据类型为 Double 记录数据是在运行时编辑的 我需要知道一种正确格式化输入数据的方法 为了更好地理解 首先看一下这些示例值 它们表示为石和磅
  • 如何更改 TPageControl 上标签的方向?

    我是 Delphi 的新手 再次强调 我在 1994 年就使用过 Delphi 我现在有 Delphi 2009 Pro 来自Java 我发现对象继承非常晦涩 我的用户想要选项卡位于左侧的选项卡式页面 但是 TPageControl 不允许
  • 如何调试仅在应用程序关闭时发生的崩溃? (德尔福)

    因此 经过最近的一些更改 我们发现我们最古老的应用程序之一有时会在关闭时崩溃 这会以 运行时错误 216 消息的形式或来自 Windows 错误报告的消息的形式表明应用程序已停止工作 该应用程序已经发出OutputDebugString 每
  • 如何检查注册表项是否存在

    我不知道我的错误在哪里 它总是跳到else分支 但是密钥存在 我检查了几次 var reg TRegistry begin with TRegistry Create do try RootKey HKEY CURRENT USER Ope
  • 如何将纹理传递给 DirectX 9 像素着色器?

    我有像素着色器 fxc exe tiles fs T ps 3 0 Fotiles fsc Fctiles fsl struct PSInput float4 Pos TEXCOORD0 float3 Normal TEXCOORD1 fl
  • EOutOfMemory 使用 Delphi 创建大型 XML

    我正在使用 Delphi 从关系数据库中的数据创建 XML 文档 它在小数据集上测试得很好 但是当我尝试将数据集的大小扩展到生产级别时 它最终在节点创建期间因 EOutOfMemory 异常而崩溃 我正在使用放在表单上的 TXMLDocum
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • Delphi - 获取和设置 ListView 的滚动条位置

    这似乎是一个愚蠢而简单的问题 然而 我一直无法找到令人满意的答案 基本上 我有一个列表视图 样式 vsReport 与数据 有时 我必须更新它 因此 我必须清除列表视图并用更新的数据再次填充它 但是 当我这样做时 滚动条位置将重置为 0 我
  • 为什么 Delphi 变体不能保存对象?

    为什么 Delphi 变体不能保存对象 更重要的是 这种限制背后的原因是什么 你绝对可以storeVariant 变量中的对象 只需将其转换为 NativeUInt 无论如何 对象只是一个指针 obj TObject Create v Na
  • TStream.Position 与 TStream.Seek 比较

    要移动 TStream 类中的 当前字节 指针 我们可以使用属性 Position 例如 MyStream Position 0 或使用 Seek 方法 例如 MyStream Seek 0 soFromBeginning 问题是 哪一个更

随机推荐

  • 创建多个轻量级 Google Cloud Functions 的最佳实践?

    Google Cloud Functions 的工作方式似乎是 你的模块进入一个functions目录 that functions目录然后包含一个package json文件包含所有模块之间的共享依赖项 每个模块可以包含许多导出函数 go
  • HTTP 错误 404.4 - 未找到您正在查找的资源没有与其关联的处理程序

    我在 IIS 中托管了一个网站 但每当我浏览该网站时 我都会收到 404 4 我该如何解决这个问题 我已经提到了几篇文章 他们都说问题与静态文件有关 但它已经被映射了 我还能做什么 这是我的 iis 7 0 中处理程序映射的附图 有任何想法
  • 使用 JFileChooser 将文件类型附加到 Java 中的文件

    我正在尝试使用 JFileChooser 保存图像 我只希望用户能够将图像保存为 jpg 格式 但是 如果他们不输入 jpg 则不会将其保存为图像 是否可以以某种方式将 jpg 附加到文件末尾 File file chooser getSe
  • 如何在 Bootstrap 中仅在特定屏幕尺寸上显示某些内容?

    我希望能够仅在 html 中显示图像md屏幕 我正在考虑隐藏图像sm向下 并躲避lg and up 我怎样才能做到这一点 在 Bootstrap v4 中 您可以使用这些类d none d md block d lg none使内容仅在媒体
  • UML泛化与实现

    我对 UML 还很陌生 所以我对泛化和实现有一些疑问 我正在对电子微控制器的行为进行建模 并且需要从 UML 描述生成 C 代码 据我所知 一个class realizes接口 这意味着它可以提供接口的实现 A概括两个类之间可能存在关系 在
  • Miller Rabin 素性测试准确性

    我知道米勒 拉宾素性检验是概率性的 不过我想用它来编程任务没有任何出错的余地 如果输入数字是 64 位整数 即 long long in C Miller Rabin is indeed probabilistic but you can
  • Java 中数组的排列(重复)

    网站上有一些类似的问题 这些问题对我有一些帮助 但我无法完全确定这个问题 所以我希望这不是重复的 这是一项家庭作业 其中您有一组字符 A B C 并且必须使用递归来获取所有排列 有重复 我的代码是这样做的 char c A B C publ
  • 使用 Karma (Jasmine) 测试 AngularJS 工厂

    我正在努力使用 Karma Jasmine 测试 AngularJS 工厂 我无法将我的工厂注入OfficerValidationService多变的 我究竟做错了什么 注意 文件已正确加载 Factory use strict angul
  • 如何在 Flutter 中监控剪贴板?

    我正在寻找一种在 Flutter 中监视剪贴板的方法 我能找到的与 Flutter 上的剪贴板交互相关的所有内容是 剪贴板类 有谁知道如何监控系统剪贴板中的新项目 最好使用插件 可能有点晚了 但仍然如此 不需要插件或库 解决方案可能非常简单
  • .Select、.Activesheet、.Activecell 等...

    对于这个问题 我参考下面的帖子来澄清一下 为什么我的条件格式在用VBA添加时会偏移 在我这些天看到的很多很多帖子中 OP 被默默地允许使用 Activate Select Offset 等 而它们却为潜在错误 通常是由最终用户引起的 敞开了
  • 计算平均置信区间而不存储所有数据点

    对于大型n 请参阅下文了解如何确定足够大的值 根据中心极限定理 可以安全地将样本均值的分布视为正态 高斯 但我想要一个程序 为任何给出一个置信区间n 实现这一点的方法是使用 Student T 分布n 1自由程度 所以问题是 给定您一次收集
  • Ebean多对多查询

    我有两个类 用户和汽车 两者都有 ManyToMany 相互映射 User Entity public class User extends Model private int year ManyToMany cascade Cascade
  • 方法中变量的最大数量

    我在这里闲着 所以我有这个好奇心 有人可以告诉我 C 中每个方法的最大变量数是多少 我只是尝试编译生成的程序源 其中包含 26 26 26 26 个局部变量 而不是方法参数 它们被称为 aaaa aaab aaac等等 我遇到了这个限制 错
  • Hibernate 搜索与 spring-data-solr 、 spring-data-elasticsearch

    我有一个 Spring Boot Spring Data JPA hibernate Web 应用程序 想要引入文本搜索功能 我了解以下内容 hibernate search 或 spring data 都可以集成到我的应用程序中 Hibe
  • 如何从嵌套类访问超类方法?

    我希望这段代码可以解释这个问题 class Foo void a stuff class Bar extends Foo void a throw new Exception This is not allowed for Bar clas
  • 如何使用 div 和 css 模拟表格?

    像这样的表 table tr td td td td td td tr tr td td td td td td tr table 如何使用 div 和 css display table 规则创建一个 尝试这个 CSS table dis
  • 具有多个值列的数据透视表/交叉表

    我有一个产生以下结果集的视图 CREATE TABLE foo AS SELECT client id asset type current value future value FROM VALUES 1 0 10 20 1 1 5 10
  • 如何在编写测试时检查实际的 Laravel 命令输出?

    我正在为 Laravel Artisan 控制台命令编写一个非常基本的测试 如下所示 this gt artisan my command some option gt some value gt expectsOutput the exp
  • 如何在 Airflow 中运行异步函数?

    我正在编写一个气流任务来读取大型 csv 并将其保存到 postgresql 数据库 我发现这个 asyncpg 包具有复制功能 其运行速度比任何其他包都要快得多 然而 它是异步的 我不知道如何将它合并到Airflow中 这是示例代码 fr
  • 检查 W10 上的 Windows 版本

    有谁知道 TOSVersion Name 是否仍然适用于 Windows 10 我有一个 vcl 应用程序 它有一个表单显示事件 该事件获取操作系统详细信息并使用 SysUtils 中的 TOSVersion 记录将它们显示在 TMemo