我们有一个项目最初是为Win2K,然后是WinXP和Win7构建的,现在该项目已从使用VS2010的32位Win7程序转换为使用VS2017的64位Win10程序。 VS2017项目是从头开始创建的,然后导入和更新了旧源代码。
在创建新项目时,我将目标平台(在项目配置中的常规部分)设置为Windows 10,并且由于我没有特殊需求,所以设置了自动构建清单。
今天我注意到我们的对话框在程序中显示当前运行的Windows版本信息,指出我们正在运行Windows 8.1,内部版本号6.2。当我查找GetVersionInfo函数时,发现它会“欺骗”那些没有声明目标为Windows 10的程序。
我的问题分为两部分:
1. 因为我使用VS2017定位Windows 10并自动构建清单,为什么只对不针对Windows 10的程序撒谎的函数对我的程序说谎呢?如果要构建清单,它应该正确地构建清单,而不是误导信息吧?
2. 如果VS2017无法或不会正确地将我的程序定位为Windows 10,可以帮助我找到如何使用普通C项目手动执行此操作的示例吗? (Microsoft不会通过“只需向.rc文件添加必要的SXS符号”这样的评论提供帮助-我不会随机手动在.rc文件中添加代码,希望我无意中将其放在正确的位置!)
我坦承自己对清单的了解不足。到目前为止,我没有有意识地遇到过需要知道它的情况。
[编辑]对于“这是重复”的人只有一个微小的评论。我的程序不关心找到的Windows版本,但是需要尽可能详细地报告该版本的信息。我们在其中一个对话框中显示信息(并将其写入文件),我们在支持客户时使用该信息。这使我们能够确保我们使用与客户完全相同的Windows构建测试系统。 “重复”的主要焦点是确保程序在正确的Windows版本上运行,而我的程序正在报告我可以找到的所有Windows版本信息,所以对我来说,这实际上并不重复,尽管RtlGetVersion()函数(感谢@RemyLebeau)似乎解决了两种类型的问题。
在创建新项目时,我将目标平台(在项目配置中的常规部分)设置为Windows 10,并且由于我没有特殊需求,所以设置了自动构建清单。
今天我注意到我们的对话框在程序中显示当前运行的Windows版本信息,指出我们正在运行Windows 8.1,内部版本号6.2。当我查找GetVersionInfo函数时,发现它会“欺骗”那些没有声明目标为Windows 10的程序。
我的问题分为两部分:
1. 因为我使用VS2017定位Windows 10并自动构建清单,为什么只对不针对Windows 10的程序撒谎的函数对我的程序说谎呢?如果要构建清单,它应该正确地构建清单,而不是误导信息吧?
2. 如果VS2017无法或不会正确地将我的程序定位为Windows 10,可以帮助我找到如何使用普通C项目手动执行此操作的示例吗? (Microsoft不会通过“只需向.rc文件添加必要的SXS符号”这样的评论提供帮助-我不会随机手动在.rc文件中添加代码,希望我无意中将其放在正确的位置!)
我坦承自己对清单的了解不足。到目前为止,我没有有意识地遇到过需要知道它的情况。
[编辑]对于“这是重复”的人只有一个微小的评论。我的程序不关心找到的Windows版本,但是需要尽可能详细地报告该版本的信息。我们在其中一个对话框中显示信息(并将其写入文件),我们在支持客户时使用该信息。这使我们能够确保我们使用与客户完全相同的Windows构建测试系统。 “重复”的主要焦点是确保程序在正确的Windows版本上运行,而我的程序正在报告我可以找到的所有Windows版本信息,所以对我来说,这实际上并不重复,尽管RtlGetVersion()函数(感谢@RemyLebeau)似乎解决了两种类型的问题。
<compatibility>
元素,因此您必须手动添加一个包含<compatibility>
元素的清单片段,如@Jabberwocky发布的链接所述。 - zett42GetVersionEx()
并改用不会对未启动的应用程序提供错误信息的其他API,例如RtlGetVersion()
,或者像MSDN建议的系统DLL的GetFileVersionInfo()
,则所有这些都无关紧要了。 - Remy LebeauRtlGetVersion()
。你可以从MSDN中复制声明并将其粘贴到自己的代码中,然后使用GetProcAddress()
在运行时访问该函数。链接的重复内容中有一个示例。 - Remy Lebeau