通過修改manifest檔案來解決Vista/Win7/Win8下應用程式相容性問題
事實上,我們的程式相容性是沒問題的,只不過是在程式中沒有指定應用程式相容的作業系統,所以導致了這些問題。
VS2008和VS2010可以生成一個與exe應用程式相關聯的.manifest檔案,微軟已經為該檔案中添加了一個新的<compatibility> 欄位, 這個欄位用來指定你的應用程式可以相容的作業系統,進而可以解決程式相容性問題。
.menifest檔案是一個隨工程編譯產生的xml檔案,作用是為作業系統提供了對應用程式部分資訊的描述,每個exe程式或者dll都必須有一個manifest,對於應用程式而言,可以是一個和exe檔案同一目錄下的.manifest檔案,也可以是作為一個資源嵌入在exe檔案內部的(通過修改專案配置manifest
tool->input output->Embed Manifest->yes)
以下是添加了<compatibility> 欄位的manifest檔案,添加了對Vista/Win7/Win8系統的相容性的支援:
- <?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>
- <assemblyxmlns="urn:schemas-microsoft-com:asm.v1"manifestVersion="1.0">
- <compatibilityxmlns="urn:schemas-microsoft-com:compatibility.v1"
- <application>
- <!--The ID below indicates application support for Windows Vista -->
- <supportedOSId="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
- <!--The ID below indicates application support for Windows 7 -->
- <supportedOS
- <!--The ID below indicates application support for Windows 8 -->
- <supportedOSId="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
- </application>
- </compatibility>
- </assembly>
如果你的專案會生成一個.manifest檔案的話,也就是不是內嵌模式,直接修改該檔案,重新編譯即可。如果你的專案設定的是將.manifest檔案內嵌到應用程式內部,則你需要先修改為非內嵌模式,編譯,生成.manifest檔案,修改該檔案後,再將工程屬性改為內嵌模式。同時將修改後的.manifest檔案通過additional manifest file 選項新增到工程裡面,重新編譯即可。(好像直接編寫一個上述內容的.manifest檔案,檔名:exe名稱.exe.manifest,然後將清單設定為內嵌模式,直接將manifest檔案新增到工程中編譯即可)
本篇文章之前是參考了:http://blog.csdn.net/rainkop/article/details/8065297(標題:通過修改程式解決win7下應用程式相容性助手彈出),原文中提到了解決win7中相容性的辦法,於是也想使用同樣的處理,但是win8系統的ID是多少呢?
上網搜了很久也沒有找到,後來抱著試試看的想法使用win7的ID號(35138b9a-5d96-4fbd-8e2d-a2440225f93a),搜了找到了Microsoft的一個官方文件,結果該文件對相容性進行了詳細的說明,進而找到了Win8的系統的ID,才得以解決Win8上的相容性問題。文件的名稱為“Windows 8 和 Windows Server 2012相容性手冊”,主題是有關 Windows 相容性、可靠性以及效能的開發人員指南。