c - 从 C 程序发现和报告 Windows 版本信息

标签 c windows winapi

<分区>

我们有一个为 Win2K 构建的项目,然后是 WinXP,然后是 Win7,现在已经从使用 VS2010 的 32 位 Win7 程序转换为使用 VS2017 的 64 位 Win10 程序。 VS2017 项目是从头开始创建的,然后根据需要导入和更新旧源。

当我创建新项目时,我将目标平台(在项目的配置的常规部分)设置为 Windows 10,并且由于我没有特殊需要,我将项目设置为自动构建 list 。

今天我注意到我们在程序中显示当前 Windows 版本信息的对话框表明我们在 Windows 8.1 下运行,内部版本号为 6.2。当我查找 GetVersionInfo 函数时,我发现它“谎言”了那些没有声明其目标是 Windows 10 的 list 的程序。

我的问题分为两部分:

  1. 由于我使用 VS2017 以 Windows 10 为目标并自动构建 list ,为什么只对以 Windows 10 为目标的程序的功能对我的程序有影响?如果它要这样做,它不应该正确地构建 list 吗?
  2. 如果 VS2017 不能或不会正确定位我的 Windows 10 程序,谁能帮我找到一个示例,说明如何使用普通 C 项目手动执行此操作? (Microsoft 对诸如“只需将必要的 SXS 符号添加到您的 .rc 文件”之类的注释没有帮助——我不会手动将代码随机粘贴到 .rc 文件中,希望我不小心将它粘贴在正确的位置! )

我承认我对明显的东西一无所知。迄今为止,我还没有有意遇到任何我需要知道的情况。

[编辑] 只是对“这是重复的”人群的一个小评论。我的程序不关心它找到的 Windows 版本,但它需要报告尽可能多的有关该版本的详细信息。我们在支持客户时使用的一个对话框中显示信息(并将其写入文件)。这使我们能够确保我们使用与客户完全相同的 Windows 构建测试系统。 “重复”的主要重点是确保程序在正确版本的 Windows 上运行,而我的报告是我能找到的所有 Windows 版本信息,所以对我来说,这实际上不是其他人的副本,尽管 RtlGetVersion() 函数(感谢@RemyLebeau)似乎可以解决这两种类型的问题。

最佳答案

像这样进行:

首先在您的项目文件夹中创建一个 list 文件并调用它,例如 manifest.xml,然后将其添加到解决方案资源管理器中的项目:

enter image description here

它应该有这样的内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"></supportedOS>
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"></supportedOS>
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"></supportedOS>
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS>
    </application>
  </compatibility>
</assembly>

然后在解决方案资源管理器中右键单击您的项目。并修改如下图:

enter image description here

关于c - 从 C 程序发现和报告 Windows 版本信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53067716/

相关文章:

c++ - 如何检测终止进程事​​件、计算机关闭和计算机崩溃

c# - RichTextBox 中的摄氏度符号

c++ - 如何在类中使用 WINAPI 函数(不是回调函数)?

c++ - 如何等待进程完成 C++

c++ - 当嵌入式 ActiveX 控件接收和失去键盘焦点时如何得到通知?

c - 谁能向我解释一下为什么这个 atoi 命令起作用以及如何起作用

python - 在 python 中使用 map.pool 有什么问题?

将 String 转换为 Int 并再次返回字符串 C

c - 调试 C 运行时

c - 使用 fread() 填充数组