2007/02/23

備忘: Windows Compatibility Layer

看到網路上常見的 LocaleStart.vbs (作者網站) 沒有直接叫用 AppLoc.exe 而是用其他方式感到好奇 (我發現的有點晚,沒想到已經 Lag 快三年),無意中發現 Windows 的一套相容性階層操作,可以搭配 BAT / JS / VBS 來自訂化執行程式,方便的很。

先引用幾份資料:
  1. Script Compatibility Layers tip
  2. 如何:在 Windows XP 中撰寫相容性階層指令碼
  3. NLS information page
Windows XP中新增了一套相容性階層 (但我曾經在 Windows 2000 的光碟中發現改相容性小工具,那應該是最早的實作) 。而後來強化這套相容性階層,作了 AppLocale 這個公用程式。這個公用程式主要強化相容性階層,新增了一個參數 #ApplicationLocale (其餘參數請參考資料 1.)。設定方法呢,是在系統的環境變數內設定的 (常見的有 PATH, WINDIR 一類的,命令列執行 set 列出) ,有一個 __COMPAT_LAYER 的變數呢,就是相容性階層的設定。

假如今天在命令列下了 set __COMPAT_LAYER=Win98 640x480,即會將目前的相容性階層設為 Win98 相容, 解析度 640x480 模式。而後以命令列執行各類程式都會依照 __COMPAT_LAYER 的設定,由系統層面來作相容性的處理。

安裝了 AppLocale 後,__COMPAT_LAYER 新增了參數 #ApplicationLocale。於是要讓非 Unicode 程式使用指定字碼表的方法也很簡單,先 set __COMPAT_LAYER=#ApplicationLocale,再 set AppLocaleID=(字碼表LCID) (LCID 請參考資料 3.),這樣執行程式系統層便會以這些資料來作適當的轉換以完成工作。所以說 AppLoc.exe 也只不過是一個設定環境變數的工具,其實我們也可以手動設定的。(注意一下,若是 __COMPAT_LAYER 有多個設定,請以空格隔開。如果有包含 #ApplicationLocale,務必讓他排在第一順位,執行才會正常)

總結一下,如果要開啟 C:\test.exe 並以 Win2000 相容性模式、簡體中文字碼表的方式啟動,則在命令提示字元依序下以下指令即可:


set __COMPAT_LAYER=#ApplicationLocale Win2000
set AppLocaleID=804
C:\test.exe


附:以下是將原 LocaleStart.vbs 改寫成 JScript 形式的練習:

容我在這說幾句:WScript 的 JScript 跟網頁上常用的 JavaScript 有些不一樣,應該是版本的問題。前者不但 Array 是使用 () 而非 [],Array 也沒有 .join() 等方法,有點難以適應。

沒有留言:

張貼留言