在VC 5.0中實現基於MFC的元件的本地化 (轉)

worldblog發表於2007-12-04
在VC 5.0中實現基於MFC的元件的本地化 (轉)[@more@]發信人: cvisual (貝貝), 信區: VisualC 
標 題: 在VC 5.0中實現基於MFC的的本地化 
發信站: BBS 水木清華站 (Thu May 7 23:08:34 1998) 
 
 Visual C++(以下簡稱VC)是公司的Visual 系列開發工具 
之一。對非英語地區的員,不可避免地要解決軟體的本地化問題 
。VC 本身就支援多語種,給本地化帶來了極大的方便。這裡我們 
主要討論基於 MFC 的元件的本地化。 
 要實現那些使用 MFC 的元件的本地化,需要解決下面兩個問題。 
 元件本身的本地化 
 第一問題是,要實現元件本身的一些特殊資源的本地化,例如字元 
串、對話方塊等等。由於大多數在 MFC 基礎上構架的元件也包含和使 
用了一部分由 MFC 定義的資源,所以必須同時本地化這些 MFC 資源 
。幸運的是,MFC 本身已提供了多種語言的本地化版本,它們包括:漢 
語、德語、西班牙語、法語、義大利語、日語和韓國語。存在於VC光 
盤中相應的 DevStudi VCMFC[src|include]l.xxx 目錄下," l 
 "代表"本地化"的意思,"l.chs"即代表簡體中文。將這些目錄下的 * 
.rc 拷入中相應的目錄即可。當應用程式與MFC之間採用靜 
態連結的時應採用該方法,但它只在VC 5.0的專業版與企業版中 
才支援。 
 大多數的應用程式與MFC之間採用動態連結的方式,這時在Win95 
的system目錄下必須有相應的MFC 資源 DLL 檔案的本地版本——MFC 
4xLOC.DLL(Pwin95 OEMSR2版本提供的是MFC0 LOC.DLL)。將VC光碟的 
目錄 DevStudioVCRedist 中的檔案:MFC42xxx.DLL 複製入Pwi95 
的system目錄下,並更名為:MFC42LOC.DLL即可(其中MFC42CHS.DLL即 
代表簡體中文版的資源 DLL 檔案)。拷入前除了要解決同名DLL相覆 
蓋的版本問題外,還應注意以下兩方面的內容 
 首先,不應該在英文版的(如英文 Win95)上 MFC4xLOC.D 
LL。因為英文版的資原始檔程式碼已內建於MFC4x.DLL 中,應用程式從M 
FC4x.DLL 中載入程式碼的速度比從 MFC4XLOCD LL 中先搜尋再載入代 
碼的速度要快得多。 
 其次,由於有多個版本的 MFC4xLOC.DLL ,在VC光碟的目錄 DevS 
tudioVCRedist 中可同時找到如:MFC4xCHS.DLL——簡體中文版本 
、MFC4xDEU.DLL——德國版本、MFC4xESP.LL——義大利版本等等。 
 所以在安裝之前,應先確定所安裝的MFC4xLOC.DLL 的本地版本代 
號與所使用的Window 系統是否相一致,例如:只有MFC42CHS.DLL 才能 
安裝在 Pwin95 的系統上。 
 需要指出的是,以上的方法會給應用程式的安裝帶來一定的複雜 
性,因為的系統下可能會安裝多種本地化版本的應用程式。例如: 
支援簡體中文;後來又裝了一個日文版的軟體而連結庫檔案MFC4xLOC. 
DLL 只有一個,若後者覆蓋了前者,應用程式執行時就會發生資源連結 
出錯。所以我們建議採用另一種方法,即建立自己的本地版本的MFC 
資源 DLL 檔案,而不是直接MFC4xLOC.DLL 檔案,該方法後面會繼 
續分析。 
 處理程式碼 
 第二個問題是,應處理好各元件本地化資源的程式碼,使之能良好地 
執行於目標環境。大多數情況下,這依賴於應用程式對位元組的高位及 
雙位元組字元的處理能力。在預設情況下,MFC對它們直接支援。 
 所以,本地化應用程式和DLL實質上只需用本地語言改寫相應的資 
