如何在Windows中的兼容模式下启动应用程序会影响应用程序,如何检测它?

时间:2012-01-11 15:46:13

标签: c# .net windows vb.net

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

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

1 个答案:

答案 0 :(得分:5)

  

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

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

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

  

我第一次从热门游戏SimCity的开发者那里听说过这个,他告诉我他的应用程序中存在一个严重的错误:它在释放后立即使用了内存,这是一个重要的禁忌,它恰好工作正常在DOS上但不能在Windows下运行,其中释放的内存很可能会被另一个正在运行的应用程序抢夺。 Windows团队的测试人员正在浏览各种流行的应用程序,测试它们以确保它们正常工作,但是SimCity一直在崩溃。他们向Windows开发人员报告了这一点,他们拆解了SimCity,在调试器中找到了它,发现了bug,并添加了检查SimCity是否正在运行的特殊代码,如果是,则以特殊模式运行内存分配器释放后仍然可以使用内存。

那是什么兼容垫片的意思。插入旧行为。是否报告不同版本的Windows;以不同的方式制作某种API行为;或者禁用可能导致Aero等问题的Windows的其他一些功能。

垫片的技术细节是here

  

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

  

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

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