清单支持的OS设置在幕后实际上做了什么?

时间:2014-04-10 19:50:39

标签: c# .net windows visual-c++ manifest

我找不到很多文档,但最近我不得不运行Windows Server 2012 R2平台就绪测试工具来验证一些MSVC ++和C#产品(.exe' s,services,libraries,dll' s等,我发现了一些错误消息,说某些项目清单中没有支持的支持的设置。

我修复了错误,但我无法理解支持的OS设置实际上在幕后做了什么。例如,假设我为所有项目设置了支持的OS设置为Windows 8.1,如果在Windows 8或Windows 7上运行这些产品,即使已知这些产品在这些操作系统上运行,也会开始出错吗? / p>

我在supportedOS上找到的最多的东西是这样的:http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074(v=vs.85).aspx

1 个答案:

答案 0 :(得分:3)

Windows如何读取受支持的OS值的伪代码可能如下所示:

double compatVer = 4.0; // Win95
if (hasW10guid && _WIN_VER >= 0xa00)
  compatVer = 10.0;
else if (hasW81guid && _WIN_VER >= 0x603)
  compatVer = 6.3;
else if (hasW8guid && _WIN_VER >= 0x602)
  compatVer = 6.2;
else if (hasW7guid && _WIN_VER >= 0x601)
  compatVer = 6.1;
else if (hasWVistaguid && _WIN_VER >= 0x601)
  compatVer = 6.0; // Application wants Vista compatibility on Win7+
else if (hasRequestedExecutionLevel)
  compatVer = 6.0; // UAC compatible

compatVer存储在流程内部的某个地方,可能在PEB中。

将compatVer与某些功能中的真实Windows版本进行比较,以启用新功能或更改其行为,使其与应用程序所针对的Windows版本兼容。某些行为更改记录在MSDN上的compatibility cookbook

由于supportedOS值是GUID,因此无法猜测,因此开发人员无法声明对尚未发布的Windows版本的支持。因此,当应用程序在Windows 7上运行时,Windows 8 GUID将不起作用。

您的应用程序存在一个由兼容性行为隐藏的错误,并且可能通过添加supportedOS值来公开它...