【问题标题】:How does launching an app in Compatibility Mode in Windows affect the app and how can I detect it?在 Windows 中以兼容模式启动应用程序如何影响应用程序以及如何检测它?
【发布时间】:2012-01-11 15:46:12
【问题描述】:

当应用程序在兼容模式下运行时,Windows 会对应用程序做什么?

有没有办法检测 .NET 中的兼容模式设置?

【问题讨论】:

    标签: c# .net windows vb.net


    【解决方案1】:

    当应用程序在兼容模式下运行时,Windows 会对应用程序做什么?

    它插入了几个模仿旧行为或错误的兼容性垫片。有时这是必要的,某些程序的行为取决于已修复的旧错误;或者他们使用了未记录的功能。

    Joel 的博客文章 How Microsoft Lost the API War 给出了一个很好的例子:

    我是从热门游戏 SimCity 的一位开发人员那里第一次听说这件事的,他告诉我他的应用程序中存在一个严重错误:它在释放内存后立即使用了内存,这是一个重大的禁忌,碰巧可以正常工作在 DOS 上,但在 Windows 下无法工作,在 Windows 下,释放的内存可能会立即被另一个正在运行的应用程序抢走。 Windows 团队的测试人员正在检查各种流行的应用程序,测试它们以确保它们运行良好,但 SimCity 不断崩溃。他们向 Windows 开发人员报告了这一点,他们反汇编了 SimCity,在调试器中逐步检查,发现了错误,并添加了特殊代码来检查 SimCity 是否正在运行,如果是,则以特殊模式运行内存分配器释放后仍然可以使用内存。

    这就是兼容性垫片的作用。插入遗留行为。是否是报告不同版本的Windows;以不同的方式使某种 API 行为;或禁用可能导致 Aero 等问题的其他一些 Windows 功能。

    垫片的技术细节是here

    Shim 基础架构实现了一种应用程序编程接口 (API) 挂钩形式。具体来说,它利用链接的性质将 API 调用从 Windows 本身重定向到替代代码 - 垫片本身。 Windows 可移植可执行文件 (PE) 和通用对象文件格式 (COFF) 规范包括多个标头,并且此标头中的数据目录提供了应用程序和链接文件之间的间接层。通过导入地址表 (IAT) 调用外部二进制文件。

    有没有办法检测 .NET 中的兼容模式设置?

    问题Is a Program Running in Compatibility Mode似乎给出了相关答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-16
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多