如何為 MFC 應用程式建立當地語系化資源 DLL

文章翻譯 文章翻譯
文章編號: 198846 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

資源 DLL 是使用不同語言資源的有效方法。應用程式可以提供單一 DLL,而這個 DLL 則已透過應用程式的安裝程式將資源當地語系化。只要使用正確的 DLL,就很容易變更到其他語言。

下列資訊討論如何使用 Visual C++ 5.0 製作當地語系化資源 DLL。

其他相關資訊

本文將告訴您一種簡易、通用的方法,可用來產生應用程式以及能支持多種語言的資源 DLL。您可以使用這個方法將所有資源集中在單一 RC 檔案中;如此一來,查看您所實作的資源就變得相當容易。

  1. 建立預設的 MFC AppWizard 應用程式 (在此範例中稱為 MyApp),然後指定美國英文做為資源語言。使用 MFC 程式庫當做共用 DLL
  2. 插入預設的 MFC AppWizard DLL 做為最上層專案 (在此範例為 ResourceDll),然後選取 [MFC 擴充 DLL (使用共用 MFC DLL)] 做為 DLL 的類型。由於沒有為 DLL 建立 .lib 檔案,因此最上層專案可以在後續建置可執行檔的過程中避免連結器問題。
  3. 從 ResourceDll 專案移除並刪除 RC 檔案、Resource.h 檔案、ResourceDll.rc2 檔案和 RES 目錄。
  4. [專案] 功能表中選取 [加入至專案] 快顯功能表,然後選擇 [檔案]。將 MyApp.RC 檔案插入 ResourceDll 專案中。
  5. 針對 MyApp 要用於當地語系化其資源的每一種語言,執行下列步驟:

    1. [建置] 功能表中按一下 [組態],然後加入新的發行和偵錯組態。例如,加入 [法文發行] 組態,並從 [ResourceDll - Win32 發行] 複製其設定,然後加入 [法文偵錯] 組態,並從 [ResourceDll - Win32 偵錯] 複製其設定。
    2. [專案設定] 對話方塊中,選擇 [設定] 下拉式方塊中的 [多重組態]。在 [選取要修改的專案組態] 對話方塊中,選擇特定語言的發行及偵錯專案組態。在 [資源] 索引標籤中,加入前置處理器定義 AFX_RESOURCE_DLL 和 AFX_TARG_XXX,其中 XXX 是語言的字母規範。例如,FRA 代表法國法文;DEU 代表德文;ENU 代表美國英文。

      注意:前置處理器定義是以逗號分隔,定義之間沒有空格。
    3. [語言] 下拉式方塊中選取資源使用的語言。

      注意:您可能需要為 DLL 命名以便於識別。例如您可能要在根名稱中加上 "d",將它標記為偵錯 DLL,並使用語言特定的副檔名來註明地區設定。請注意,可執行檔的偵錯版本無法與資源 DLL 的發行版本搭配使用。

      這項工作可以藉由變更連結器每次用於建置 DLL 的輸出目標來完成。

      1. [專案設定] 對話方塊選取 [連結] 屬性頁。
      2. [設定] 下拉式方塊中,反白顯示要變更其 DLL 輸出目錄的組態。
      3. 請確定 [分類] 已設定為 [一般],並在 [輸出檔名稱] 下的編輯方塊中指定輸出目錄名稱。
      例如,針對包含法文當地語系化資源的 DLL,將其 Win32 偵錯組態的 Release/ResourceDLL.dll 變更為 French Release/ ResourceDLL.FRA,並將 Win32 發行組態的 Release/ResourceDLL.dll 變更為 French Release/ResourceDLL.FRA

      如果要使用這些 DLL,您必須將所需的 DLL 複製到 MyApp.exe 所在的目錄中或適當的 Windows 目錄中,然後重新命名為 ResourceDll.dll 或 ResourceDllD.dll。例如:

      copy ResourceDll.FRA\windows\system\ResourceDll.dll

      您也可以為每個當地語系化 DLL 指定產生資源檔案 MyApp.res 所在的目錄。

      1. [專案設定] 對話方塊選取 [資源] 屬性頁。
      2. [設定] 下拉式方塊中,反白顯示要變更其資源輸出目錄的組態。
      3. 請確定 [分類] 已設定為 [一般],並在 [資源檔名稱] 下的編輯方塊中指定產生資源輸出檔所在的目錄。
  6. [專案] 功能表中選取 [設定],然後反白顯示 [ResourceDLL] 專案。從 [設定] 下拉式方塊中選擇 [所有組態]。按一下後面標示其前置處理器分類的 [C/C++] 索引標籤。將 MyApp 專案的路徑加入 [其他 Include 目錄] 欄位中。
  7. [專案] 功能表中選取 [設定],然後反白顯示 [MyApp] 專案。從 [設定] 下拉式方塊中選擇 [所有組態]。按一下 [資源] 索引標籤,並在 [前置處理器定義] 欄位中加入 AFX_RESOURCE_DLL。這個定義會從 MyApp.exe 移除所有資源。
  8. 在 [ResourceView] 工作區中,開啟每個資料夾,並按住 CTRL 鍵以選取 MyApp 專案中的所有資源。例如,您的選擇應包括表示快速鍵的 IDR_MAINFRAME 以及表示對話方塊的 IDD_ABOUTBOX。

    針對每個 ResourceDLL 組態,在 [插入] 功能表上按一下 [資源複本],將語言設定為適當的語言,然後按 [確定]。您現在應該會有另一種語言的完整資源集。不過,還必須對資源進行翻譯

    (如果要為其建立當地語系化資源的語言不在語言清單中,請選取其他語言,然後手動編輯資源檔案的文字。進行適當變更之後,資源旁邊的括號將會標示「未知的語言」,並顯示語言及次語言識別項)。

    注意:此時也可以將已經存在的資源複製到資源檔案中。例如,使用與建立初始 MyApp 專案所用的相同選擇,建立一個使用法文資源的個別 MFC AppWizard 應用程式專案。建立此應用程式之後關閉其工作區,再開啟 MyApp 專案工作區並選取 [ResourceView]。然後,在 [檔案] 功能表上按一下 [開啟],並開啟法文應用程式的 RC 檔案。接著將法文應用程式的所有資源拖放到 MyApp 應用程式中。這些資源就已經是法文了,並不需要翻譯。
  9. 將 HINSTANCE 成員變數加入應用程式的 CWinApp 衍生類別中。這將保存 DLL 的執行個體控制代碼。例如:
       HINSTANCE m_hInstResDLL;
    						


    在專案的 CWinApp::InitInstance 定義中,將下列三行程式碼加到函式的最前面:

    #ifdef _DEBUG
       // Load the debug version of the localized resources.
       m_hInstResDLL = LoadLibrary("ResourceDlld.dll");
    #else
       // Load the release version of the localized resources.
       m_hInstResDLL = LoadLibrary("ResourceDll.dll");
    #endif
       ASSERT( m_hInstResDLL != NULL );
    						


    注意:此時不需要呼叫 AfxSetResourceHandle()。
  10. 使用「類別精靈」新增 CMyApp::ExitInstance() 成員函式。加入會在應用程式結束前釋放程式庫的程式碼。將函式修改如下:

    int CMyApp::ExitInstance()
    {
       // In case you load multiple DLL's make sure to free them,
       // and avoid calling FreeLibrary with a NULL pointer.
    
       FreeLibrary(m_hInstResDLL);
       return CWinApp::ExitInstance();
    }
    						


  11. 現在可以開始建置應用程式。使用 [批次建置] 對話方塊選取所需的目標。請記住,您必須將適當的 DLL 複製到適合的位置,然後重新命名。

?考

技術注意事項 56 (TN056) 說明當地語系化 MFC 資源 (MFC40LOC.DLL) 的用途。

技術注意事項 57 (TN057) 說明一些可用來對元件進行當地語系化的設計和程序,可以是應用程式或 OLE 控制項,或是使用 MFC 的 DLL。

技術注意事項 23 (TN023) 說明附隨 MFC 程式庫所提供且為其所需的標準資源。

如需有關 Visual C++ 2.2 版和更舊版本所隨附之 Microsoft Foundation Class 的詳細資訊,請參閱「Microsoft 知識庫」中的下列文件:
147149 "How To Localize Application Resources with Foundation Classes"


(c) Microsoft Corporation 1999。著作權所有,並保留一切權利。本文內容由 Isaac Varon, Microsoft Corporation 提供。

屬性

文章編號: 198846 - 上次校閱: 2006年12月18日 - 版次: 1.1
這篇文章中的資訊適用於:
  • Microsoft Visual Studio 97 Service Pack 3
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
關鍵字:?
kbhowto kbintl kbintldev KB198846
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com