实际上,BPL本身就是PE格式,只不过,DELPHI在他上面添加了特殊的信息,但他归根到底还是动态链接库,因此可以使用汉化链接库的方法来汉化组 件。这种方法比较通用,但可能无法解决字符过宽引起的问题。因此还是着重讨论DELPHI环境下,如何汉化的问题。
首先,我们知道DPK是形成BPL、DCP的源码,这个源文件实际上很简单,他只是简单地指示DELPHI,他需要引用哪些库,以及他本身包含哪些单元。因此如果能够从BPL中获取这些信息,就可以重新生成DPK文件了。
其次,DCU文件是PAS源码的二进制文件,他本身没有包含图形信息,而是直接从DFM文件获取图形信息,因此如果修改了DFM中的文件信息,就可以直接得到修改后结果。
以上的两个分析是汉化没有源码的DELPHI组件的理论基础,下面开始汉化的具体操作。需要注意的是,如果没有DFM,或者是PAS文件中的英文是无法使用这种方法汉化的。
一、提取库和单元信息
procedure GetPackageInfo(Module: HMODULE; Param: Pointer; var Flags: Integer; InfoProc: TPackageInfoProc);
这个过程是从BPL中提取库和单元信息,然后传递给InfoProc回调函数,这个是整个过程的关键,根据这个过程来提取库和单元信息是下面几个步骤的基础。
Module可以利用LoadPackage来获取库的句柄,注意,在执行完这个过程之后一定要用UnLoadPackage将句柄释放掉。
InfoProc是回调函数,这个过程不是类的方法,而是一般的API。函数的定义如下:
TPackageInfoProc = procedure (const Name: string; NameType: TNameType; Flags: Byte; Param: Pointer);
TNameType = (ntContainsUnit, ntRequiresPackage);
如果NameType = ntContainsUnit的话,那么Name就是单元的名字;如果NameType = ntRequiresPackage的话,那么Name就是库的名字。这里要特别注意的是,使用这个方法提取出来的单元信息包含SysInit,这个单元是系统自动添加的,不需要在DPK中生成。
最后一个步骤,就是根据上面所获取的信息来生成DPK。
二、汉化DFM
这个工作没有什么技术难度,如果不懂英文的话,直接查字典好了。^_^,地球人都知道。
三、重新生成BPL
DPK有了,DFM也汉化了,最后就是直接根据DPK,重新编译,生成BPL和DCP,然后就万事OK了。
我已经使用这个方法汉化了TEECHART的系列组件,如果需要的话,可以发邮件给我,切磋切磋。