標籤:

Windows:當我選擇『兼容性模式』的時候,究竟發生了什麼?


謝 @余天升 君邀請。

其實他的回答已經把最重要的部分都列出來了。我就補充一點概念。

所謂兼容模式,就是Windows通過控制啟動時鏈接的動態庫給你的程序造成一個自己還運行在舊版Windows上的假象。這背後的技術就是WinSxS,全稱 Windows Side by Side(請不要叫成傻叉傻,嗯)。

正如@余天升 君的回答所說,WinSxS的目錄下有大量同名的DLL,但需要澄清的是,那裡沒有作為備份用途的副本。我們能在這個目錄下找到的所有DLL,版本號都是不同的。它們實際上是之前Windows或Visual Studio 使用的對應函數庫的DLL。比如Windows 7就包含了 Vista、XP甚至更古老的Windows的DLL。

WinSxS 主要為了解決兩個問題,一是當年臭名昭著的Windows DLL 版本不匹配導致的 DLL Hell 問題。第二就是兼容模式。它通過Windows 啟動器的控制來保證某個Windows程序啟動時獲得的內存布局和依賴的DLL都是指定的老版本Windows 的行為。

為什麼要搞這種技術?因為很多現在很成功的程序是依賴於Windows的一些特定版本的 bug 的。如果不能完整模仿舊版本Windows的行為,那麼這些程序在新版Windows上就會崩潰。正如我之前在很多回答里提到的,WIndows部門對兼容性的要求高得令人髮指,所以在這基礎上發展出這樣的技術也並不奇怪。

很難說這種哲學是好是壞。它的好處當然是維護了100%的向後兼容,這也是Windows成功的主要原因。當然這樣的技術也有代價,就是Windows越發地臃腫不堪,而且老程序的一些 bug 實際上等於得不到修復,加大了Windows 程序出問題的可能。至於功過如何,大家見仁見智吧。


windows會載入舊版本的dll文件,這些dll文件之所以要留在系統裡面,就是因為裡面有被依賴的bug。為什麼軟體會出現兼容問題?超過99%都是因為不嚴格按照msdn來寫,根據自己的人肉觀察,或者甚至調用了非公開API導致的。但是微軟顯然不可能去改他們的代碼,那就把更新前的有bug、有漏洞的dll拿出來用,不想升級軟體的用戶就可以開心的繼續使用軟體了。

剩下的1%,是因為微軟修改了API,譬如說不同屏幕的DPI居然可以不一樣。


謝邀。不太了解,做一個猜想,等了解情況的高手來猜想。

有說法提到了兼容模式貌似會改變一些 API 的特性,從這個文章上 Raymond Chen 大神的回復中可以得到一些信息。

"Compatibility mode" changes the behavior of the operating system. Things like, "GetVersion() reports Windows 95 (even though it"s really Windows XP)," or "If you read the registry to detect what version of IE is running, you will see 4.0 (even though it"s really 5.1)," or "if you call RegDeleteKey, perform a recursive deletion because that"s what Windows 95 did."

http://blogs.msdn.com/b/oldnewthing/archive/2003/12/23/45481.aspx#45590

猜想 Windows 實現了多套之前各個版本的大部分 API 的運行時庫,然後在不同的兼容模式下調用不同的運行時庫。我搜了一下 Windows 中主要 dll 的名稱(如ntdll.dll),發現在 WinSxS 中有很多個「副本」(權且這麼稱呼),然後查證了一下 WinSxS 這個目錄的作用,這個目錄包含了 Windows 中各個組件不同版本、語言和架構的實現。

All of the components in the operating system are found in the WinSxS folder – in fact we call this location the component store. Each component has a unique name that includes the version, language, and processor architecture that it was built for. The WinSxS folder is the only location that the component is found on the system, all other instances of the files that you see on the system are 「projected」 by hard linking from the component store.

http://blogs.technet.com/b/askcore/archive/2008/09/17/what-is-the-winsxs-directory-in-windows-2008-and-windows-vista-and-why-is-it-so-large.aspx

所以我覺得我猜想的那樣子有一定的道理,如果有錯歡迎指正。


你可以去下載一個Application Compatibility Toolkit,新建一個補丁,選擇一個目標程序,選擇兼容模式(比如Vista SP2)之後你就可以看到哪些補丁被啟用。


總之就是儘可能地模仿舊系統咯,比如autocad2006裝在windows 7上提示沒有.net,使用兼容性模式後解決。


微軟更新了API啊,你用最新的開發工具編譯出來的當然穩定,有些程序若干年不更新了,或者程序員去世了,微軟就的支持啊。

提供這些舊的庫文件以便在新系統上適配。


推薦閱讀:

win8.1如果不分區,應該注意什麼?
ssd+hdd混合硬碟,裝win7還是win8.1?
與 Windows 7 相比,Windows 8 操作系統有何優勢和不足?
windows一共有多少軟體?
Windows 10 上什麼軟體值得推薦?

TAG:MicrosoftWindows |