Thema: Delphi .exe Dateigröße

Einzelnen Beitrag anzeigen

Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#13

Re: .exe Dateigröße

  Alt 8. Apr 2008, 00:29
@Counter909,

(Simple Erklärung zu UPX & Co)

Also UPX ist eine schlechte Idee. Dieses Tool komprimiert die Datei nur also eine Art
selbst entpackendes Archiv für Exe-Datein.
Wenn solch eine komprimierte Exec gestartet wird entpack sich diese im Hauptspeicher.
Dazu kommt noch mal die Grösse der Exec. D.h. mit UPX lädt man sich das Programm
zwei mal in den Speicher. Das Tool macht also nur bei kleinen Dateien und oder
zu Transportzwecken für USB-Stick oder Internet Sinn wenn man es nicht in ein
Zip.- Rar.- oder anderes Archiv packen kann oder darf.

Die Grösse der Exec's:

Die normale VCL - Standard Delphi Anwendungen enthält Units und Libarys die dem Programmierer
das programmieren erleichtern. So braucht sich dieser nicht explizit zB. um das Erstellen
einer Form (eines Fensters) oder eines Buttons sowie "Fehlerabfangroutinen" zu kümmern.
Eine solche erzeugte Datei ist nun rund 500 KByte gross.

Will man das nun vermeiden kann man auch ohne die VCL programmieren. ( Stichwort Hier im Forum suchennonVCL )
Der Nachteil ist das der Programmierer sich nun um alles selbst kümmern muss (zB. um das Erstellen des
Fensters, Buttons o.ä.). Der Vorteil eine kleine Exec.-Datei. Die Grösse der Datei ist dafür minimal.
Ein kleines Programm kann so zB. bei rund 20 KBytes liegen.

Beispiele.:
Standard - VLC Anwendung mit einem Fenster:

Delphi-Quellcode:
// - 1 ---------------------------------------------------------------------

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas{Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

// - 2 ---------------------------------------------------------------------

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.
Die Grösse der Exec.-Datei beträgt nun schon ~ 400 kBytes.

Standard - nonVLC Anwendung mit einem Fenster:

Delphi-Quellcode:
program Project1;

(* {$R 'resource.res' 'resource.rc'} *)

uses
  Windows, Messages;

const
  wndClassName = 'mWndClass';
  wndAppTitle = 'nonVCL';
  WndWidth = 320;
  WndHeight = 240;

var
  hWndApp: Cardinal;

function WndProc(_hWnd: HWND; _Msg: UINT; _wParam: wParam; _lParam: LParam):
  lresult; stdcall;
var
  x, y : integer;
begin
  Result := 0;

  case _Msg of
    WM_CREATE:
      begin
        // Fenster zentrieren
        x := GetSystemMetrics(SM_CXSCREEN);
        y := GetSystemMetrics(SM_CYSCREEN);
        MoveWindow(_hWnd, (x div 2) - (WndWidth div 2),
          (y div 2) - (WndHeight div 2), WndWidth, WndHeight, TRUE);
      end;
    WM_DESTROY:
      PostQuitMessage(0);
  else
    Result := DefWindowProc(_hWnd, _Msg, _wParam, _lParam);
  end;
end;

var
  WndClass: TWndClass;
  msg: TMsg;

BEGIN
  with WndClass do
  begin
    // cbSize := SizeOf(TWndClassEx);
    Style := CS_HREDRAW or CS_VREDRAW;
    lpfnWndProc := @WndProc;
    cbClsExtra := 0;
    cbWndExtra := 0;
    hbrBackground := COLOR_APPWORKSPACE;
    lpszMenuName := nil;
    lpszClassName := wndClassName;
    // hIconSm := 0;
    hInstance := hInstance;
    hIcon := LoadIcon(hInstance, MAKEINTRESOURCE(100));
    hCursor := LoadCursor(0, IDC_ARROW);
  end;

  // Fenster registrieren
  RegisterClass(WndClass);

  // Fenster erzeugen
  hWndApp := CreateWindow(
      wndClassName,
      WndAppTitle,
      WS_OVERLAPPEDWINDOW,
      INTEGER(CW_USEDEFAULT),
      INTEGER(CW_USEDEFAULT),
      WndWidth,
      WndHeight,
      0,
      0,
      hInstance,
      nil);

  // Fenster anzeigen
  UpdateWindow(hWndApp);
  ShowWindow(hWndApp, SW_SHOW);

  // Nachrichtenschleife
  while GetMessage(msg,0,0,0) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;

  UnRegisterClass(WndClassName, HInstance);

  ExitCode := msg.wParam;
END.
Die Grösse der Exec.-Datei beträgt nun nur ~12 Bytes.


Ist es nicht Notwendig ein Fenster zu erzeugen kann man sich auch mit einer Art
Misch aus beiden Programiervarianten behelfen:


Delphi-Quellcode:
program Project1;

uses
  Windows, SysUtils;

function Addiere(ValueA, ValueB: integer): integer;
begin
  Result := ValueA + ValueB;
end;

procedure Machwas;
begin
  MessageBox(0, PCHAR(IntToStr(Addiere(100, 23))), 'Hallo:', MB_OK);
end;

BEGIN
  Machwas;
  MessageBox(0, PCHAR(TimeToStr(now)), 'Die Uhrzeit ist:', MB_OK);
END.
Die Grösse der Exec.-Datei beträgt nun ca. 45 kBytes.


// Edit: Doppelmoppel entfernt.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat