Delphi做的Exe文件真可以这么小吗?那如何发布程序?(100分)

  • 主题发起人 主题发起人 北京男人
  • 开始时间 开始时间

北京男人

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi做的Exe文件真可以这么小吗?那如何发布程序?[:D]
-----
问题一:
-----
平时发布程序我就直接发布,一个工程创建直接运行默认200-300k那么大,不过今天发现在Delphi菜单的
project/Options/Packages/Runtime packages下的
Build with runtime packages
这里,如果选择这个CheckBox并编译程序的话程序才只有13K,不过我不理解既然是Build with??那么Exe文件必然要比原先的大才对,怎么
才13K呢?那么发布这样的程序的话是不是和Vcl50.dcp;Vclx50.dcp...这些运行期包一起打包发布呢?如何发布呀?
看来我对Design time package 和 Runtime package的理解还不够深刻,我是这样想的,Delphi的组件包默认是Desintime and runtime,所
以Exe文件生成后因为包含运行期设计期两个包,所以文件很大,如果选择了Build with runtime packages这个选项那么只和运行期包编译而
不再管设计期包,所以Exe文件变小多了,完全和C++,C#媲美了,对吗?
而Delphi6开始就严格将Design time package 和 Runtime package区分来设计成两个单独的包,以防止代码膨胀,这是Borland 程序员Jeff
Overcash提出的想法,也引起了是Delphi5的组件升级成Delphi6时候出现的“Proxies.pas not found”、“DsgnIntf.dcu not found”等问题

大家说我说的对吗?这是我个人的理解,请大家多多指教!:)
-----
问题二
-----
我Delphi5下做的以下组件无法在Delphi6下使用,就是编译时属性编辑器出错,放到设计期运行期包都不合适,请问如何修改?只要实现一
个About属性即可。
{-----------------------------------------}
{功能:能包容其他组件的进度条控件 }
{-----------------------------------------}
unit tzStatusBar;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls,
{$IFDEF VER130} //D5
DsgnIntf
{$ENDIF}
{$IFDEF VER140} //D6
DesignIntf, DesignEditors, VCLEditors
{$ENDIF}
{$IFDEF VER150} //D7
DesignIntf, DesignEditors, VCLEditors
{$ENDIF}
;
type
{属性编辑器类}
TAboutProperty = Class(TPropertyEditor)
public
procedure Edit;
override;
function GetAttributes: TPropertyAttributes;
override;
function GetValue: string;
override;
end;

{进度条类}
TtzStatusBar = class(TStatusBar)
private
{ Private declarations }
FAbout: TAboutProperty;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent);
override;
published
{ Published declarations }
property About: TAboutProperty read FAbout;
end;

procedure Register;
implementation
procedure Register;
begin
RegisterComponents('TZhuang', [TtzStatusBar]);
RegisterPropertyEditor(TypeInfo(TAboutProperty), TtzStatusBar, 'About', TAboutProperty);
end;

{ TtzStatusBar }
constructor TtzStatusBar.Create(AOwner: TComponent);
begin
inherited create(AOwner);
ControlStyle:= ControlStyle + [csAcceptsControls];
end;

{ TAbout }
procedure TAboutProperty.Edit;
begin
//双击时干什么?
Application.MessageBox('TtzStatusBar,FreeWare,Enjoy.:)'#13#10 +
'E-mail: tzdgg@163.net','About TtzStatusBar',MB_OK + MB_ICONINFORMATION);
end;

