分享
 
 
 

在VC 5.0中实现基于MFC的组件的本地化

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在VC 5.0中实现基于MFC的组件的本地化

浙江大学计算机系344信箱(310027) 郑杰

Visual C++(以下简称VC)是微软公司的Visual 系列软件开发工具之一。对非英语地区的程序员,不可避免地要解决软件的本地化问题。VC 本身就支持多语种编程,给本地化带来了极大的方便。这里我们主要讨论基于 MFC 的组件的本地化。

要实现那些使用 MFC 的组件的本地化,需要解决下面两个问题。

第一问题是,要实现组件本身的一些特殊资源的本地化,例如字符串、对话框等等。由于大多数在 MFC 基础上构架的组件也包含和使用了一部分由 MFC 定义的资源,所以必须同时本地化这些 MFC 资源。幸运的是,MFC 本身已提供了多种语言的本地化版本,它们包括:汉语、德语、西班牙语、法语、意大利语、日语和韩国语。存在于VC光盘中相应的 \DevStudi\ VC\MFC\[src|include]\l.xxx\ 目录下," l "代表"本地化"的意思,"l.chs"即代表简体中文。将这些目录下的 *.rc 文件拷入硬盘中相应的目录即可。当应用程序与MFC之间采用静态链接的模式时应采用该方法,但它只在VC 5.0的专业版与企业版中才支持。

大多数的应用程序与MFC之间采用动态链接的方式,这时在Win95的system目录下必须有相应的MFC 资源 DLL 文件的本地版本——MFC4xLOC.DLL(Pwin95 OEMSR2版本提供的是MFC0 LOC.DLL)。将VC光盘的目录 \DevStudio\VC\Redist 中的文件:MFC42xxx.DLL 拷贝入Pwi95 的system目录下,并更名为:MFC42LOC.DLL即可(其中MFC42CHS.DLL即代表简体中文版的资源 DLL 文件)。拷入前除了要解决同名DLL相覆盖的版本问题外,还应注意以下两方面的内容:

首先,不应该在英文版的系统(如英文 Win95)上安装 MFC4xLOC.DLL。因为英文版的资源文件代码已内建于MFC4x.DLL 中,应用程序从MFC4x.DLL 中载入代码的速度比从 MFC4XLOCD LL 中先搜寻再载入代码的速度要快得多。

其次,由于有多个版本的 MFC4xLOC.DLL ,在VC光盘的目录 \DevStudio\VC\Redist 中可同时找到如: MFC4xCHS.DLL——简体中文版本、MFC4xDEU.DLL——德国版本、MFC4xESP.LL——意大利版本等等。

所以在安装之前,应先确定所安装的MFC4xLOC.DLL 的本地版本代号与所使用的Window 系统是否相一致,例如:只有MFC42CHS.DLL 才能安装在 Pwin95 的系统上。

需要指出的是,以上的方法会给应用程序的安装带来一定的复杂性,因为用户的系统下可能会安装多种本地化版本的应用程序。例如:支持简体中文;后来又装了一个日文版的软件而链接库文件MFC4xLOC.DLL 只有一个,若后者覆盖了前者,应用程序运行时就会发生资源链接出错。所以我们建议采用另一种方法,即建立自己的本地版本的MFC 资源 DLL 文件,而不是直接调用MFC4xLOC.DLL 文件,该方法后面会继续分析。

处理代码

第二个问题是,应处理好各组件本地化资源的代码,使之能良好地运行于目标环境。大多数情况下,这依赖于应用程序对字节的高位及双字节字符的处理能力。在缺省情况下,MFC对它们直接支持。

所以,本地化应用程序和DLL实质上只需用本地语言改写相应的资源即可。如果C++源代码中不带有需要本地化的字符串或正文,那么只需对资源文件作修改。实际上,用户可以实现自己的组件,这样无须重建原始代码即可获得本地版本。这或许很复杂,但很值得,MFC本身也采用这种技术。可打开资源文件编辑器直接用本地语言进行编辑,但这样每次版本的升级都需对应用程序进行重建。

注意:VC 4.0或以后的版本直接支持多种语言的.RC文件。

避免这样做的一种方法就是建立一个分离的DLL并对其进行本地化,该 DLL 有时也叫做"卫星式 DLL"。在程序运行期间它将被动态地进行链接,此时资源将从这个"卫星式 DLL"载入,而不是从代码的主模块载入。MFC 直接支持这种方法,MFC4xLOC.DLL 本身就是一个本地化的"卫星式 DLL",只不过是在缺省状况下是由 MFC 提供的。我们可以建立一个自己的"卫星式 DLL",如有一名为MYAPP.EXE 的应用程序,它的所有资源全来源于一个叫做 MYRES.DLL 的文件。这些都在其应用程序的InitInstance 事件中完成,如下所示:

CMyApp::InitInstance()

{

// 初始化代码的开始部分

HINSTANCE hInst = LoadLibrary("myres.dll");

if (hInst != NULL)

AfxSetResourceHandle(hInst);

// 以下是其它初始化代码

.

.

.

}

这段代码执行后,MFC 将从 MYRES.DLL 中载入资源,而不是直接从 MYAPP.EXE 中载入。

建立一个单一的资源DLL文件并不难。先建立一个 DLL 项目文件,并加入.RC文件和其他必要的资源,然后在链接器(Linker)的参数里增加一个 "/NOENTRY"参数即可。这个参数告诉链接器该 DLL 没有接入点,因为资源 DLL 文件没有代码。

另外,若应用程序以 Win32 Release 的方式建立(即EXE 文件中不嵌入调试代码),则还需完成以下步骤。在工程文件里,打开菜单 Projects/settings... ,分别选中c/c++ 页和R esources页,将其中的参数[ /D "_AFXDLL"]去掉(它一般由 AppWizard 自动生成)。该参数指定只从 MFC 的共享 DLL 文件中载入资源,而并不定义其他的资源来源,这样用户自己建立的资源 DLL 文件将不起作用。

最后,由于AppWizard 是VC++的一大特色,VC++ 允许在使用AppWizard 创建基于MFC的应用程序框架时就可以选择不同的语言,直接生成本地化的程序框架。其中日文、韩文与简体中文,由于需要支持双字节版本的操作系统,所以在缺省情况下,与这三种远东语言相对应的MFC AppWizard DLLs并没有被VC 5.0的安装程序装入硬盘。因此,在应用程序生成向导的第一页下拉式列表框中,找不到这些语言条目,但可以在VC光盘的\DevStudio\SharedIDE\Bi\ IDE 目录中找到:

语言 AppWizard DLL

-----------------------------------

日文 ---- APPWZJPN.DLL

韩文 ---- APPWZKOR.DLL

简体中文 ---- APPWZCHS.DLL

在简体中文Pwin95下,只需将相应的APPWZCHS.DLL 文件从VC光盘拷贝入硬盘的 \DevSudio\SharedIDE\Bin\IDE 目录下即可。这时,"简体中文"这一条目就会出现在应用程序生成向导的第一页下拉式列表框中, 这样,AppWizard 生成的应用程序框架将自动包含简体中文的菜单、标题、状态栏等。我们将框架程序编译链接,运行后将会看到一个漂亮的全中文界面。

所以,用VC制作简体中文的软件非常方便,感兴趣的朋友可以继续查看VC帮助系统,以获得更多的信息。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有