用VC純資源DLL解決國際化問題

發表于:2007-04-27來源:作者:點擊數: 標簽:問題本文國際化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();
}

  最后編譯運行!

編輯推薦:深入淺出Visual C++動態鏈接庫編程

原文轉自:http://www.anti-gravitydesign.com

評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
...
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97