进来讨论一下缩小Delphi 编译出来的exe体积

爱蹄子的羊头 2012-10-16 11:46:17
我有3个程序,
1个 exe 360K
1个 dll 220K
1个 ocx 500K

一共是 1080K, 用InnoSetup制作成安装包后大概600多KB


当我 Build with runtime package 勾上以后编译

exe 16K
dll 40K
ocx 55K

但是 这样发布就必须要带 bpl

vcl70.bpl 1300K
rtl70.bpl 700K

一共是2000多KB ,用InnoSetup 压缩后是 1100KB


重新编译 vcl70.bpl (1100KB) 和 rtl70.bpl(450KB)

这样压缩后的大小 还是有900KB 仍然比原先的大

为什么 外带bpl 比自带bpl 体积还要大? 不科学啊.
有什么办法可以再缩小点体积?
...全文
643 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhoo163 2012-10-18
  • 打赏
  • 举报
回复
exe 文件大小,已不是程序的问题。关键的程序可靠性如何。
hsfzxjy 2012-10-18
  • 打赏
  • 举报
回复
先考虑程序健壮性吧。。
kaikai_kk 2012-10-17
  • 打赏
  • 举报
回复
别太纠结体积

想一想几年前一个大型的网络游戏可能就300M左右
现在呢,基本都是2G以上
haitao 2012-10-17
  • 打赏
  • 举报
回复
dll 要给其他的 exe 使用...
但是这个exe可以静态编译进去,如果对大小要求这么高
爱蹄子的羊头 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

想体积小的话,用Kol库吧
[/Quote]

我这几乎没有界面了, 而且 KOL 有些地方不能满足我.

[Quote=引用 13 楼 的回复:]

预感lz会被 硬盘不值钱党 喷的体无完肤
[/Quote]

上头要求的..


[Quote=引用 15 楼 的回复:]

引用 14 楼 的回复:
别太纠结体积

想一想几年前一个大型的网络游戏可能就300M左右
现在呢,基本都是2G以上

+1
电脑内存都2G了。
[/Quote]


现在游戏体积虽然大, 但是要吸引玩家进来玩, 很多采取微端策略. 第一个包一定要小.


光速登陆器下载..... 行业标准都不能超过1MB
爱蹄子的羊头 2012-10-17
  • 打赏
  • 举报
回复

[Quote=引用 6 楼 的回复:]

把3个文件编译为一个exe,最后应该能小于1M。。。。。
[/Quote]

这三个 一个是 exe 一个是dll 一个是 ocx......

[Quote=引用 7 楼 的回复:]

用SDK写,别用第三方控件。
[/Quote]

几乎都是系统API 了, exe 用了 form, dll 用了 xml ocx 几乎就是最简的了

[Quote=引用 8 楼 的回复:]

起码exe和dll可以合并吧。
[/Quote]


dll 要给其他的 exe 使用...
babydog01 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
别太纠结体积

想一想几年前一个大型的网络游戏可能就300M左右
现在呢,基本都是2G以上
[/Quote]
+1
电脑内存都2G了。
爱蹄子的羊头 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

缩小体积只有两个途径:
1. 把与程序无关的代码剥离,比如你需要一个函数f在一个单元u中,单元u中还有很多其他函数,但是你用不着,这时,你把f函数直接抽离出来。不要引用u
2.加壳压缩,如aspack
[/Quote]

1, 刚才试验了下. 确实少了一点空间. 不过有点坑的是 工作量有点大.

刚把 URLMON 的 URLDOWNLOADFILE 拆了出来 弄了一堆代码, 才一个函数..




unit xURLDOWNLOAD;

{为了拆一个函数得用这么多...}
interface
uses Windows ;

type

PDVTargetDevice = ^TDVTargetDevice;
tagDVTARGETDEVICE = record
tdSize: Longint;
tdDriverNameOffset: Word;
tdDeviceNameOffset: Word;
tdPortNameOffset: Word;
tdExtDevmodeOffset: Word;
tdData: record end;
end;
TDVTargetDevice = tagDVTARGETDEVICE;

PClipFormat = ^TClipFormat;
TClipFormat = Word;


PFormatEtc = ^TFormatEtc;
tagFORMATETC = record
cfFormat: TClipFormat;
ptd: PDVTargetDevice;
dwAspect: Longint;
lindex: Longint;
tymed: Longint;
end;
TFormatEtc = tagFORMATETC;

POleStr = PWideChar;
PGUID = ^TGUID;
TGUID = packed record
D1: LongWord;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
end;
TCLSID = TGUID;

PStgMedium = ^TStgMedium;
{$EXTERNALSYM tagSTGMEDIUM}
tagSTGMEDIUM = record
tymed: Longint;
case Integer of
0: (hBitmap: HBitmap; unkForRelease: Pointer{IUnknown});
1: (hMetaFilePict: THandle);
2: (hEnhMetaFile: THandle);
3: (hGlobal: HGlobal);
4: (lpszFileName: POleStr);
5: (stm: Pointer{IStream});
6: (stg: Pointer{IStorage});
end;
TStgMedium = tagSTGMEDIUM;


