为什么 DELPHI 编译出的程序一般的来说至少都有300k呢? 我编写了一个 script decoder for window (解码经 microsoft screnc 编码的 script), 本来算法很简单没想到一经编译却大得怕人,这怎么了? (一个初学者) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为有VCL库。只有不用VCL,就很小。。Delphi 5下通过,20K,用Fee Pascel 1.0.4,15K去掉{$R *.res},可以再少1K。program NoVCL;{$R *.res}uses Windows, Messages;function WndProc(Window: HWnd; AMessage,WParam,LParam: Longint): Longint; stdcall;begin Result := 0; if AMessage = WM_Destroy then begin PostQuitMessage(0); Exit; end; Result := DefWindowProc(Window, AMessage, WParam, LParam);end;const ClassName = 'Pascal No Vcl';function WinRegister: Boolean;var WindowClass: TWndClass;begin with WindowClass do begin Style := CS_HRedraw or CS_VRedraw; lpfnWndProc := @WndProc; cbClsExtra := 0; cbWndExtra := 0; hInstance := SysInit.HInstance; HIcon := LoadIcon(0, IDI_Application); hCursor := LoadCursor(0, IDC_Arrow); hbrBackground := HBrush(Color_Window); lpszMenuName := nil; lpszClassName := ClassName; end; Result := RegisterClass(WindowClass) <> 0;end;function WinCreate: HWnd;var HWindow: HWnd;begin HWindow := CreateWindow(ClassName, 'Delphi', WS_OverlappedWindow, 50, 50, 600, 400, 0, 0, HInstance, nil); if HWindow <> 0 then begin ShowWindow(HWindow, CmdShow); UpdateWindow(HWindow); end; Result := HWindow;end;var AMessage: TMsg; HWindow: HWnd;begin if not WinRegister then begin MessageBox(0, 'Register Class Error', 'Delphi', MB_OK); Exit; end; HWindow := WinCreate; if HWindow = 0 then begin MessageBox(0, 'CreateWindowError', 'Delphi', MB_OK or MB_ICONERROR); Exit; end; while GetMessage(AMessage, 0, 0, 0) do begin TranslateMessage(AMessage); DispatchMessage(AMessage); end;end. 其实VCL库已经做的很好了,无论是代码的质量,还是类的体系结构,都是我们学习的典范,对于现在的计算机来说,程序的大小已经不是考虑的重点了,关键还是功能的实现和逻辑的正确性,从速度上来说,我从来没有听人抱怨过Delphi写的程序慢的,再说,要相信Borland做编译器的技术啦。对于一个空白的窗体,Delphi3生成的是170K左右,到了Delphi5 就有280K左右了,一方面编译器里多了很多东西,另一方面VCL库也在不断扩充,如果一定要用VCL,又不是要做COM方面或者三层的数据库,可以考虑用Delphi3来最后编译一遍你的程序。但是3确实不如5好用啊另外,从4开始VCL支持对DockForm的支持,个人认为是个很大的败笔,机会没带来什么好处,还引入了很多问题,代码也多了,程序也大了。以前玩音响的时候,有一句话,叫简洁至上,用在写程序上,也没有错吧 用了VCL当然大了,别用VCL不就小了。就像当初用Pascal一样,写纯粹的语句或者写Console Application再要么将运行包分出来 只要你在uses里不用 Forms这个单元,程序就很小了. 致:BaldZhang(BaldZhang), 你好! 这么快你就给了这么完美的答案我虽然不一定能在短时间内看懂但我会将你的回答下载下来细细揣磨给你扫盲分20。 这是怎么了我想给BaldZhang(BaldZhang) 20分,,,,却给不出去, 难道非要一次性把100分全部给完吗? 我会在今天进行总结如果大家都认为BaldZhang(BaldZhang) 的答案有代表性,那么我只能一次性地全部给BaldZhang(BaldZhang) 同志了,————————————————————————再者,顺便提个小问题,在这里回复时,我用五笔字型打字,总是有这样的问题,即每打到数字, 字母 ,标点符号, 再输入中文前面的非中文字符会自动删除掉,据说这是IE5 的 bug ,到哪里下载此补丁。, 他答的很好了,给他100分吧。其实,只要用到类、函数库,你的程序长度都会增加的。小结: EXE文件长度要想变小,可: 1) 不使用类库函数库(因为这些库通常要带一些必要的工作和数据) 2) 如使用库,则可以用动态链接的方式,但是,最终发行时,就必须带上这些动态库(如Dll, BPL等),总程序大小反而增加。 3) 可使用第三方可执行压缩软件,可大大减小可执行文件大小(约50%以上),如UPX。 4) 可使用数据压缩软件如ZIP,RAR,将程序打包压缩,使文件更小。哪种好,自已掌握吧。其实现在硬盘和CPU都发展到这种程度了(上网速度也快多了),不必太计较程序大小了。这里说一个特例:VC++VC++默认编译方式是使用动态链接库,因此可执行文件变得极小。同时,VC的库,如MFC42.Dll,MFC42D.DLL等文件必须和最终可执行文件一起才能执行,而这些可执行文件好大呀......说它是特例的原因是:安装Windows时,你的系统目录下就已经帮你装了MFC42.dll等MFC的动态库,因此,VC++的程序很幸运的,变得很小,而且不需搭那么大的dll。但是,如果这个VC++的程序要发布出去的话,就必须一定要带这些dll文件,因为你不能保证对方的机器上一定会有这些dll,也更不能保证这些dll版本符全你程序的需要(Windows95,98.SE.ME带的版本就不太一样,还有一种情况是其它程序安装的MFC dll) Muf(沐枫): 你给我了矛塞顿开的感觉, VB, 我比较熟悉它的发行除了自己的文件外(倒是较小) 可是它却非要有它的那个运行库及其它的自己的个性控件也不小了。 要是DELPHI 也有自己的OS就好了那么VC,VB(据说win2000 带vb6运行库)发行时不就也要带自己的运行库了吧. 大小问题的解决不用我们去操心,borland比我们更急 exe 用aspack压缩一下,可以小很多 如果不用VCL那么如何构造form面板呢? 如果不用VCL那么如何构造cool form面板呢?又怎么编写假如说有一个按钮的单击事件呢? 上面已经说得很清楚了!你如果要使用VCL的话,程序至少有300多K不然就别使用VCL! kao!你将option中的packages中的(build with runtime packages)选项选中!程序就大大减少了! 关于程序大的讨论以前已经有过了这里把程序的大都归罪到VCL我不敢恭维所谓的大无非是和VC等MS开发工具比较得来的如果没有VC 你也不会发此感慨BORLAND有个梦就是希望自己的所有开发界面都一样如BCB DELPHI JB而且写出来的东西能运行到所有平台如WINDOWS9X NT LINUX这就要求更多的采用自己的东西独立性更好老兄 你装WINDOWS的时候是不是需要几十分钟干了些什么把Visual Studio家族需要的动态连接等资源都搞进去了这叫近水楼台VC在极大的程度上依赖WINDOWS中在安装的时候就已经拷贝进去的资源所以你这样比较是不公平的浅见发表到这大家继续讨论 介绍个好东东吧,希望写小程序的朋友可以来看一下: KOL库http://mercury.spaceports.com/~bonanzas/kol/index.htm没有压缩之前最小可以达到13.5K,一个连数据库的demo也只有24k常年在这里潜水,也希望和大家共享一下 用kol库(http://mercury.spaceports.com/~bonanzas/kol/index.htm),可使程序非常小,跟纯粹用Api来建窗体相比较,它的工作量相当小。 呵呵,KOL我说过了一次,不过大家好像没有什么兴趣?我也没有兴趣,不过还另外有一个什么类似KOL的控件库.俄罗斯的几个老毛子技术真的不错. to zph(大鼻子情圣)和wxy_2000():老兄能告诉KOL一下怎么用吗?最好能详细一点,先谢谢啦!! VC编译的程序小吗?编译出来至少一百多K,用SDK十几K就可以吧 我希望既要用VCL(因为这样编程容易、方便),又要程序小(这个就不用说为什么了吧,呵呵),还要别带各类库什么的(带上的话程序还是大,象我经常写小软件,那更划不来了)。看来只有一个方法可以解决问题:Borland和Microsoft合作,把delphi要用的库事捆绑到windows里边去,可是,难啊! 用ASPACK压缩一下不就行了吗? 程序的大小,可以让初学者更容易理解VCL 拿DELPHI写的C风格WINDOWS程序,比拿VC写的还小呢. "VC在极大的程度上依赖WINDOWS中在安装的时候就已经拷贝进去的资源"我不同意这种看法。MS在装Windows的时候是可以不装mfcxx.dll的。没有mfcxx.dll,Windows照样能运行。问题是一些Windows自带的一些程序或者附加使用MFC,比如画笔,写字板等等,都是依赖MFC的,所以MFC就这么被装进Windows了。所以MS没有特意要装VS的组件。但是通过这种方式,mfcxx.dll还是被装进去了。我认为问题的关键在于使用不使用dll.使用dll就可以使可执行文件小很多。Borland不用dll,自有他的道理。delphi是一个好工具。现在这个年头,关键在于谁能先把东西做好,至于大小快慢,不必担心。大小问题由Seagate那些公司解决,快慢问题由intel那些公司解决。 大小问题由Seagate那些公司解决,快慢问题由intel那些公司解决。 妙 sqlserver连接断开后如何重置连接 多文档中 子窗体弹出位置偏移问题 Delphi和C#达人进:Delphi的类类型(class of)在C#中如何实现(反射?) 求助关于记录的存储问题 文件查找问题? SQL数据库中设计表字段名用中文可好? 很简单的delphi菜鸟问题 为什么用dbchart连接query正常,但连接adoquery却只有时间和数量两个字段? 会否BUG!关于TQRDBText的折行问题! 我从别处弄来的,看看吧:-) 联接符 ^ 有什么用啊。 急!急!急!关于BMP文件处理的问题(有难度)
用Fee Pascel 1.0.4,15K
去掉{$R *.res},可以再少1K。program NoVCL;{$R *.res}uses
Windows,
Messages;function WndProc(Window: HWnd; AMessage,WParam,LParam: Longint): Longint; stdcall;
begin
Result := 0;
if AMessage = WM_Destroy then
begin
PostQuitMessage(0);
Exit;
end; Result := DefWindowProc(Window, AMessage, WParam, LParam);
end;const
ClassName = 'Pascal No Vcl';function WinRegister: Boolean;
var
WindowClass: TWndClass;
begin
with WindowClass do
begin
Style := CS_HRedraw or CS_VRedraw;
lpfnWndProc := @WndProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := SysInit.HInstance;
HIcon := LoadIcon(0, IDI_Application);
hCursor := LoadCursor(0, IDC_Arrow);
hbrBackground := HBrush(Color_Window);
lpszMenuName := nil;
lpszClassName := ClassName;
end;
Result := RegisterClass(WindowClass) <> 0;
end;function WinCreate: HWnd;
var
HWindow: HWnd;
begin
HWindow := CreateWindow(ClassName, 'Delphi', WS_OverlappedWindow, 50, 50,
600, 400, 0, 0, HInstance, nil);
if HWindow <> 0 then
begin
ShowWindow(HWindow, CmdShow);
UpdateWindow(HWindow);
end;
Result := HWindow;
end;
var
AMessage: TMsg;
HWindow: HWnd;
begin
if not WinRegister then
begin
MessageBox(0, 'Register Class Error', 'Delphi', MB_OK);
Exit;
end; HWindow := WinCreate; if HWindow = 0 then
begin
MessageBox(0, 'CreateWindowError', 'Delphi', MB_OK or MB_ICONERROR);
Exit;
end; while GetMessage(AMessage, 0, 0, 0) do
begin
TranslateMessage(AMessage);
DispatchMessage(AMessage);
end;
end. 其实VCL库已经做的很好了,无论是代码的质量,还是类的体系结构,都是我们学习的典范,
对于现在的计算机来说,程序的大小已经不是考虑的重点了,关键还是功能的实现和逻辑
的正确性,从速度上来说,我从来没有听人抱怨过Delphi写的程序慢的,再说,要相信Borland做编译器的技术啦。对于一个空白的窗体,Delphi3生成的是170K左右,到了Delphi5 就有280K左右了,一方面
编译器里多了很多东西,另一方面VCL库也在不断扩充,如果一定要用VCL,又不是要做COM
方面或者三层的数据库,可以考虑用Delphi3来最后编译一遍你的程序。但是3确实不如5好用啊另外,从4开始VCL支持对DockForm的支持,个人认为是个很大的败笔,机会没带来什么
好处,还引入了很多问题,代码也多了,程序也大了。以前玩音响的时候,有一句话,叫简洁至上,用在写程序上,也没有错吧
就像当初用Pascal一样,写纯粹的语句或者写Console Application
再要么将运行包分出来
这么快你就给了这么完美的答案我虽然不一定能在短时间内看懂但我会将你的回答下载下来细细揣磨给你扫盲分20。
分全部给完吗?
的答案有代表性,
那么我只能一次性地全部给BaldZhang(BaldZhang)
同志了,————————————————————————
再者,
顺便提个小问题,
在这里回复时,
我用五笔字型打字,
总是有这样的问题,
即每打到数字, 字母 ,标点符号, 再输入中文前面的非中文字符会自动删除掉,
据说这是IE5 的 bug ,
到哪里下载此补丁。,
其实,只要用到类、函数库,你的程序长度都会增加的。
小结:
EXE文件长度要想变小,可:
1) 不使用类库函数库(因为这些库通常要带一些必要的工作和数据)
2) 如使用库,则可以用动态链接的方式,但是,最终发行时,就必须带上这些动态库(如Dll, BPL等),总程序大小反而增加。
3) 可使用第三方可执行压缩软件,可大大减小可执行文件大小(约50%以上),如UPX。
4) 可使用数据压缩软件如ZIP,RAR,将程序打包压缩,使文件更小。
哪种好,自已掌握吧。
其实现在硬盘和CPU都发展到这种程度了(上网速度也快多了),不必太计较程序大小了。这里说一个特例:VC++
VC++默认编译方式是使用动态链接库,因此可执行文件变得极小。同时,VC的库,如MFC42.Dll,MFC42D.DLL等文件必须和最终可执行文件一起才能执行,而这些可执行文件好大呀......
说它是特例的原因是:安装Windows时,你的系统目录下就已经帮你装了MFC42.dll等MFC的动态库,因此,VC++的程序很幸运的,变得很小,而且不需搭那么大的dll。
但是,如果这个VC++的程序要发布出去的话,就必须一定要带这些dll文件,因为你不能保证对方的机器上一定会有这些dll,也更不能保证这些dll版本符全你程序的需要(Windows95,98.SE.ME带的版本就不太一样,还有一种情况是其它程序安装的MFC dll)
你给我了矛塞顿开的感觉,
VB, 我比较熟悉它的发行除了自己的文件外(倒是较小)
可是它却非要有它的那个运行库及其它的自己的个性控件也不小了。
要是DELPHI
也有自己的OS就好了那么VC,VB(据说win2000 带vb6运行库)发行时不就也要带自己的运行库了吧.
你如果要使用VCL的话,程序至少有300多K
不然就别使用VCL!
你将option中的packages中的
(build with runtime packages)选项选中!
程序就大大减少了!
http://mercury.spaceports.com/~bonanzas/kol/index.htm
没有压缩之前最小可以达到13.5K,一个连数据库的demo也只有24k
常年在这里潜水,也希望和大家共享一下
什么的(带上的话程序还是大,象我经常写小软件,那更划不来了)。
看来只有一个方法可以解决问题:Borland和Microsoft合作,把delphi要用的库事捆绑到windows里边去,可是,难啊!
可以让初学者更容易理解VCL
我不同意这种看法。
MS在装Windows的时候是可以不装mfcxx.dll的。没有mfcxx.dll,Windows照样能运行。问题是一些Windows自带的一些程序或者附加使用MFC,比如画笔,写字板等等,都是依赖MFC的,所以MFC就这么被装进Windows了。所以MS没有特意要装VS的组件。但是通过这种方式,mfcxx.dll还是被装进去了。
我认为问题的关键在于使用不使用dll.使用dll就可以使可执行文件小很多。Borland不用dll,自有他的道理。delphi是一个好工具。现在这个年头,关键在于谁能先把东西做好,至于大小快慢,不必担心。大小问题由Seagate那些公司解决,快慢问题由intel那些公司解决。
妙