受影响的平台
客户端 - Windows 7
服务器 - Windows Server 2008 R2
功能影响
严重性 - 低
频率 - 低
描述
Windows 7 在应用程序清单中引入了一个名为“兼容性”的新部分。本部分可帮助 Windows 确定应用程序所针对的 Windows 版本,并使 Windows 能够根据应用程序所面向的 Windows 版本提供应用程序所需的行为。
“兼容性”部分允许 Windows 为新的开发人员创建的软件提供新行为,同时保持现有软件的兼容性。 本部分还有助于 Windows 在将来的 Windows 版本中提供更高的兼容性。 例如,仅在“兼容性”部分中声明对 Windows 7 的支持的应用程序将继续在 Windows 的未来版本中接收 Windows 7 行为。
更改的表现
在 Windows 7 和将来的 Windows 版本上,清单中没有兼容性部分的应用程序将默认收到 Windows Vista 行为。 请注意,Windows XP 和 Windows Vista 忽略此清单部分,并且不会影响它们。
以下 Windows 组件基于 Windows 7 中的兼容性部分提供不同行为:
RPC 默认线程池
-
Windows 7: 为了提高可伸缩性并减少线程计数,RPC 切换到 NT 线程池(默认池)。 对于 Windows Vista,RPC 使用了专用线程池。
- 对于为 Win7 编译的二进制文件,将使用默认池
- 如果在调用任何 RPC API 之前调用I_RpcMgmtEnableDedicatedThreadPool,则使用专用线程池(Vista 行为)
- 如果在 RPC 调用后调用I_RpcMgmtEnableDedicatedThreadPool,则使用默认池,I_RpcMgmtEnableDedicatedThreadPool返回错误 1764,并且不支持请求的作
- Windows Vista(默认值): 对于为 Windows Vista 和更低版本编译的二进制文件,将使用专用池。
DirectDraw Lock
- Windows 7: 为 Windows 7 显示的应用程序无法调用 DDRAW 中的锁定 API 来锁定主桌面视频缓冲区。 这样做将导致错误,将返回主节点的 null 指针。 即使未打开桌面窗口管理器组合,也强制实施此行为。 Windows 7 兼容应用程序不得锁定主视频缓冲区才能呈现。
- Windows Vista(默认值): 应用程序将能够获取主视频缓冲区上的锁,因为旧版应用程序依赖于此行为。 运行应用程序会关闭桌面窗口管理器。
DirectDraw 位块传输(Blt)到主节点,而无需剪辑窗口
- Windows 7: Windows 7 所显示的应用程序无法执行 Blt 到主桌面视频缓冲区,而无需剪辑窗口。 这样做将导致错误,并且不会呈现 Blt 区域。 即使未打开桌面窗口管理器组合,Windows 也会强制实施此行为。 Windows 7 兼容应用程序必须 Blt 到剪辑窗口。
- Windows Vista(默认值): 应用程序必须能够在没有剪辑窗口的情况下将应用程序 Blt 到主数据库,因为旧版应用程序依赖于此行为。 运行此应用程序会关闭桌面窗口管理器。
GetOverlappedResult API
- Windows 7: 解决使用 GetOverlappedResult 的多线程应用可以在不重置重叠结构中的事件的情况下返回的争用条件,导致对此函数的下一次调用过早返回。
- Windows Vista(默认值): 提供应用程序可能依赖的争用条件的行为。 希望在 Windows 7 行为之前避免此争用的应用程序应等待重叠事件以及发出信号时,使用 bWait == FALSE调用 GetOverlappedResult。
程序兼容性助手(PCA)
- Windows 7: 兼容性部分的应用程序不会获得 PCA 缓解措施。
- Windows Vista(默认值): 在某些情况下在运行时无法正确安装或崩溃的应用程序将得到 PCA 缓解。 有关详细信息,请参阅参考部分。
利用功能功能
使用作系统支持的最新兼容性信息更新应用程序清单。 本部分介绍清单的新增内容:
命名空间: Compatibility.v1 (xmlns=“urn:schemas-microsoft-com:compatibility.v1”>)
节名称: 兼容性(新部分)
支持的OS: 受支持作系统的 GUID - 映射到支持的作系统的 GUID 为:
- {e2011457-1546-43c5-a5fe-008deee3d3f0} for Windows Vista:这是切换上下文的默认值。
- {35138b9a-5d96-4fbd-8e2d-a2440225f93a} for Windows 7:在应用程序清单中设置此值的应用程序获取 Windows 7 行为。
注意
Microsoft会根据需要为将来的 Windows 版本生成和发布 GUID。
下面是更新的清单的示例。
注意
应用程序清单中的属性和标记名称区分大小写。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>
</assembly>
在上述示例中为这两个作系统添加 GUID 的值是提供下层支持。 支持这两个平台的应用程序不需要每个平台的单独清单。
兼容性、性能、可靠性和可用性测试
- 使用新的兼容性部分和
SupportedOS ID ={35138b9a-5d96-4fbd-8e2d-a2440225f93a}
测试应用程序,以确保应用程序使用最新的 Windows 7 行为正常工作 - 使用新的兼容性部分和
SupportedOS ID ={e2011457-1546-43c5-a5fe-008deee3d3f0}
(或完全不带此部分)测试应用程序,以确保应用程序使用 Windows 7 上的 Windows Vista 行为正常工作
已知问题
上下文不匹配 应用程序在 Windows Vista 上下文中运行,而不是在运行 Windows 7 或 Windows Server 2008 R2 x64 版本的计算机上的 Windows 7 上下文中运行。
解决方案 更新可用于更正所有受支持的基于 x64 的 Windows 7 和 Windows Server 2008 R2 版本,以及所有受支持的基于 Itanium 的 Windows Server 2008 R2 版本。 转到 KB 978637的“Microsoft支持”页:应用程序在 Windows Vista 上下文中运行,而不是在运行 x64 版本的 Windows 7 或 Windows Server 2008 R2 的计算机上的 Windows 7 上下文中运行, 以获取更多详细信息并下载系统的正确版本。
故障转储诊断已阻止
解决方案 转到 KB 976038 的“Microsoft支持”页:对于其他详细信息,将忽略从在 64 位版本的 Windows 中运行的应用程序引发的异常。
指向其他资源的链接
- QueryActCtxW 函数
- UAC 清单
- 适用于 Windows 应用程序 的 应用程序清单
- 桌面窗口管理器(DWM)
- 上下文不匹配更新