Announcement

Collapse
No announcement yet.

Kleine EXE-Dateien

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Kleine EXE-Dateien

    Hallo!<p>

    Es geht um folgendes: Normalerweise ist ein Delphi-Projekt (die resultierende EXE-Datei), das standardmäßig erstellt wurde, mind. 190 KByte groß. Das Hinzufügen von Komponenten etc. vergrößert -wie sollte es anders sein- die EXE-Datei.<p>

    Nun ist es für mich wichtig die Datei möglichst klein zu halten. (Top wären 20-50 KByte) Meines Wissens nach kann man, wenn man die Form nur definiert, also nicht visual-mäßig erstellt, die Datei recht klein halten. Ich habe schon ein großes Projekt gesehen das die Datei nur definiert hat und das resultierend knapp 70 KByte groß war.<p>

    Kann mir jemand sagen wie ich das anstelle (ich habe das Programm leider nicht mehr zur Hand...) bzw. mir sogar ein kleines Beispiel (Form mit einer Checkbox oder so würde reichen) schicken?<p>

    Vielen Dank im Vorraus,<br>
    Patrik Huebner<p>

    [email protected]

  • #2
    Hallo,

    das folgende Beispiel für eine Win32-Anwendung, die nur auf das Win32-API zugreift (und somit auf die VCL verzichtet) führt zu einer EXE-Grösse von 28 kByte (ohne Packages!):
    <pre>
    program Generic;

    {$R GENRES.RES}

    uses SysUtils, Windows, Messages;

    const
    szClassName = 'DelGen'; // Name der Fensterklasse
    szTitle = 'Das Grundgerüst'; // Fenstertitel

    (* WindowProc ist die Fensterprozedur des generischen Fensters.
    Es wird nur eine einzige Windows-Botschaft ausgewertet, um
    das Programm über das Systemmenü schließen zu können. *)

    function WindowProc(Window: HWnd; Message : UINT; wParam: WPARAM;
    LParam: LPARAM): Longint; stdcall;
    begin
    Result := 0;
    case Message of
    wm_Destroy: begin
    PostQuitMessage(0); // Programm beenden
    Exit;
    end;
    end;
    Result := DefWindowProc(Window, Message, WParam, LParam);
    end;

    (* Die Procedure WinMain registriert die Fensterklasse und
    erzeugt ein sichtbares Hauptfenster für das Programm. *)

    procedure WinMain;
    var
    aWindow : HWnd;
    WindowClass : TWndClassEx;
    Message : TMsg;
    begin
    // InitApplication
    WindowClass.cbSize := SizeOf(TWndClassEx);
    WindowClass.Style := CS_HRedraw OR CS_VRedraw;
    WindowClass.hInstance := HInstance;
    WindowClass.lpfnWndProc := @WindowProc;
    WindowClass.cbClsExtra := 0;
    WindowClass.cbWndExtra := 0;
    WindowClass.hIcon := LoadIcon(hInstance, PChar('BIG'));
    WindowClass.hIconSm := LoadImage(hInstance, PChar('SMALL'),
    IMAGE_ICON, 16, 16, 0);
    WindowClass.hCursor := LoadCursor(0, idc_Arrow);
    WindowClass.hbrBackground := COLOR_WINDOW + 1;
    WindowClass.lpszMenuName := nil;
    WindowClass.lpszClassName := szClassName;
    // Rückgabewert 0 -> Fehlschlag
    if RegisterClassEx(WindowClass) = 0 then
    Halt(1);
    // InitInstance
    aWindow := CreateWindow(szClassName, szTitle, WS_OverlappedWindow,
    CW_UseDefault, 0, CW_UseDefault, 0,
    0, 0, HInstance, nil);
    // aWindow = 0 -> Fehlschlag
    if aWindow = 0 then
    Halt(2);
    // Aha - das Fensterhandle ist gültig -> zeigt dich !
    ShowWindow(aWindow, SW_SHOW);
    UpdateWindow(aWindow);
    // Message-Loop wartet auf das Programmende
    while GetMessage(Message, 0, 0, 0) do
    begin
    TranslateMessage(Message);
    DispatchMessage(Message);
    end;
    Halt(Message.wParam);
    end;

    begin
    WinMain; // Ein sehr kurzes Hauptprogramm
    end.
    </pre>

    Das Beispiel stammt aus meinem neuen Buch <b>Delphi Win32-Lösungen</b> - dort stelle ich auch komplexere Beispiele vor (Dialoge einbinden etc.). <br>
    Wenn dieser Aufwand nicht in Frage kommt, muss die Delphi-Anwendung mit Packages compiliert werden. In diesem Fall wird die EXE auch klein, allerdings werden zusätzlich die grossen Runtime-Packages benötigt.
    &#10

    Comment


    • #3
      Angenommen ich möchte noch eine Komponente mit einbinden, reicht es, den Inhalt der PAS-Datei meinem Programm hinzuzufügen?<p>

      Wie auch immer, dann heißt es wohl "auf zu amazon.de"... ;-)<p>

      Gruß,<br>
      Patri

      Comment


      • #4
        Hallo,

        nein - es gibt hier nur eine <b>Entweder-Oder</b>-Lösung. Sobald auch nur eine einzige VCL-Komponente eingebunden wird, ist es mit den kleinen EXE-Grössen vorbei. In diesem Fall ist es besser, die Anwendung mit Runtime-Packages zu compilieren.

        P.S. <i>....Wie auch immer, dann heißt es wohl "auf zu amazon.de"... ;-)....</i>: Warum in die Ferne schweifen, das Gute ist doch so nah (d.h. die Bücher sind auch direkt beim Betreiber dieses FORUMs zu haben)

        Comment


        • #5
          Ich würde das Buch "Delphi Win32-Lösungen" ja gerne bestellen doch finde ich es weder bei www.entwickler.com noch bei www.amazon.de ?

          Comment


          • #6
            Hallo Patrik,

            ich geh mal davon aus, dass das Buch in Kürze über das Forum zu bestellen sein wird. In der schriftlichen Einladung für die <b> Entwickler Tage 2000 </b> lag bereits ein Bestellzettel für das neue Buch von Andreas.

            Tschüß

            Torste

            Comment


            • #7
              Alles klar, danke!<p>

              <b>An Andreas Kosch:</b> Ich habe mir die Option "Mit Runtime-Packages compilieren" angeschaut. Im ersten Moment war ich natürlich hoch erfreut, die EXE-Datei war nur 15 KByte groß. Doch der Preis ist, daß man eine 2 MB-Datei (VCL30.DPL) mitliefern muß. Ich möchte eine Art selbst-extrahierendes Archiv programmieren, eine Datei dieser Größe würde das Aus für das Projekt bedeuten!<p>

              Das Ganze funktioniert so: Die gezipten Daten werden an die EXE-Datei angehängt, diese kann damit umgehen und auf Wunsch die Daten wieder entpacken. Die EXE-Datei muß dabei natürlich möglichst klein sein da sonst der Nutzen des Programmes nicht mehr gegeben ist.<p>

              Ich brauche nur eine edit-box, ein icon und zwei buttons, das ist Alles.<p>

              Wenn Sie noch ein kleines Beispiel hierfür hätten wäre ich Ihnen sehr dankbar!<p>

              Gruß,<p>
              Patrik Huebne

              Comment


              • #8
                Hallo Patrik,

                da kommen bei mir doch wehmütige Erinnerungen hoch: Mit <i>Turbo Pascal für Windows 1.0</i> ging nur die klassische API-Programmierung, so das alle Dialoge mit dem Borland-Tool <b>Resource Workshop</b> generiert wurden. Daher meine erste Frage: Steht Dir dieses Tool zur Verfügung (ist mit auf der Delphi 5-CDROM enthalten)?
                Wenn nicht, so müssen die Anweisungen für das Menü sowie für das Dialogfenster von Hand geschrieben werden:
                <pre>
                TESTMENU MENU
                {
                POPUP "&Datei"
                {
                MENUITEM "Exit", 101
                }

                POPUP "&Hilfe"
                {
                MENUITEM "&Info über", 201
                }

                }

                ABOUTBOX DIALOG 10, 18, 194, 119
                STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
                CAPTION "Info über GENERIC2.DPR"
                FONT 8, "MS Sans Serif"
                LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
                {
                DEFPUSHBUTTON "OK", 1, 12, 96, 50, 14
                PUSHBUTTON "Cancel", 2, 72, 96, 50, 14
                PUSHBUTTON "Help", 9, 132, 96, 50, 14
                LTEXT "Delphi 2.0-Programm nur aus Win32-API-Funktionen", -1, 9, 12, 176, 13
                LTEXT "Version 1.0", -1, 76, 28, 42, 8
                LTEXT "\xA9 Andreas Kosch 1996", -1, 57, 49, 79, 8
                CTEXT "", 99, 8, 66, 180, 20, SS_CENTER | NOT WS_GROUP
                }
                </pre>
                Auch die Anbindung der Eingabefelder/Menüpunkte/Button muss im Programm von Hand vorgenommen werden, so das jedes Fenster seine eigene Fensterprozedur erhält. Der folgende Teil ist nur für die Bearbeitung des OK bzw. Abbrechen-Buttons zuständig:
                <pre>
                function About(Dialog: HWnd; Message, WParam: Word;
                LParam: Longint): Bool; stdcall;
                begin
                Result := True;
                case Message of
                wm_InitDialog: begin
                ...
                end;
                wm_Command : if (LoWord(WParam) = id_Ok) or
                (LoWord(WParam) = id_Cancel) then
                begin
                EndDialog(Dialog, 1);
                Exit;
                end;
                end;
                Result := False;
                end;
                </pre>
                Ein Einsteiger wird es ohne die ca. 20 Seiten Beschreibung im Buch schwer haben. Wenn Du jedoch immer noch Interesse hast, schicke mir eine eMail ([email protected]) - ich werden dann das (unkommentierte) Beispielprojekt als eMail an Dich abschicken

                Comment

                Working...
                X