程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 用VC純資源dll解決國際化問題

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

編輯:關於VC++

解決國際化問題這的確是個老話重談了,因為這裡面確實也沒有什麼可以稱的上技術含量的,只是實現起來有點煩瑣,不過我還是要寫出來,希望剛接觸這方面的同行們不至於走太多的彎路。

由於MFC應用程序也有自己的資源文件,當你調用MFC函數比如 CString::LoadString 或其它 LoadIcon 時,MFC應用程序框架首先跟蹤搜索EXE文件的資源,然後才是DLL和MFC的資源,因此在使用純資源DLL時候,必須人為先改變資源的搜索順序,可以通過使用 AfxSetResourceHandle 函數來實現,具體實現如下:

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();
}

最後編譯運行!

小結

以上的方法實現了中英文軟件界面,不過,只要稍做擴展,很容易實現對多語言的支持。

聯系方式:QQ:36201365

e-mail:[email protected]

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved