进来讨论一下缩小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 体积还要大? 不科学啊.
有什么办法可以再缩小点体积?
...全文
610 26 打赏 收藏 转发到动态 举报
写回复
用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)
DRAT 2010 V4.3 正式版 Build 1220(已完美脱壳) 编译环境:Vista+Delphi7 使用环境:Win2K\WinXp\Win2003\Vista\Win2008\Window7 1.系统信息:可以查看操作系统版本、Cpu类型、内存信息、杀毒软件、防火墙、检测辅助(虚拟机、360安全卫士等)、硬盘大小等 2.文件管理:文件浏览、上传、下载、删除、运行 目录创建和删除。 3.屏幕控制:可以查看对方屏幕,鼠标控制,键盘控制 4.视频捕捉:可以捕获对方的视频摄像头影像 5.超级终端:也就是telnet命令执行 6.进程管理:可以查看对方进程,并可以终止进程。 7.插件管理:可以加载自定义插件扩展功能。 服务端体积:44.5 KB(压缩) 97.5 KB(无压缩) 启动方式简要说明 1.Active启动 第一次安装:360安全卫士无提示,即时上线 更新安装:文件及时替换完成 不重复上线 2.新建服务: 第一次安装:360安全卫士有提示,即时上线 更新安装:文件及时替换完成 不上线(防止重复上线发生) 插件使用及插件相关参数说明: HTTP.dll Http插件 0.1 By New4[D.S.T] 开放端口:5555 Socks4.dll Socks4插件 0.1 By New4[D.S.T] 开放端口:8080 Open3389.dll Open3389插件 0.1 By New4[D.S.T] 开放端口:3389(或原来的端口) UnSRAT.dll UnSRAT插件 0.1 By New4[D.S.T] 加载后自动清理,成功后生成日志log.txt 插件添加后:%SystemRoot%\System32\DRAT 为插件存放目录,如需可手动上传即可。 DRAT.exe 主程序文件校验: MD5: F543BDCB5282307AA37DAEDA72A16002 SHA1: 194ECC0483AA17FB7AFF6BF437FE02560ED1A63D CRC32: 666CDFD5 Server.dat 服务端文件校验:(如果发现MD5有问题请不要使用) MD5: 4CFC55CD6FAEAB3E4ACE1FD80F63A5E9 SHA1: 7EBCED74F6F5C421E9EDBA0DFD5AC2B1D7ECAAFF CRC32: 0C79CD0D 更新日志: V3.3 更换网络核心组件到Indy10 修正屏幕监控无法停止的错误 修正屏幕控制停止后连接未断开的错误 修正键盘输入时回车符导致客户端掉线 键盘输入不兼容旧版 修正GB内存的错误显示问题 修正客户端在注销状态无法控制的错误 增加发送Ctrl+Alt+Del键功能用于远程登录(只支持服务启动) 支持多选文件下载(暂时还不稳定) V3.4 修正异常掉线导致控制端崩溃的Bug 重写并优化屏幕控制部分代码 修正主机下线日志不显示及统计不正常的bug 重写插件管理接口代码 配置服务端可自选保存路径 修正文件传输被控端异常断开导致控制端内存占用过高的bug 修正文件传输控制端异常断开导致被控端出错的bug V3.5 修正Active Setup启动不稳定的bug 重写被控端网络连接逻辑判断 修正控制端关闭时导致掉机的bug 由于屏幕算法原因暂时不支持远程登录暂时删除 V3.6 屏幕监控增加捕获层功能(完美屏幕查看) 屏幕监控增加全屏模式(按F12键) 屏幕监控增加剪切板功能(尚有bug) 获取外网IP函数改写(不会出现程序打不开的bug) 修正一个http上线可能导致暂时性掉鸡的bug 支持远程登录修复发送Ctrl+Alt+Del键功能用于远程登录(只支持服务启动) V3.7 优化远程信息获取部分代码 通信协议修改不兼容旧版 修正一个上线可能存在的bug 重写视频功能速度有所提升 被控端掉线检测功能修复 在次修正Active Setup启动不稳定的bug 配置服务端默认.exe后缀 异常掉线容错次数设置为5次 V3.8 修正无视频点击视频设备主机掉线的bug 文件传输代码更换回DRAT3.2版 使用最新的系统判断函数(支持显示Vista\2008) 重新开启皮肤渲染效果(并提供56款皮肤更换,可到主页下载) 修改服务端和客户端掉线检测机制 V3.9 重写文件传输现在更加稳定 文件续传功能仅支持下载续传 文件传输功能支持Bit位传输 修正掉线检测的一个逻辑错误 新版修改协议不兼容旧版 V4.0 兼容Windows7 RTM版(由于注入原因暂时还不支持屏幕监控) 屏蔽了Active启动状态下发送Ctrl+Alt+Del键功能的错误 修正一个Active启动状态重复上线的问题 关闭窗口时如果出现关闭困难或者跳至主窗口请关闭皮肤功能 修正控制端心跳包检测 时间为60秒 修正被控端心跳包检测错误导致上下线 修复下线气泡提示的Bug 增加服务端配置信息保存项 修正设置皮肤导致读取其他配置的逻辑错误 修正摄像头MPEG录像功能并启用 修正屏幕传输掉线时出现的无法关闭窗口的错误(Error #10054) 修正大量主机掉线时可能会导致程序停止响应并出现内存错误 由于indy10线程池问题将网络组件换回indy9 插件管理功能移至控制中心 增加屏幕控制顶部标示主机IP地址 修正3.3之后版本可能会出现占CPU高的bug 修正内测第5版的主机下线后主机总数计数错误的bug 管理中心插件模块增加本地上传插件功能 优化自动上线主机统计部分代码 对服务端部分代码进行优化缩小体积 修正内存识别错误采用MB为单位计算 重写文件管理部分代码加快传输不兼容旧版 增加连接上限设置\是否使用服务端心跳设置\自动断开重复主机设置(默认不启用) 修改文件下载路径文件夹名以IP地址命名 修正旧版下载无法续传的错误 优化控制端命令发送部分代码 V4.1 修正一个同主机屏幕多开的bug 修正一个插件管理功能无法删除插件的bug 重写优化控制中心部分代码使运行更稳定 文件传输删除任务功能支持多选删除 控制中心获取的信息细节优化 修正上一个版本无法删除目录的bug 传输命令格式变更完全加密 V4.2 修正上一个版本插件传输失败的bug 抛弃旧版本文件传输功能重写 文件传输功能支持断点续传 文件传输功能支持文件多选操作 抛弃旧版本文件浏览功能重写 使用windows接口打造仿真explorer 使用windows本地图标组最大限度保证显示与类型相符 可正常读取网络磁盘\可读写光盘的数据(DRIVE_REMOTE\DRIVE_FIXED) V4.3 修正部分机器远程主机图标获取失败的bug

828

社区成员

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

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