如何为C ++(MSVC 2008)解决方案创建语言附属DLL?

时间:2011-03-16 15:39:47

标签: c++ visual-studio-2008 resources localization

我们最终本地化我们的应用程序并需要为字符串表创建附属DLL(一个月的过程从源代码中获取硬编码的字符串)。

我一直在关注MSDN和其他帮助,但我对实际构建语言DLL的机制感到很困惑。

我们在EXE本身拥有英语资源。根据我的理解,我们现在需要创建名为MyAPPXXX.dll的DLL项目。

我不确定应该怎么做。是否只有一个资源/ rc文件和文件中的不同部分,或者是否为每种语言复制了rc文件并替换了翻译?

我迷失了,试图按照我在其他地方看到的有关如何执行此操作的说明。

每种语言都需要一个DLL,或者我们是否拥有多个配置的相同项目 - 如果后者是如何完成的?

以下是我读过的有关此内容的页面列表 - 但是相互矛盾的信息和我的无知让我感到困惑:

http://msdn.microsoft.com/en-us/library/24b2tcy0%28vs.71%29.aspx

http://msdn.microsoft.com/en-us/library/8fkteez0%28vs.71%29.aspx

http://www.codeproject.com/KB/locale/multilingual.aspx

http://www.codeproject.com/KB/cpp/mult_lang_support.aspx

http://www.codeproject.com/KB/locale/MultiLangSupportMFCExtDLL.aspx

http://support.microsoft.com/kb/198846

http://www.codeguru.com/cpp/w-p/dll/mixeddlls/article.php/c12069

http://www.codejock.com/support/articles/mfc/general/g_multilang.asp

http://msdn.microsoft.com/en-us/library/aa645513%28v=vs.71%29.aspx

http://support.microsoft.com/kb/188659

http://msdn.microsoft.com/en-us/library/x6h91d9w.aspx

编辑:

我可以为不同的语言设置rc文件的不同部分,还是必须制作rc文件的副本 - 每个语言dll一个?

1 个答案:

答案 0 :(得分:3)

您可以拥有多个.rc文件。来自MS的唯一一个似乎不允许的构建环境是WDK(Windows驱动程序工具包),但您可以使用#include语句解决它。

实际上,您组合或分离语言的方式完全取决于您。资源有一个语言标识符(您以LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN的形式提供该标识符,但可能必须包含winnt.rhwinres.hafxres.h的符号名称语言),因此可以在一个DLL中携带多种语言。您还可以在.exe中定义一组核心语言,并将其他语言分别分成一个.dll文件。

但是,过去在选择语言方面存在问题(如果用户没有明确说明),这就是MS在Vista中引入MUI支持的原因。

在我的部署中,到目前为止最好的选择始终是每个DLL一种语言和.exe中的一种“核心语言”。

我也更喜欢每种语言使用单独的.rc文件,但毫无疑问,使用#ifdef可以实现相同的...

注意:没有看到你的链接更新,现在略过它们......


您的第一个链接“创建仅限资源的DLL”,提示我添加另一个小事实。由于这样的DLL没有入口点而没有代码,因此可以在x64进程中使用为x86编译的DLL。带LoadLibraryEx的{​​{1}}也允许使用包含代码的文件。


好的,进入.rc文件的是什么?通常.rc文件看起来像这样:

LOAD_LIBRARY_AS_DATAFILE

那么,答案取决于哪里。如果你没有需要翻译的菜单和对话框,你可以简单地将特定于语言的字符串表放在每个.rc文件中并从中构建.dll(如果你使用// ... #include "afxres.h" // ... LANGUAGE LANG_*, SUBLANG_* IDR_MAINFRAME MENU // ... language-specific menu entries IDD_ABOUTBOX DIALOGEX 0, 0, ... // ... language specific pre-filled dialogs, control sizes adjusted and all STRINGTABLE // ... language-specific *strings* END 就可以了) 。但是,如果你有其他项目而不是需要翻译的裸字符串,你也必须包括那些(通常对话框和菜单是更常见的)。在这种情况下,您可以调整每种语言的控件大小和位置。但要注意,维护成本可能相当高。可以有更好的解决方案,例如,wxWidgets使用所谓的bag-sizer来容纳长字符串。