用VC純資源DLL解決國際化問題
本文源代碼下載 用VC純資源dll解決國際化問題這的確是個老話重談了,因為這里面確實也沒有什么可以稱的上技術含量的,只是實現起來有點煩瑣,不過我還是要寫出來,希望剛接觸這方面的同行們不至于走太多的彎路。 由于MFC應用程序也有自己的資源文件,當你調
本文源代碼下載 用VC純資源dll解決國際化問題這的確是個老話重談了,因為這里面確實也沒有什么可以稱的上技術含量的,只是實現起來有點煩瑣,不過我還是要寫出來,希望剛接觸這方面的同行們不至于走太多的彎路。
由于MFC應用程序也有自己的資源文件,當你調用MFC函數比如 CString::LoadString 或其它 LoadIcon 時,MFC應用程序框架首先跟蹤搜索EXE文件的資源,然后才是DLL和MFC的資源,因此在使用純資源DLL時候,必須人為先改變資源的搜索順序,可以通過使用 AfxSetResourceHandle 函數來實現,具體實現如下:
clearcase/" target="_blank" >cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
BOOL CMultilanguageApp::InitInstance() { AfxEnableControlContainer();
if (m_bChinese) { m_hLangDLL=::LoadLibrary("chinese.dll"); } else { m_hLangDLL=::LoadLibrary("english.dll"); }
AfxSetResourceHandle(m_hLangDLL); …… } |
下面開始談談具體的實現步驟。
一、創建主工程 步驟:
運行Visual Studio 6.0->File->New...->Projects;選擇Mfc AppWizard(exe),在右邊Project name下輸入multilanguage, 下一步選擇支持中文就可以呢;從項目中移出所有的資源文件,把Resource面板中的所有文件移出,把FileView面板中的multilanguage.rc,Resource.h,以及Resource Files下的所有文件移出。(說明:移出的文件并不是從實際的文件目錄中刪除掉)
二、創建英文版的DLL 步驟:
運行Visual Studio 6.0->File->New...->Projects;選擇Mfc AppWizard(dll),在右邊Project name下輸入english, 下一步選擇 Regular Dll Using share MFC DLL,單擊Finish就可以了;刪除不需要的文件:把Resource面板中的所有文件移出,把 FileView 面板中的english.rc,Resource.h,以及Resource Files下的所有文件移出,然后也可以從實際目錄中刪除掉;復制相關的資源文件:把multilanguage目錄下的multilanguage.rc,Resource.h文件復制到english工程文件目錄下,還需要把 multilanguage/res 下的所有文件復制到english/res目錄下(這樣操作起來簡單,當然你可以根據需要,選擇復制的文件);把3步復制的所有文件添加到項目中去;把所有的中文的資源名修改為相關的英文資源,同時需要把支持的語言改為“english(U.S.).",把Project菜單 Setting 對話框中 Resource 標簽的缺省文字改為"english(U.S.).”,還需要在Resource標簽下刪除預處理定義中的"_AFXDLL"。這樣用戶的鏈接庫包含通用的MFC資源;然后編譯建立動態鏈接庫就OK了。
三、創建中文版的DLL 具體的方法同創建英文版的DLL一樣,把項目名改為chinese.只是從 Project 菜單中選擇 Setting… 選項。然后在Link標簽下"Project Options" 添加 "/NOENTRY" 選項。最后,編譯并建立動態鏈接庫。
四、修改 multilanguage工程 在 CMultilanguageApp 類中添加如下的成員變量:
private: BOOL m_bChinese; HINSTANCE m_hLangDLL; |
構造函數中初始化:
CMultilanguageApp::CMultilanguageApp() { m_bChinese = TRUE; m_hLangDLL = NULL; } |
在InitInstance()函數修改資源加載順序:
BOOL CMultilanguageApp::InitInstance() { AfxEnableControlContainer();
if (m_bChinese) { m_hLangDLL=::LoadLibrary("chinese.dll"); } else { m_hLangDLL=::LoadLibrary("english.dll"); }
AfxSetResourceHandle(m_hLangDLL); …… } |
別忘了ExitInstance()函數釋放掉加載的dll資源
int CMultilanguageApp::ExitInstance() { if(m_hLangDLL) AfxFreeLibrary(m_hLangDLL); return CWinApp::ExitInstance(); } |
最后編譯運行!