資源 DLL 是使用不同語言資源的有效方法。應用程式可以提供單一 DLL,而這個 DLL
則已透過應用程式的安裝程式將資源當地語系化。只要使用正確的 DLL,就很容易變更到其他語言。
下列資訊討論如何使用 Visual C++
5.0 製作當地語系化資源 DLL。
本文將告訴您一種簡易、通用的方法,可用來產生應用程式以及能支持多種語言的資源
DLL。您可以使用這個方法將所有資源集中在單一 RC 檔案中;如此一來,查看您所實作的資源就變得相當容易。
- 建立預設的 MFC AppWizard 應用程式 (在此範例中稱為 MyApp),然後指定美國英文做為資源語言。使用 MFC 程式庫當做共用 DLL。
- 插入預設的 MFC AppWizard DLL 做為最上層專案 (在此範例為 ResourceDll),然後選取 [MFC 擴充 DLL (使用共用 MFC DLL)] 做為 DLL 的類型。由於沒有為 DLL 建立 .lib
檔案,因此最上層專案可以在後續建置可執行檔的過程中避免連結器問題。
- 從 ResourceDll 專案移除並刪除 RC 檔案、Resource.h 檔案、ResourceDll.rc2
檔案和 RES 目錄。
- 從 [專案] 功能表中選取 [加入至專案] 快顯功能表,然後選擇 [檔案]。將 MyApp.RC 檔案插入 ResourceDll 專案中。
- 針對 MyApp 要用於當地語系化其資源的每一種語言,執行下列步驟:
- 從 [建置] 功能表中按一下 [組態],然後加入新的發行和偵錯組態。例如,加入 [法文發行] 組態,並從 [ResourceDll - Win32 發行] 複製其設定,然後加入 [法文偵錯] 組態,並從 [ResourceDll - Win32 偵錯] 複製其設定。
- 在 [專案設定] 對話方塊中,選擇 [設定] 下拉式方塊中的 [多重組態]。在 [選取要修改的專案組態] 對話方塊中,選擇特定語言的發行及偵錯專案組態。在 [資源] 索引標籤中,加入前置處理器定義 AFX_RESOURCE_DLL 和 AFX_TARG_XXX,其中 XXX
是語言的字母規範。例如,FRA 代表法國法文;DEU 代表德文;ENU 代表美國英文。
注意:前置處理器定義是以逗號分隔,定義之間沒有空格。 - 在 [語言] 下拉式方塊中選取資源使用的語言。
注意:您可能需要為 DLL 命名以便於識別。例如您可能要在根名稱中加上 "d",將它標記為偵錯
DLL,並使用語言特定的副檔名來註明地區設定。請注意,可執行檔的偵錯版本無法與資源 DLL 的發行版本搭配使用。
這項工作可以藉由變更連結器每次用於建置 DLL 的輸出目標來完成。
- 從 [專案設定] 對話方塊選取 [連結] 屬性頁。
- 在 [設定] 下拉式方塊中,反白顯示要變更其 DLL 輸出目錄的組態。
- 請確定 [分類] 已設定為 [一般],並在 [輸出檔名稱] 下的編輯方塊中指定輸出目錄名稱。
例如,針對包含法文當地語系化資源的 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 所在的目錄。
- 從 [專案設定] 對話方塊選取 [資源] 屬性頁。
- 在 [設定] 下拉式方塊中,反白顯示要變更其資源輸出目錄的組態。
- 請確定 [分類] 已設定為 [一般],並在 [資源檔名稱] 下的編輯方塊中指定產生資源輸出檔所在的目錄。
- 從 [專案] 功能表中選取 [設定],然後反白顯示 [ResourceDLL] 專案。從 [設定] 下拉式方塊中選擇 [所有組態]。按一下後面標示其前置處理器分類的 [C/C++] 索引標籤。將 MyApp 專案的路徑加入 [其他 Include 目錄] 欄位中。
- 從 [專案] 功能表中選取 [設定],然後反白顯示 [MyApp] 專案。從 [設定] 下拉式方塊中選擇 [所有組態]。按一下 [資源] 索引標籤,並在 [前置處理器定義] 欄位中加入 AFX_RESOURCE_DLL。這個定義會從 MyApp.exe
移除所有資源。
- 在 [ResourceView] 工作區中,開啟每個資料夾,並按住 CTRL 鍵以選取 MyApp
專案中的所有資源。例如,您的選擇應包括表示快速鍵的 IDR_MAINFRAME 以及表示對話方塊的 IDD_ABOUTBOX。
針對每個
ResourceDLL 組態,在 [插入] 功能表上按一下 [資源複本],將語言設定為適當的語言,然後按 [確定]。您現在應該會有另一種語言的完整資源集。不過,還必須對資源進行翻譯
(如果要為其建立當地語系化資源的語言不在語言清單中,請選取其他語言,然後手動編輯資源檔案的文字。進行適當變更之後,資源旁邊的括號將會標示「未知的語言」,並顯示語言及次語言識別項)。
注意:此時也可以將已經存在的資源複製到資源檔案中。例如,使用與建立初始 MyApp 專案所用的相同選擇,建立一個使用法文資源的個別 MFC
AppWizard 應用程式專案。建立此應用程式之後關閉其工作區,再開啟 MyApp 專案工作區並選取 [ResourceView]。然後,在 [檔案] 功能表上按一下 [開啟],並開啟法文應用程式的 RC 檔案。接著將法文應用程式的所有資源拖放到 MyApp
應用程式中。這些資源就已經是法文了,並不需要翻譯。 - 將 HINSTANCE 成員變數加入應用程式的 CWinApp 衍生類別中。這將保存 DLL
的執行個體控制代碼。例如:
在專案的 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()。 - 使用「類別精靈」新增 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();
}
- 現在可以開始建置應用程式。使用 [批次建置] 對話方塊選取所需的目標。請記住,您必須將適當的 DLL
複製到適合的位置,然後重新命名。
技術注意事項 56 (TN056) 說明當地語系化 MFC 資源 (MFC40LOC.DLL)
的用途。
技術注意事項 57 (TN057) 說明一些可用來對元件進行當地語系化的設計和程序,可以是應用程式或 OLE 控制項,或是使用
MFC 的 DLL。
技術注意事項 23 (TN023) 說明附隨 MFC 程式庫所提供且為其所需的標準資源。
如需有關 Visual C++ 2.2 版和更舊版本所隨附之 Microsoft Foundation Class 的詳細資訊,請參閱「Microsoft
知識庫」中的下列文件:
147149?
(http://support.microsoft.com/kb/147149/
)
"How To Localize Application Resources with Foundation Classes"
(c) Microsoft Corporation 1999。著作權所有,並保留一切權利。本文內容由
Isaac Varon, Microsoft Corporation 提供。