减小Delphi2010程序的尺寸(关闭RTTI反射机制)

转载 2012年03月30日 01:09:01
自从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就会更小了。

相关文章推荐

关闭RTTI反射机制,减小Delphi2010程序的尺寸

关闭RTTI反射机制,减小Delphi2010程序的尺寸
  • shuaihj
  • shuaihj
  • 2011年01月09日 20:45
  • 3554

减小Delphi2010程序的尺寸(关闭RTTI反射机制)

====================================================== 注:本文源代码点此下载 =============================...

关闭RTTI,减小Delphi2010程序的尺寸

自从Delphi2010增强了RTTI反射机制后,编译出来的程序变得更大了,这是因为默认情况下 Delphi2010 给所有类都加上了RTTI信息(呵呵,不管你用不用它,好像实用价值确实不高,至少目前...
  • nhconch
  • nhconch
  • 2013年04月16日 14:17
  • 1743

Thinking in Java RTTI和反射机制

意义 编程思想中的解释:运行时类型信息使得你可以在程序运行时发现和使用类型信息。并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程),这就是R...

java的RTTI与反射机制的区别和联系

近来学三大框架,因此学了反射和动态代理,这篇来回头想一想关于反射Reflection。   为什么会有反射? 假如你在程序运行过程中,从磁盘上或者从网络上读取接收了一串代表一个类的字节,既然这个...

JAVA中的向下转型(downcasting)及泛型与向上转型(upcasting)及RTTI、反射机制

JAVA中的向下转型(downcasting)及泛型与向上转型(upcasting)及RTTI、反射机制   向上转型(upcasting):对象可以作为它本身的类型使用也可以作为它父类(基类)对...

Java RTTI和反射机制

转自:http://www.cnblogs.com/zhguang/p/3091378.html 目录 前言传统的RTTI反射反射的实现方式反射的性能反射与设计模式 前言 ...

ABAP RTTI(Run Time Type Identification)介绍与反射机制

RTTI运行时类型识别 即Run Time Type Identification的简称,是ABAP OO中引入的概念。它可以应用于所有的ABAP类型,所以DESCRIBE FIELD,DESCR...

Java:RTTI与反射机制的一些概念

以下内容大部分取于《Java编程思想第四版》RTTI简介RTTI(Run-Time Type Information),运行时类型信息使得你可以在程序运行时发现和使用类型信息。主要有两种方式: 传统的...
  • leelit
  • leelit
  • 2015年04月27日 20:14
  • 487

Delphi的RTTI机制文档

  • 2004年05月13日 00:00
  • 155KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:减小Delphi2010程序的尺寸(关闭RTTI反射机制)
举报原因:
原因补充:

(最多只允许输入30个字)