PBindInfo = ^TBindInfo;
_tagBINDINFO = packed record
cbSize: ULONG;
szExtraInfo: LPWSTR;
stgmedData: TStgMedium;
grfBindInfoF: DWORD;
dwBindVerb: DWORD;
szCustomVerb: LPWSTR;
cbstgmedData: DWORD;
dwOptions: DWORD;
dwOptionsFlags: DWORD;
dwCodePage: DWORD;
securityAttributes: TSecurityAttributes;
iid: TGUID;
pUnk: IUnknown;
dwReserved: DWORD;
end;
TBindInfo = _tagBINDINFO;
IBinding = interface
['{79eac9c0-baf9-11ce-8c82-00aa004ba90b}']
function Abort: HResult; stdcall;
function Suspend: HResult; stdcall;
function Resume: HResult; stdcall;
function SetPriority(nPriority: Longint): HResult; stdcall;
function GetPriority(out nPriority: Longint): HResult; stdcall;
function GetBindResult(out clsidProtocol: TCLSID; out dwResult: DWORD;
out szResult: POLEStr; dwReserved: DWORD): HResult; stdcall;
end;

IBindStatusCallback = interface
['{79eac9c1-baf9-11ce-8c82-00aa004ba90b}']
function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
function GetPriority(out nPriority): HResult; stdcall;
function OnLowResource(reserved: DWORD): HResult; stdcall;
function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
szStatusText: LPCWSTR): HResult; stdcall;
function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;
stgmed: PStgMedium): HResult; stdcall;
function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
end;

function URLDownloadToFile(Caller: IUnknown; URL: PChar; FileName: PChar; Reserved: DWORD; StatusCB: IBindStatusCallback): HResult; stdcall;
function wwDownLoad(URL: PChar ;Filename: PChar) : Boolean;
implementation
function URLDownloadToFile;external 'URLMON.DLL' name 'URLDownloadToFileA';
function wwDownLoad(URL: Pchar ;Filename: Pchar) :Boolean;
begin
Result := (UrlDownloadToFile(nil, PChar(URL), PChar(Filename), 0, nil) = 0);
end;
end.

爱蹄子的羊头 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]

引用 20 楼 的回复:
引用 19 楼 的回复:

那dll也能放进exe啊,把dll的输出表放进exe里不就行了



哦?没听说过? 愿闻其详

把EXE 当做动态链接库用么?


把dll作为为exe的资源编译进去(可见于万一博客中关于资源文件的那几篇),exe运行后先把资源抽出来另存为dll文件,然后加载dll.或者直接加载内存中的Dll(网上有代码)
[/Quote]

那样其实还是2个文件的大小 进exe的 dll 其实自带vcl了..
「已注销」 2012-10-17
  • 打赏
  • 举报
回复
缩小体积只有两个途径:
1. 把与程序无关的代码剥离,比如你需要一个函数f在一个单元u中,单元u中还有很多其他函数,但是你用不着,这时,你把f函数直接抽离出来。不要引用u
2.加壳压缩,如aspack
「已注销」 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]
引用 19 楼 的回复:

那dll也能放进exe啊,把dll的输出表放进exe里不就行了



哦?没听说过? 愿闻其详

把EXE 当做动态链接库用么?
[/Quote]

把dll作为为exe的资源编译进去(可见于万一博客中关于资源文件的那几篇),exe运行后先把资源抽出来另存为dll文件,然后加载dll.或者直接加载内存中的Dll(网上有代码)
爱蹄子的羊头 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

那dll也能放进exe啊,把dll的输出表放进exe里不就行了
[/Quote]


哦?没听说过? 愿闻其详

把EXE 当做动态链接库用么?
hsfzxjy 2012-10-17
  • 打赏
  • 举报
回复
那dll也能放进exe啊,把dll的输出表放进exe里不就行了
haitao 2012-10-16
  • 打赏
  • 举报
回复
如果exe/dll更多时,Build with runtime package才合算

一般还是aspack/lzexe等exe压缩工具处理一下好了
pathletboy 2012-10-16
  • 打赏
  • 举报
回复
所谓“自带BPL”其实不是把整个BPL塞进去,是需要的函数编译进去,自然就比带完整的BPL小的多,体积的话没啥好办法,其实VC++编译出来的也很大,只不过因为VC++的运行时库WINDOWS已经带上了,所以感觉小。
coolspac 2012-10-16
  • 打赏
  • 举报
回复
预感lz会被 硬盘不值钱党 喷的体无完肤
seagull327 2012-10-16
  • 打赏
  • 举报
回复
想体积小的话,用Kol库吧
xiaocongzhi 2012-10-16
  • 打赏
  • 举报
回复
三个编译成一个exe
fox600123 2012-10-16
  • 打赏
  • 举报
回复
aspack,能缩小很多。
hsfzxjy 2012-10-16
  • 打赏
  • 举报
回复
科学地减少文件个数
加载更多回复(6)

830

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