动态调用的DLL 如何装载多国语言包? 【多国语言开发进阶】 ( 积分: 100 )

  • 主题发起人 主题发起人 xifengge
  • 开始时间 开始时间
X

xifengge

Unregistered / Unconfirmed
GUEST, unregistred user!
最近开发一个支持多国语言的项目。项目用到了DLL插件。<br>因为DELPHI自带的多国语言功能支持控件位置和大小的修改,故舍弃了INI文件的做法。<br>为了使模块开发独立化,每个DLL插件都建立了自己专有的语言资源。如&nbsp;Tool.DLL拥有Tool.CHS&nbsp;和&nbsp;Tool.ENU。<br><br>但是现在遇到一个问题,就是动态装载的DLL插件包含的语言包该如何载入?<br>DELPHI提供的RICHEDIT样例装载语言包的做法是:<br>&nbsp;&nbsp;1.装载语言文件资源如&nbsp;Project.CHS&nbsp;Project.ENU&nbsp;等<br>&nbsp;&nbsp;LoadLibraryEx(PChar(LanguageResourceFile),&nbsp;0,&nbsp;LOAD_LIBRARY_AS_DATAFILE);<br>&nbsp;&nbsp;2.重设系统资源<br>
代码:
<br>function&nbsp;SetResourceHInstance(NewInstance:&nbsp;Longint):&nbsp;Longint;<br>var<br>&nbsp;&nbsp;CurModule:&nbsp;PLibModule;<br>begin<br>&nbsp;&nbsp;CurModule&nbsp;:=&nbsp;LibModuleList;<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;while&nbsp;CurModule&nbsp;&lt;&gt;&nbsp;nil&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;CurModule.Instance&nbsp;=&nbsp;HInstance&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;CurModule.ResInstance&nbsp;&lt;&gt;&nbsp;CurModule.Instance&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeLibrary(CurModule.ResInstance);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CurModule.ResInstance&nbsp;:=&nbsp;NewInstance;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;NewInstance;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;CurModule&nbsp;:=&nbsp;CurModule.Next;<br>&nbsp;&nbsp;end;<br>end;<br>
&nbsp;&nbsp;<br><br>这个方法解决了主程序的语言包装载,但是对于用LoadLibrary函数动态调用的DLL,LibModuleList似乎并不能列出,所以总是无法装载。<br><br>还请高手指教!&nbsp;多谢多谢!!!
 
delphi自带例子中有呀
 
已经说过了,只有载入主程序资源的例子,但是对于用&nbsp;LoadLibrary&nbsp;动态调入的&nbsp;DLL&nbsp;里的资源就没有例子了:(
 
有没有人帮忙啊,苦啊!!![:(][:(]
 
又奋战了一个通宵,唉,还是没有结果,不过找到了一个权宜之计。<br>我发现当从DELPHI&nbsp;IDE菜单&nbsp;PROJECT&nbsp;-&gt;&nbsp;LANGUAGE&nbsp;-&gt;&nbsp;SET&nbsp;ACTIVE&nbsp;重新设置语言后,动态调用的DLL资源可以自动找到对应的语言包。而&nbsp;PROJECT.EXE并不需重新编译,PROJECT目录下的文件也都没有变动,故猜想DELPHI一定在注册表里做了设置。<br>于是将PROJECT改成一个稀奇古怪的名字,到注册表里搜索,果然在HKEY_CURRENT_USER/Software/Borland/Locales下发现了其中的秘密:)<br>原来只要在该注册表项下创建一个Project.exe(含路径)的字符串,设置其数据为语言的扩展名。例如:<br>&nbsp;&nbsp;建立字符串:&nbsp;D:/TEMP/PROJECT.EXE<br>&nbsp;&nbsp;如果想显示中文,则数据设为:&nbsp;CHS<br>&nbsp;&nbsp;如果想显示英文,则数据设为:&nbsp;ENU<br>此办法是因为我不知道如何在动态调用DLL时载入DLL的资源文件,故权作代替,毕竟是权宜之计,还是请高手出来指教指教,如果分数少的话我可以再开一贴赠送,感激不尽!!!
 
看来我真的要跪求了[:(][:(][:(]
 
还是需要动态分配各自控件的标签文字。
 
那个是最笨的办法,代码要写非常多啊,并且不方便维护。<br>我现在要问的是如何在运行期实现动态更换DLL的资源。
 
关注中,希望有经验的高手提供一下解决方法。
 
跪求了!!![:(][:(][:(]<br><br>支持Resourcestring和DLL的办法只能是用DELPHI自动的语言包功能了,唉。
 

Similar threads

I
回复
0
查看
453
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部