我有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 体积还要大? 不科学啊.
有什么办法可以再缩小点体积?
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 体积还要大? 不科学啊.
有什么办法可以再缩小点体积?
这个我知道 VCL 已经是很好的库了我觉得3个程序已经够多了.. 看来还不够.加壳后 做成压缩包体积反而会略大..
几乎都是系统API 了, exe 用了 form, dll 用了 xml ocx 几乎就是最简的了dll 要给其他的 exe 使用...
我这几乎没有界面了, 而且 KOL 有些地方不能满足我.
上头要求的..
现在游戏体积虽然大, 但是要吸引玩家进来玩, 很多采取微端策略. 第一个包一定要小.
光速登陆器下载..... 行业标准都不能超过1MB
但是这个exe可以静态编译进去,如果对大小要求这么高
把dll作为为exe的资源编译进去(可见于万一博客中关于资源文件的那几篇),exe运行后先把资源抽出来另存为dll文件,然后加载dll.或者直接加载内存中的Dll(网上有代码)
1. 把与程序无关的代码剥离,比如你需要一个函数f在一个单元u中,单元u中还有很多其他函数,但是你用不着,这时,你把f函数直接抽离出来。不要引用u
2.加壳压缩,如aspack
那样其实还是2个文件的大小 进exe的 dll 其实自带vcl了..
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.