Delphi XE6 编译出的exe程序,体积很大怎么弄

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi XE6 编译出的exe程序,体积很大怎么弄相关的知识,希望对你有一定的参考价值。

1、加壳压缩 比如UPS壳。
2、快速编程工具都这样,链接了大量有可能用不上的开发包

用C++工具就会小很多,但是开发速度又慢了,
以前我的一个Delphi软件超过30多M,为了减小体积,
把大量的常用功能用DLL来实现,缩小到3M,只留一个主Form和DLL引用
参考技术A

    发布时采用Release编译,比Debug模式要小很多

    用aspack 或 upx 压缩下再发布

    使用带包编译,这种方法安装包会很大,因为用到的包像rtl vcl等bpl包都需要放安装包里,另外用到的第三方组件的bpl也要一起打包,缺少任何一个都会运行不起来,优势是编译出来的exe非常小,更新时会很方便,这个利弊需要自行权衡

把exe嵌入到自己的exe中。delphi xe3

 

 

 下面是一个把exe程序嵌入到我们自己的exe中。开发环境 Delphi XE3 Version 17.0.4625.53395。OS环境WIN7 SP1,由于xe3版本的引用库发生变化。换成其他版本的需要做对应的修改。

unit insexe;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    pnl1: TPanel;
    btn1: TButton;
    dlgOpen1: TOpenDialog;
    procedure btn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    FhProc: HWND;
  public
    { Public declarations }
  end;

  PProcessWindow = ^TProcessWindow;

  TProcessWindow = record
    TargetProcessID: Cardinal;
    FoundWindow: HWND;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function EnumWindowsProc(Wnd: HWND; ProcWndInfo: PProcessWindow): BOOL; stdcall;
var
  WndProcessID: Cardinal;
begin
  GetWindowThreadProcessId(Wnd, @WndProcessID);
  if WndProcessID = ProcWndInfo^.TargetProcessID then
  begin
    ProcWndInfo^.FoundWindow := Wnd;
    Result := False; // stop enumerating since a window found.
  end
  else
    Result := True; // Keep searching
end;

function GetProcessWindow(TargetProcessID: Cardinal): HWND;
var
  ProcWndInfo: TProcessWindow;
begin
  ProcWndInfo.TargetProcessID := TargetProcessID;
  ProcWndInfo.FoundWindow := 0;
  EnumWindows(@EnumWindowsProc, Integer(@ProcWndInfo));
  Result := ProcWndInfo.FoundWindow;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  si: STARTUPINFO;
  pi: TProcessInformation;
  bRet: Boolean;
begin
  if not dlgOpen1.Execute then
    Exit;

  FillChar(si, SizeOf(si), 0);
  si.cb := SizeOf(si);

  si.dwFlags := STARTF_USESHOWWINDOW;
  // MUST, otherwise, wShowWindow won‘t work.
  si.wShowWindow := SW_HIDE;
  // Hide the process Windows, otherwise could be trouble.
  bRet := CreateProcess(nil, PChar(dlgOpen1.FileName), nil, nil, True,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi);

  if not bRet then
    Exit;

  // Wait until child process exits.
  WaitForSingleObject(pi.hProcess, 100); // minor delay

  FhProc := GetProcessWindow(pi.dwProcessID);
  if FhProc > 0 then
  begin
    Winapi.Windows.SetParent(FhProc, pnl1.Handle);
    SetWindowPos(FhProc, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOZORDER);
    ShowWindow(FhProc, SW_SHOW);
  end;

  // Clear up
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if FhProc > 0 then
    PostMessage(FhProc, WM_CLOSE, 0, 0);
end;

end.

参考:http://hi.baidu.com/wang_yu_136/item/9c6d0ad877a4fa19d90e44fc 

以上是关于Delphi XE6 编译出的exe程序,体积很大怎么弄的主要内容,如果未能解决你的问题,请参考以下文章

Delphi2010的RTTI增强

现在的delphi xe7写的程序还能被反编译吗

delphi XE6 进行android开发关于真机使用EDIT或者MEMO出现假死重启问题。

iOS中的Delphi XE6链接C代码

delphi2010 怎么设置编译出来的exe文件的位置

Delphi XE6 Android拨号函数