自从Delphi2010增强了RTTI反射机制后,编译出来的程序变得更大了,这是因为默认情况下 Delphi2010 给所有类都加上了RTTI信息(呵呵,不管你用不用它,好像实用价值确实不高,至少目前我不会去用的)。虽说对程序的运行速度影响不大,但会增加安装程序的大小,这也是我们不愿看到的。有没有办法禁用RTTI信息,从而减小编译后程序的大小呢?,从文档中我们找到了方法。
一、在工程中用编译指令禁用RTTI
禁用的方法很简单,就是要在工程(dpr文件中。Delphi2010下项目文件是dproj文件,但dpr文件仍然是默认的编写代码的项目文件)的Uses语句前添加下面的定义就可以了:
{ Reduce EXE size by disabling as much of RTTI as possible (delphi 2009/2010) }
{$IF CompilerVersion >= 21.0}
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
{$IFEND}
OK,这样重新编译后你会发现,确实把EXE文件大小减小了,但这还不够,请继续往下看。
二、重建无RTTI信息的VCL/RTL
下面我们进行关键的操作,因为VCL和RTL单元还是带RTTI信息的,我们要把它们的RTTI信息去掉。打开delphi2010新建一个工程,并保存,这里我们为方便讨论,把它保存到c:\nortti目录,在它下面建一子目录delphi2010,完成后目录如下:c:\nortti\delphi2010。
在DPR的uses段中添加所有使用到的VCL/RTL单元,呵呵,这样可能会很乱,所以我把所有单元名放到一个包含文件中去了(.INC文件),引用一下就可以了(注意,这里是所有单元名,真正使用时你只需保留用到的单元名),然后单击project菜单中的options项,编辑Unit output directory项的值为 c:\nortti\delphi2010。编译该项目,如果有错误提示,就删除那些单元引用。(注:当JPEG单元重建时你需要拷贝Source\Win32\vcl\Imaging\JPGImage\obj目录下的文件到你项目的目录),编译完成后关闭项目。
提示:可以用下面这个批处理文件产生上面说的单元列表
@echo off
del unitlist.inc
dir /b "C:\Program Files\Embarcadero\RAD Studio\7.0\source\Win32\vcl\*.pas" >> unitlist.inc
dir /b "C:\Program Files\Embarcadero\RAD Studio\7.0\source\Win32\rtl\win\*.pas" >> unitlist.inc
dir /b "C:\Program Files\Embarcadero\RAD Studio\7.0\source\Win32\rtl\common\*.pas" >> unitlist.inc
rem Manually add some system units (we cannot add the entire dir or problems crop up)
echo SysUtils.pas >> unitlist.inc
echo Types.pas >> unitlist.inc
echo Variants.pas >> unitlist.inc
echo VarUtils.pas >> unitlist.inc
然后打开生成的unitlist.in文件,查找并替换所有的?.pas?为?,?。
呵呵,说了这么多,大家有点晕吧,还好,作者提供了一个项目,http://www.zipplet.co.uk/getfile.php/rttidisable.zip,大家下载下来后,修改一下就可以直接用,记得要修改输出目录哟!
三、在工程中使用新生成的单元
打开delphi2010,修改全局单元查找路径,因为编译器总是按顺序查找单元,我们修改后让它去使用我们重建的单元。
Tool菜单 -> Options 菜单, 浏览 Environment Options -> Delphi Options -> Library - Win32。在Library path最前面添加我们重建单元的完整路径。
这样做后,新建工程就会自动使用我们重建的无RTTI的单元了。最后别忘了在DPR工程中使用编译指令禁用RTTI哟!
各位可以自己比较一下编译后的文件大小,还是很明显的,另外大家还可以用upx、aspack压缩一下,那样EXE就会更小了。
分享到:
相关推荐
Delphi的RTTI机制文档
delphi RTTI功能示例 演示如何在delphi 中使用rtti
Delphi_的RTTI机制浅探
Delphi-的RTTI机制浅探.doc
巧用Delphi 2010 RTTI 管理常量(const)
Delphi7.0 向XML中添加RTTI信息,这个例子挺简单,希望大家喜欢,面向Delphi新手的,高手请绕道哦,下面是本例Delphi向XML中添加RTTI信息的关键性代码: procedure TForm1.ComponentToDOM(iNode: IXmlNode; Comp: ...
个人收集的RTTI机制....好的话就顶
Delphi 2010 Handbook: A Guide to the New Features of Delphi 2010; upgrading from Delphi 2009 (Volume 1) 318 pages Publisher: CreateSpace (February 28, 2010) Language: English ISBN-10: ...
主要涉及了Java的RTTI和反射机制代码分析的相关内容,在介绍运行时类型识别的同时,又向大家展示了其实例以及什么时候会用到反射机制,内容丰富,需要的朋友可以参考下。
Title: Delphi 2010 Handbook: A Guide to the New Features of Delphi 2010 Author: Marco Cantù Length: 318 pages Edition: 1 Revised Language: English Publisher: CreateSpace Independent Publishing ...
例如: Employee := TDatasetProxy(aDataset); 就可以随时随地获取和编辑当前dataset-Fields的数据 edtEmployee.Text := Employee.emp_name.Value; Employee.BeginEdit; Employee.emp_name.Value := edtEmployee....
Delphi通过RTTI实现TdxDBGrid,TDBGrid标题,列宽,显示顺序,字体大小颜色等动态配置
JAVA的反射机制与动态代理运行时类型信息(RunTime Type Information,RTTI)使得你在程序运行时发现和使用类型 信息。RTTI主要用来运行时获取向上转型之后的对象到底是什么具体的类型。
通过delphi的RTTI机制建立类的方法建立rttiinspector属性编辑框,从而自己随心使用
用DELPHI的RTTI实现对象的XML持久化
DELPHI RTTI 探索 RTTI(Run-Time Type Information) 翻译过来的名称是“运行期类型信息”,也就是说可以在运行期获得数据类型或类(class)的信息。
写得很好,用心看 Delphi_的RTTI机制浅探
Delphi 利用RTTI实现的插件管理模块,插件可自动注册。