我有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.   

    所谓“自带BPL”其实不是把整个BPL塞进去,是需要的函数编译进去,自然就比带完整的BPL小的多,体积的话没啥好办法,其实VC++编译出来的也很大,只不过因为VC++的运行时库WINDOWS已经带上了,所以感觉小。
      

  2.   

    如果exe/dll更多时,Build with runtime package才合算一般还是aspack/lzexe等exe压缩工具处理一下好了
      

  3.   

    UPX加压缩壳,一般都能压缩至原来的60%左右
      

  4.   


    这个我知道  VCL 已经是很好的库了我觉得3个程序已经够多了..  看来还不够.加壳后  做成压缩包体积反而会略大..
      

  5.   

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

  6.   

    起码exe和dll可以合并吧。
      

  7.   

    这三个 一个是 exe 一个是dll 一个是 ocx......
    几乎都是系统API 了,  exe 用了 form,   dll 用了  xml   ocx 几乎就是最简的了dll 要给其他的 exe 使用...
      

  8.   


    我这几乎没有界面了,  而且 KOL 有些地方不能满足我.
    上头要求的..
    现在游戏体积虽然大, 但是要吸引玩家进来玩,   很多采取微端策略.  第一个包一定要小.
    光速登陆器下载..... 行业标准都不能超过1MB
      

  9.   

    dll 要给其他的 exe 使用...
    但是这个exe可以静态编译进去,如果对大小要求这么高
      

  10.   

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

  11.   

    哦?没听说过?  愿闻其详把EXE  当做动态链接库用么?
      

  12.   


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

  13.   

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

  14.   


    那样其实还是2个文件的大小   进exe的 dll 其实自带vcl了..
      

  15.   


    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.
      

  16.   

    exe 文件大小,已不是程序的问题。关键的程序可靠性如何。