源即可。如果C++中不帶有需要本地化的字串或正文,那麼只 
需對資原始檔作修改。實際上,使用者可以實現自己的元件,這樣無須重 
建原始程式碼即可獲得本地版本。這或許很複雜,但很值得,MFC本身也 
採用這種技術。可開啟資原始檔編輯器直接用本地語言進行編輯,但 
這樣每次版本的升級都需對應用程式進行重建。 
 注意:VC 4.0或以後的版本直接支援多種語言的.RC檔案。 
 避免這樣做的一種方法就是建立一個分離的DLL並對其進行本地 
化,該 DLL 有時也叫做"衛星式 DLL"。在程式執行期間它將被動態地 
進行連結,此時資源將從這個"衛星式 DLL"載入,而不是從程式碼的主模 
塊載入。MFC 直接支援這種方法,MFC4xLOC.DLL 本身就是一個本地化 
的"衛星式 DLL",只不過是在預設狀況下是由 MFC 提供的。我們可以 
建立一個自己的"衛星式 DLL",如有一名為MYAPP.EXE 的應用程式,它 
的所有資源全來源於一個叫做 MYRES.DL 的檔案。這些都在其應用程 
序的InitInstance 事件中完成,如下所示: 
 CMyApp::InitInstance() 
 { 
 // 初始化程式碼的開始部分 
 HINSTANCE hInst = LoadLibrary("myres.dll"); 
 if (hInst != NULL) 
 AfxSetReHandle(hInst); 
 // 以下是其它初始化程式碼 
 . 
 . 
 . 
 } 
 這段程式碼後,MFC 將從 MYRES.DLL 中載入資源,而不是直接 
從 MYAPP.EXE 中載入。 
 建立一個單一的資源DLL檔案並不難。先建立一個 DLL 專案檔案 
,並加入.RC檔案和其他必要的資源,然後在連結器(Linker)的引數裡 
增加一個 "/NOENTRY"引數即可。這個引數告訴連結器該 DLL 沒有接 
入點,因為資源 DLL 檔案沒有程式碼。 
 另外,若應用程式以  Release 的方式建立(即EXE 檔案中 
不嵌入程式碼),則還需完成以下步驟。在工程檔案裡,開啟選單 Pr 
ojects/settings... ,分別選中c/c++ 頁和R esources頁,將其中的 
引數[ /D "_AFXDLL"]去掉(它一般由 AppWizard 自動生成)。該引數 
指定只從 MFC 的共享 DLL 檔案中載入資源,而並不定義其他的資源 
來源,這樣使用者自己建立的資源 DLL 檔案將不起作用。 
 最後,由於AppWizard 是VC++的一大特色,VC++ 允許在使用AppWi 
zard 建立基於MFC的應用程式時就可以選擇不同的語言,直接生 
成本地化的程式框架。其中日文、韓文與簡體中文,由於需要支援雙 
位元組版本的,所以在預設情況下,與這三種遠東語言相對應的 
MFC AppWizard DLLs並沒有被VC 5.0的安裝程式裝入硬碟。因此,在 
應用程式生成嚮導的第一頁下拉式列表框中,找不到這些語言條目,但 
可以在VC光碟的 DevStudioSharedBi IDE 目錄中找到: 
 語言 AppWizard DLL 
 ----------------------------------- 
 日文 ---- APPWZJPN.DLL 
 韓文 ---- APPWZKOR.DLL 
 簡體中文 ---- APPWZCHS.DLL 
 在簡體中文Pwin95下,只需將相應的APPWZCHS.DLL 檔案從VC光碟 
複製入硬碟的 DevSu dioSharedIDEBinIDE 目錄下即可。這時," 
簡體中文"這一條目就會出現在應用程式生成嚮導的第一頁下拉式列 
表框中,如下圖: 
圖1 
 這樣,AppWizard 生成的應用程式框架將自動包含簡體中文的菜 
單、標題、狀態列等。我們將框架程式編譯連結,執行後將會看到一 
個漂亮的全中文介面。 
 所以,用VC製作簡體中文的軟體非常方便,感興趣的朋友可以繼續 
檢視VC幫助系統,以獲得更多的資訊。 
 
-- 
┌————┐ 
│ 貝 貝 │ 
└————┘ 
 
 
※ 來源:·BBS 水木清華站 bbs.tsinghua.edu.cn·[FROM: bbs.nju.edu.cn] 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988414/,如需轉載,請註明出處,否則將追究法律責任。

相關文章