Microsoft KB Archive/198846

= How To Create Localized Resource DLLs for MFC Application =

Article ID: 198846

Article Last Modified on 7/1/2004

-

APPLIES TO


 * Microsoft Visual Studio 97 Service Pack 3
 * Microsoft Visual C++ 5.0 Professional Edition
 * Microsoft Visual Basic 5.0 Enterprise Edition

-



This article was previously published under Q198846



SUMMARY
Resource DLLs are an efficient means for using resources in different languages. Applications can supply a single DLL that has localized resources through their setup program. Changing to another language is a simple matter of using the correct DLL.

The information below discusses how to make a localized resource DLL with Visual C++ 5.0.



MORE INFORMATION
This article describes an easy, general method for generating an application and resource DLLs capable of supporting multiple languages. By using this method, you have all of your resources in one RC file, making it fairly easy to see what resources you've implemented.

 Create a default MFC AppWizard application (called MyApp in this example), and specify U.S. English for the resources language. Use MFC library as a shared DLL. Insert a default MFC AppWizard DLL as a top-level project (ResourceDll in this example), and select MFC Extension DLL (using shared MFC DLL) for the type of DLL. Because no .lib file is created for the DLL, a top-level project avoids linker problems in subsequent builds of the executable. Remove and delete the RC file, the Resource.h file, the ResourceDll.rc2 file, and the RES directory from the ResourceDll project. From the Project menu, select the Add To Project pop-up menu and choose Files. Insert the MyApp.RC file into the ResourceDll project. For each additional language that MyApp will have localized resources for:

 From the Build menu, click Configurations and add a new Release and Debug configuration. For example, add a French Release configuration and copy its settings from ResourceDll - Win32 Release and add a French Debug configuration and copy its settings from ResourceDll - Win32 Debug. In the Project Settings dialog box, choose Multiple Configurations, in the Settings for combo-box. Choose both the release and the debug project configurations for a particular language in the Select Project Configurations to Modify dialog box. In the Resources tab, add the preprocessor definitions AFX_RESOURCE_DLL and AFX_TARG_XXX, where XXX is the a letter specifier for the language. For example, FRA for French [France, DEU for German, and ENU for English (USA)].

NOTE: The preprocessor definitions are comma separated with no spaces between definitions.</li> In the Language combo-box, select the language used in the resource.

NOTE: You may want to name your DLLs to help identify them. For example you may want to add a "d" to the root name to mark it as a debug DLL, and use language-specific file extensions to note the locale. Be aware that a debug version of the executable will not work with a release version of the resource dll.

This can be done by changing the output target that the linker uses for each build of the DLL.

<ol> Select the Link property page from the Project settings dialog box.</li> In the in the Settings For combo-box, highlight the configuration for which you want to change the DLL output directory.</li> Make sure Category is set to General and specify the output directory name in the edit box under Output File Name.</li></ol>

For example, for a dll containing localized resources for French, change Debug/ResourceDLL.dll to French Debug/ ResourceDLLd.FRA for the Win32 Debug configuration and change change Release/ResourceDLL.dll to French Release/ ResourceDLL.FRA for the Win32 Release configuration.

To use these DLLs, you must copy the desired DLL into the same directory that MyApp.exe is in, or an appropriate Windows directory, and rename it to ResourceDll.dll or ResourceDllD.dll. For example:

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

You can also specify the directory where the resource file, MyApp.res, will be generated for each localized DLL.

<ol> Select the Resources property page from the Project settings dialog box.</li> In the in the Settings For combo-box, highlight the configuration for which you want to change the resource output directory.</li> Make sure Category is set to General and specify the directory where the output file for the resources will be generated in the edit box under Resource file name.</li></ol> </li></ol> </li> From the Project menu, select Settings and highlight the ResourceDLL project. Choose All Configurations from the Settings For combo box. Click the C/C++ tab followed by its Preprocessor category. Add the path for the MyApp project in the Additional include directories field.</li> From the Project menu, select Settings and highlight the MyApp project. Choose All Configurations from the Settings For combo box. Click the Resources tab, and in the Preprocessor definitions field, add AFX_RESOURCE_DLL. This definition removes all of the resources from MyApp.exe.</li> In the ResourceView workspace, open each folder and, with the CTRL key pressed, select all of the resources in the MyApp project. For example, your selections should include an IDR_MAINFRAME for the Accelerator and IDD_ABOUTBOX for the Dialog.

For each of the ResourceDLL configurations, on the Insert menu, click Resource Copy, set the language to the appropriate language, and press OK. You should now have a complete set of resources for anther language. The resources, however, must be translated.

(If the language for which you want to create localized resources is not in the list of languages, select another language and manually edit the text of the resource file. After you have made the appropriate changes, the brackets next to the resource will say "Unknown Language" and show the language and sublanguage identifiers.)

NOTE: You can also copy preexisting resources to the resource file at this time. For example, create a separate MFC AppWizard application project that uses the French language resources by using the same selections you used to create the initial MyApp project. After creating this application, close its workspace and open the MyApp project workspace and select ResourceView. Then, on the File menu, click Open, and open the French application's RC file. Now drag/drop all of the resources from the French application into the MyApp application. These resources are already in French and need no translation.</li>  Add an HINSTANCE member variable to the application's CWinApp derived class. This will hold the DLL instance handle. For example:

HINSTANCE m_hInstResDLL;

Inside the CWinApp::InitInstance definition for your project, add the following three lines at the top of the function:

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

NOTE: It is not necessary to call AfxSetResourceHandle at this point. </li>  Add a CMyApp::ExitInstance member function using the Class Wizard. Add code freeing the library before the application exits. Modify the function as follows:

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

</li> The application is ready to build. Using the Batch Build dialog box, select the desired targets. Remember that you must copy the appropriate DLL into the a suitable location and rename it.</li></ol>

<div class="references_section">