Windows 8.1的兼容模式可以保證應用程序功能完全么?

問題背景(舉例):

1. 之前聯想Thinkpad上使用的電源管理軟體廣受Think粉的好評,所以系統更新至Win 8.1之後很多人都在尋找可用於Win8.1的TP電源管理軟體,而聯想遲遲不發布而只更新驅動,所以很多Think粉都選擇兼容模式運行現有支持Win7的PowerManager。本人就是這種方法解決的,但是使用過程中出現了一些問題,比如某些選項在重新打開管理界面之後會恢復默認等。

2. 部分軟體(比如部分遊戲)即使以兼容模式運行也不能正常工作。

問題描述:

兼容模式由來已久,其工作原理是什麼?能保證那一類軟體兼容?Win8.1可以用兼容模式運行的軟體(個功能均能保證不崩潰)可以全功能運行么?


不能保證所有程序都能正常運行。

在 兼容模式 出現之前,Windows 對於兼容性的保證是通過:

  1. hack,修改軟體提供商的軟體代碼;
  2. hack,修改 Windows 代碼來特別實現某個東西。

第一個比較困難,因為要獲得修改的權利,需要經過複雜的法律程序,並且修改本身也是麻煩的;第二個的一個例子是:有一個程序通過偷看調用棧的上層來實現某個功能,在某次 Windows 更新編譯器之後,因為優化這個方法失敗了,解決方法是通過仿造一個類似以前的結構來讓這個程序繼續運行。(When programs grovel into undocumented structures...)

兼容模式出現後,Windows 使用 compatibility layer 來實現不同的效果。具體來說,設置了兼容模式,API 的行為會變化,比如為一個程序設置為 Windows 95 兼容模式,那麼 GetVersion 會返回 Windows 95 的版本號。如果設置為 Windows XP 兼容模式,應該可以訪問 Documents and Settings 文件夾(沒嘗試過,更新 1: @沈萬馬:在兼容模式下可以枚舉,否則不可以枚舉文件和子文件夾)。

在 Windows 8.1 with Update 中,C:WindowsAppCompat 和 C:Windowsapppatch 都和兼容模式有關係,apppatch 裡面有一個 shim(KeyboardFilterShim.dll),還有 AcLayers.dll,是 Application Compatibility Layer DLL。

另外,在 Windows Vista 開始出現的 UAC 的問題,解決它是通過把對一些特定地區的讀寫操作映射到另一個地方(每個用戶自己的等效文件夾),當然對於對 Windows Vista 設計的程序就不會有這樣的映射,會失敗。

當然不可能所有的行為都復原,否則你安裝 Windows 8.1 就順便安裝了 Windows 95/98, ME/XP SP2/XP SP3/Vista/Vista SP1/Vista SP2/7/8。

除了這些,保持兼容性的方法還有:

  • 在 64 位操作系統上運行 32 位程序時,程序不會發現這是一個 64 位操作系統。例如對 C:Windowssystem32 的操作會被重定向到 C:WindowsSysWow64,也不可能知道 64 位 Program Files 文件夾的位置。(On 64-bit Windows, 32-bit programs run in an emulation layer, and if you don"t like that, then don"t use the emulator)
  • 在 64 位操作系統上運行 16 位程序時,如果程序是預先被 Windows 團隊設計可識別的 InstallShield、Acme 安裝器,那麼 Compatibility Layer 將會使用內置的解析器和安裝器進行安裝,否則運行失敗。(If there is no 16-bit emulation layer in 64-bit Windows, how come certain 16-bit installers are allowed to run?)
  • 當程序有 manifest 並進行了特別的聲明之後,某些 API 的行為發生變化。即使之前錯誤的行為也可能得到保留(參考後面第二個鏈接裡面的 GetOverlappedResult API,它將保留帶有竟態條件的行為)。(Why not just require each application to declare what version of Windows it is compatible with? 和 Application Manifest (Windows))
  • 更新 1:有些程序的兼容性模式的最低版本並不是 Windows 95,這個似乎和每個模塊 header 上寫的子系統的最低版本有關係,也有可能和 manifest 有關係。


推薦閱讀:

thinkpad x1 carbon低配版的值得買嗎?
如何評價 ThinkPad 的移動工作站 P51/P71 系列?
ThinkPad T450s 實際使用體驗怎麼樣?
筆記本電腦有時突然就很卡,等關機過一段時間就好了,求解疑難雜症?
ThinkPad是品控,做工最好的Windows筆記本嗎, 有哪些值得購買的高端Windows筆記本?

TAG:軟體測試 | ThinkPad | 軟體兼容 | Windows81 | 電源管理系統PMS |