减小Delphi可执行文件的大小,非高手莫入(200分)

  • 主题发起人 主题发起人 yayongm
  • 开始时间 开始时间
我想不会是技术上的问题,都说BORLAND的工程师是最优秀的,编译器是最优化的,总不会连这点问题都不能解决吧
我还是同意上面几位说的是runtime packages的问题,把M$的所需得所有文件加起来,并不比DELPHI的小,所以楼主就
没有必要再想什么了(当然,如果只为研究一下那也是不错的)
 
你这是没事找事做。
只要你用VCL,你的执行档就得大些,当然你就省事些。
像你说的动态创建窗口或控件,你得出的EXE与你放控件在DFM上产生的EXE差不多,因为你
同样use了VCL库。这说明你在这方面还没理解透。
而你说写一个转换程序之类的,aspack不是很好了吗?她一般可以将delphi的exe压缩一半
以上。
如果你嫌生成的exe太多,你可以压缩一下,如果你还嫌大,你可以用bpl动态装载的方法将
exe缩到最小,但你的bpl多了,加起来只会比单一一个exe大得多,还是不划算。
所以,还是好好看下书,等你理解透了再说。
 
你可以把单元文件里USES包括的那些DELPHI单元打开看一看它共包含多少行代码就一目了然了,
,你只需做一个FORM试试,呵呵。
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
单元文件 代码行数
-------------------------------
Windows, 30527
Messages, 1801
SysUtils, 7361
Classes, 8363
Graphics, 6752
Controls, 9956
Forms, 7306
Dialogs; 1852
合计::::??????
你现在明白为什么一个空FORM出来也要大几百K了吧?
也有很多朋友给你讲了开发过程中如何控制代码长度,如共用单位等;
也有人给你说了少用DELPHI单元,多用SDK;
这些都是有效的方法,一个用API写出来的单窗口程序就只有十多K。
那写法,如果你用过VC你就会明白只是用PASCAL语言代替C++写语言在写程序。
 
学习,关注!
 
use的单元如果没有用到其中的任何函数和对象,那么它
并不会包含到最终的执行文件中,现在只要是象样一点的编译器都支持这种优化。
Delphi程序大的一个主要原因是VCL是一个类库,其中大量使用了虚拟方法和动态方法,
因为编译器在编译程序的时候无法决定到底那些会被用到,所以必须将所有虚拟方法
的相关代码连接到文件里面,造成文件庞大(这也是几乎所有类库的通病)。
 
大家不能凭空想当然
我的一个程序原来4.3M,我将一些没用的单元从uses去掉后,是3.95M。
这是事实,我用的是delphi4,delphi6不知道怎样
 
要减小可执行文件大小,与dfm无关的。与uses到的单元有关!
要减小可执行文件大小!如下:
1,使用api来编程啊!
2,在uses中少用一些控件类,如dialogs等。
2,使用delphi6来编绎。
3,要使用资源,加{ $r xxx.res}
现在,附上一个程序,猜猜看,它要多少K?注意,把它拷贝下来,
保存为project3.dpr 文件,再用D6来编绎,如果用D5来编绎,可
执行文件可就要达到16K!
如果你给它的uses加上个dialogs,然后
再加上一行showmessage('ok'),再来看看,可执行文件达到多少?
几百K的!这时,照样没有DFM,可见,文件大小不在于有没有DFM,而
在于 uses中的一些单元!
program Project3 ;
uses
windows,
messages,
sysutils,
shellapi;
var cls :twndclass;
wnd:hwnd;
msg:tmsg;
procedure dummywindowproc(hwnd:hwnd;msg,
wparam:dword;lparam:longint);stdcall;
begin
if msg=wm_destroy then postquitmessage(0);
if msg=wm_lbuttondown then postquitmessage(0);
defwindowproc(hwnd,msg,wparam,lparam);
end;
begin
FillChar (cls, sizeof (cls), 0);
with cls do begin
lpfnWndProc := @DummyWindowProc;
hInstance := hInstance;
lpszClassName :='AppName';
hbrBackground :=19;
style :=cs_hredraw or cs_vredraw;
hcursor:=loadcursor(0,idc_arrow);
end;
RegisterClass (cls);
Wnd := CreateWindow (cls.lpszClassName ,' AppName',
ws_OverlappedWindow,
100,100,300,300,
0, 0, hInstance, Nil);
showwindow(wnd,cmdshow);
while getmessage(msg,0,0,0) do
begin
translatemessage(msg);
dispatchmessage(msg);
end;
end.
 
呵呵,对不起!有点儿我勿忙。。。
以上文件中,要把sysutils,shellapi去掉,这样就可以更小啦!
祝你成功!
 
除非你全用api来创建窗口,
否则,你即使都是手动创建TForm,就可以让你的程序达到300k以上。

 
大家也太大方了,为了一点存储空间花掉大量的时间。
我太小气了。
 
什么?——“如果有人转载,请标明作者Email:yayongm@sohu.com”????
在回调中首先...,从此你爱怎样就怎样了,
而且和 Delphi 经典的档案样子几乎一样。
 
搞不好会在别的机器上不能运行
 
现在机器配置这么好了,还担心文件变大?没事找事哦
 
我想现在文件大小并不是什么问题,而主要的应该考虑系统资源的利用。这才是做实际的!
 
靠,浪费时间。
大的才拿的出手,卖的出钱啊。
小程序留着自己用吧。
 
我看还是C++最好
特别是商业软件既小又快
你看东方快车和金山就是一个典型的例子
虽然东方的准确但我从来不用它

用DEPHI 纯API的话那更加不如C++了
 
如果都把程序写那么小:P4处理器、硬盘内存那不是没人买????
 
做个动态库不就得了
 
有人说,最酷的程序员用KOL,我感到震惊。KOL是对DELPHI的系统改造,它以瘦身程序而著称。
我实验了一下,用DELPHI3编译一个空白的FORM程序,有187K,用DELPHI4有235K,用DELPHI5则为287K!一个小小的程序竟有这么大的体积,真让人吃不消。如果做一个长驻内存的程序,那怎么行!
于是,我在寻找。既要编程的“可视”性,又要体积小,找了半天,几个网友(特别是孤岛的提醒)说,最酷的程序员用KOL!是吗?于是,在一个寂静的午夜,我找到了KOL11.53版,他的老家是http://bonanzas.rinet.ru/
我下载了kol.zip,mck.zip,systemdcu.zip for D5
经过安装与摸索,终于有了深刻的体验!
安装时,把kol.pas放到mck目录下,然后设置好路径,选MirrorKOLPackage.dpk安装,安装成功后控件板上出现KOL标签,共计有39个控件。然后做实验:
1,在FORM窗体上放一个KOLProject1 和KOLForm1,分别对两个控件进行设置,FORM1不要去管它,此时它虽然可视,但是已经成为空壳!
编译,执行程序,一个空白的FORM出现。体积只有24.5k!
再用UPX压缩减肥,结果只有14.5k!(如果用正常的D5的FORM空白页做程序,则有283K,压缩后起码也有121K)
成功了,这正是我梦寐以求的体积!只有14.5K!
我又做了几个实验:数据如下:
2个FORM:28.5k UPX后是17K
一个FORM+托盘+菜单:31.5k,UPX后是18.5k
一般地说,DELPHI 5环境下的瘦身KOL程序经过UPX后,还可以有1.7倍的压缩率。
 
后退
顶部