如何汉化没有源码的DELPHI组件

http://www.romandion.com/Program/program002.htm

在DELPHI中,许多组件都是以BPL、DCP的形式出现的。某些优秀的组件,特别是国外一些优秀的组件,出于版权的考虑,没有提供DPK和 PAS的源码,而仅仅有BPL、DCP、DCU、DFM等二进制形式提供。出于业务的需要,有时候需要将组件直接呈现给用户,但是英文版的组件直接提供给 用户,那么很郁闷的事情,因此将其翻译成中文是很有必要的。下面要讨论的就是如何在只有二进制文件的情况下,将英文组件翻译成中文。

      实际上,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的系列组件,如果需要的话,可以发邮件给我,切磋切磋。

你可能感兴趣的:(如何汉化没有源码的DELPHI组件)