受影響的平台
用戶端 - Windows 7
伺服器 - Windows Server 2008 R2
功能影響
嚴重程度 - 低
頻率 - 低
Description
Windows 7 在應用程式清單中新增了一個稱為「相容性」的區塊。此節協助 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 及以下版本編譯的二進位檔,則使用私有池。
直接拔鎖
- Windows 7: 為 Windows 7 顯示的應用程式無法在 DDRAW 中呼叫 Lock 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 行為發生前避免此競賽的應用程式,應在重疊事件發生時等待,並在收到訊號時呼叫 GetOverlappedResult,並使用 bWait == FALSE。
程式相容性助理(PCA)
- Windows 7: 帶有相容性部分的應用程式將無法獲得 PCA 緩解措施。
- Windows Vista(預設): 在特定情況下,若應用程式無法正確安裝或執行時當機,則可獲得 PCA 緩解措施。 更多細節請參閱參考文獻部分。
善用功能能力
更新應用程式清單,加入作業系統支援的最新相容性資訊。 本節描述了清單上的新增內容:
命名空間: Compatibility.v1 (xmlns=“urn:schemas-microsoft-com:compatibility.v1”>)
章節名稱: 相容性(新章節)
支援作業系統: 支援作業系統的 GUID-映射到支援作業系統的 GUID 有:
- {e2011457-1546-43c5-a5fe-008deee3d3f0} 適用於 Windows Vista:這是 switchback 上下文的預設值。
- {35138b9a-5d96-4fbd-8e2d-a2440225f93a} 適用於 Windows 7:在應用程式清單中設定此值的應用程式會獲得 Windows 7 的行為。
Note
Microsoft 將根據需要產生並發布未來 Windows 版本的 GUID。
以下是更新清單的範例。
Note
應用程式清單中的屬性與標籤名稱是區分大小寫的。
<?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 版本的電腦上執行。
解法 所有支援的 x64 版本 Windows 7 與 Windows Server 2008 R2,以及所有支援的 Itanium 版本 Windows Server 2008 R2 均有更新以修正此問題。 請前往 KB 978637 的 Microsoft 支援頁面 :應用程式在 Windows Vista 環境中執行,而非在運行 Windows 7 x64 版本或 Windows Server 2008 R2 的電腦 上,了解更多細節並下載適合你系統的正確版本。
崩潰傾失診斷被封鎖
解法 請前往 KB 976038 的 Microsoft 支援頁面:對於在 64 位元版本 Windows 上執行的應用程式拋出的例外,則會被忽略以獲得更多細節。
其他資源的連結