function TAboutProperty.GetAttributes: TPropertyAttributes;
begin
Result:= [paDialog,paReadOnly];
{ _____|
|
//双击属性弹出一个窗口}
end;

function TAboutProperty.GetValue: string;
begin
Result:= '(About...)';
end;

end.
 
虽然那样后,执行文件是小了,但你可以试一下,将这个13K的文件拿到一台没有装过delphi的机子上去运行一下看,它就会提示你缺少Vcl50.bpl。。。什么之类的,也就是说
Build with runtime packages后,你必需要另外将上述这些东西和你的13K文件一起打包到别的机子上,你的程序才能正常运行
 
app2001说的没错。
 
说的没错,你将13k的exe放在没有装过delphi的机器上运行一下就知道了。
 
那我如何知道我需要打包哪些bpl呢?
 
Build with runtime packages后,生成的exe需要的文件为Build with runtime packages下方文本框中内容
 
如果使用连接进行包的话,表面上程序很小,其实内部连接了VCL。DPL等连接包,就象表面看上去VC做的程序很小,其实它使用了内部的MFC32。DLL。这样
VC。应用程序+MFC32。DLL
DELPHI。应用程序+VCL。BPL没有什么区别。
,,,所以我感觉还是要连接的好,起码你的程序不需要安装。
 
Build with runtime packages 的真正含义是使用动态链接方式来编译程序,
那么程序发布时必须同时提供所需要的bpl文件,
程序变小了,肯定是把其他的代码放到别的地方了,
否则,简直是不可思议了
 
那我如何知道我需要打包哪些bpl呢?
最简单的方法:
将系统目录的*.bpl文件全部移动到另外一个目录中, 然后运行你的程序, 它提示
缺少XXX.bpl,你就把这个文件的名称记录下来, 然后把这个文件移回去, 然后又
提示缺少另一个bpl, 再记录, 再移回去………………如此反复
(哦,差点忘了, borland/delphix/project/bpl目录里的bpl文件, 也就是你自己安装
的组件,也要一并移走,否则这些东西就不报告了。完事后,记得把所有文件复位,否则
你的delphi就要罢工了。:) )
虽然麻烦些, 但比较准确。 呵呵。
要写小执行程序, 还可以用类似VC++的办法, 在工程文件中把Form.pas单元的引用去掉
然后自己用Createwindow()这样的API函数创建窗体和组件, 自己写消息循环机制,以及
回调机制, 如此写法,和VC++相差无几。
问题二嘛, 先测试一下再说 :)
 
小是小,但是要带一堆bpl才能运行,呵呵 [:D]
 
我选中Build with runtime packages编译后程序果然变小到14K了,高兴死了,但是运行后要VCL50.bpl等很多,但是光一个VCL50.bpl就有1.9M那么大!难道Build with runtime packages是个骗局吗?因为如果不选择Build with runtime packages程序才300K!
 
这个问题应该分开来看:
不用Build with runtime packages固然可以只发布一个程序不用其它的一些BPL文件,但如果你发布的是数个用DELPHI开发的程序所组成的系统时可能你的想法就不一样了。首先你编写的每一个程序编译好后都在1-2M之间,发布这些东西和使用Build with runtime packages后生成的300-400K之间的文件哪一个好呢?而且以后每次更新都只需更新几百K的文件不是很好吗?对于编写的程序需要哪些BPL文件可以从project菜单中的information for 中查到。将这些文件拷到新机器的SYSTEM目录中就可以了或者将这些文件和你的程序放到同一目录中也行。
 
ASPack压缩就好了
 
如果你不想编译出带一大堆bpl支持的程序, 又不忍心程序大, 有这么几种类做法:
1、正如楼上说的, 编译出一个大程序后, 用AsPack、UPX压缩, 既使程序变小了, 又
加了个壳, 使Cracker破解你的程序时增加了麻烦, 他首先要脱壳。
2、在工程文件里把Forms那些单元引用去掉, 并且在其他单元中不引用borland提供的
现成单元, 自己象VC++那样用API来创建窗体、组件、全部由你自己完成。要是你能
达到这个程度, 你的VC++就应该没问题了。
3、思索中.... :)
 
你误解了Build with runtime packages的意思。
这句话的关键在于runtime!!runtime packages指的是动态连接包。也就是不需要连接到你的程序文件中的程序。
这句话的确是很容易让人误解。
 
连接就是不打包
调用的是 VCL组件
当然很小我还有一个1KB的程序
 
用ASPACK壓一下就好了
 
楼主,不是骗局,如果你在发布很多应用程序的情况下是很管用的。
 
Build with runtime packagesdu对于运行多个Delphi写的程序时速度提升和资源减少
就好像:
使用一个窗体编译后是300多K
使用多个窗体编译后是???多K
 
后退
顶部