在本地DLL中embedded多个相同名称的资源(RC)文件

对于我的应用程序(一个MMCpipe理单元),我需要创build一个包含本地化为不同语言的string的本地DLL。 换句话说,如果您要使用Visual Studio检查此DLL,则会看到多个string表,每个string表与不同的区域设置相关联,但包含相同的stringID。

我想采取的方法是在我的项目目录下有各种子目录,如“de”,“en”,“es”等(即每种语言一个)。 在每个子目录内都会有一个名为“Resources.rc”的文件,这个文件将是包含该语言string的RC文件。 在这个结构中拥有我的资源对于本地化团队来说是非常理想的。

我设法创build了我的各种RC文件,并将它们添加到我的Visual C ++项目中。 它们都在Visual Studio的解决scheme资源pipe理器中正确显示(您基本上看到名为“Resource.rc”的条目的五个实例,但每个条目指向不同的文件)。

问题来自build设我的项目。 似乎只有一个RC文件(在vcproj文件中首先指定的文件)被编译成一个RES文件并包含在我的DLL中。 大概这是因为Visual Studio不喜欢RC文件都具有相同名称的事实。

有什么办法实现我想要的?

谢谢!

是。 如果你想要多个RC文件,你将不得不利用操作系统支持在一个文件中拥有多个资源。 在资源编辑器中,对于每个资源,您可以设置其语言环境,并且资源编辑器将允许您拥有具有相同ID的多个资源,只要其语言环境不同即可。

所以,你的第一步是编辑每个RC文件,以确保其中一个资源是英文/美国,另一个包含法文等。

接下来,获取主要的RC文件#include其他。

最后,这是问题所在,您需要依靠操作系统逻辑来加载正确的资源。 如果您很高兴让PC的语言环境决定使用哪种UI语言,那么您已经做得足够了。

如果你想提供一个菜单选项,允许用户改变语言:SetThreadLocale 过去是一个简单的方法来切换当前线程上加载资源的区域设置。 自Windows 2000以来,API的一些不幸重载使用已经导致MS弃用它的使用,以至于要求App开发者总是使用FindResourceEx–如果你想的话,它真的不能帮你,例如,从字符串表中加载一个字符串。

如果你真的想要一个简单的方法来获得用户可选择的UI语言,那么你需要将每个.rc文件放到一个单独的dll中。 然后LoadLibrary在适当的语言资源DLL上。