有一次,我有一个不错的小压缩实用程序,它可以将我的 Delphi 编译的 EXE 压缩到更小的下载大小,但现在我找不到它。有什么建议吗?
此外,使用这些实用程序有什么缺点吗?(我主要用它们来缩短农村/拨号用户的下载时间)。
有一次,我有一个不错的小压缩实用程序,它可以将我的 Delphi 编译的 EXE 压缩到更小的下载大小,但现在我找不到它。有什么建议吗?
此外,使用这些实用程序有什么缺点吗?(我主要用它们来缩短农村/拨号用户的下载时间)。
几年前,我研究了压缩我的可执行文件以使下载更小。
我最终做的,以及我向你推荐的,是改用像Inno Setup这样的安装程序。它不仅会创建一个单独的 EXE 来安装/卸载您的程序,而且它还可以压缩该 EXE,就像单独的压缩器对您的可执行文件所做的一样。
安装程序后,它会被解压缩,因此它永远不会是病毒,也不会增加加载时间。
因此,我获得了较小的下载大小以及同时具有专业外观的安装脚本的好处。
ps Inno Setup 是免费的。
建议您不要:
这个看起来很疯狂的网站提出了我在遥远的过去听到的一个论点(今天是否正确,我不确定,现代包装器今天可能有不同的策略)这篇文章引用了 Win32!:)
http://topic.csdn.net/t/20000408/08/6785.html
现代多任务操作系统,如 Windows 95/98 和 NT,使用所谓的“虚拟内存”系统。当程序启动时,它们的所有代码不会在启动时立即加载到内存中,就像 DOS 程序一样。相反,只有部分正在执行的代码被存储到内存中。例如,假设您的程序在其菜单上有一个打印选项,并在其后面处理打印的代码。只有在用户首次选择打印功能后,此代码才会加载到内存中。如果代码加载到内存后,打印功能有一段时间没有使用,系统将“丢弃”代码,释放它占用的内存,如果另一个应用程序迫切需要内存。这是称为“分页”的过程的一部分
在 Win32 下分页节省内存的另一种方法是它导致程序(或 DLL)的多个实例共享相同的内存用于代码。换句话说,在正常情况下,启动 100 个程序实例和启动一个实例之间为代码分配的物理内存量没有真正的差异。
如果所有 Win32 程序的行为都像 DOS 程序一样,将所有内容加载到内存中并一直保存到程序终止,并且在多个实例之间也不共享任何内存,那么您可能可以想象在数量有限的系统上物理内存会以多快的速度耗尽,导致磁盘交换开始。
然而,这正是当前 Win32 EXE 压缩器对您的 EXE/DLL 所做的!它们通过将所有代码解压缩到内存中并将其保留在那里直到终止,从而完全违背了操作系统的分页系统。而且由于代码不是以“原始”格式存储在 EXE 文件中(即与存储在内存中的方式相同),因此操作系统无法在多个实例之间共享代码。
我不知道有什么专门针对 Delphi 的,但UPX在这类事情上非常受欢迎。唯一的缺点是可执行文件在启动时必须解压缩,这可能会耗费一些时间。不过,对于大小合理的可执行文件来说,它似乎非常快。
您可能想到的是ASPack——它是一个用 Delphi 编写的 EXE 压缩器,但可以压缩任何 EXE。不过,它可能在 Delphi EXE 上做得更好。我同意其他答案,即您不应该仅仅为了节省下载时间而使用 EXE 压缩器。在某些特定情况下,EXE 压缩是个好主意,但通常不是。
而是使用一个好的安装构建器,特别是如果您能找到使用 7zip 压缩的安装构建器。我知道InstallAware在内部使用 7zip 来实现最大压缩。根据您拥有的 Delphi 版本,您也可能拥有 InstallAware 许可证。
如果不出意外,您可以免费使用7zip构建具有基本安装行为的自解压存档。它是用于安装程序的 SFX 的单独下载。
使用带有 lzma 选项的UPX进行最大压缩。
upx --lzma yourfile.exe
压缩 EXE 或 DLL 的主要不便之处在于操作系统无法在多个实例之间共享代码。
所以你在浪费内存,每次启动实例时都必须解压缩,表现出类似病毒的行为,甚至没有压缩安装的下载优势。
唯一正面的情况是直接从网络驱动器启动时。
我相信终端服务器(如 Citrix)如果未压缩,将为您的应用程序二进制文件使用相同的内存。这意味着压缩的 exe 文件在 Citrix 环境中可能会产生小灾难。
不久前,我在 SO 上问了一个关于在 Delphi 可执行文件上使用 UPX 的弊端的问题,我得到了一些很好的回应。
UPX应该可以工作,尽管它不是 Delphi 特有的。
我使用 PEtite:http ://un4seen.com/petite/
我也会投票给upx。除了提到的缺点之外,它还可以防止基本的逆向工程和那些蹩脚的“资源黑客”工具。顺便说一句,它们中的大多数都无法打开压缩的可执行文件。
您可以使用PECompact,因为人们无法轻松解密它,并且正如测试所示(显示在主页上,只需向下滚动一点)它比 ASPack 或 UPX 更好,我在以前的 Delphi 项目中使用过它