Mały EXE

Adam Boduch

Często wytykaną wadą w Delphi jest to, że tworzy zbyt duże pliki wykonywalne EXE. W tym artykule przedstawię informację jak chociaż trochę zmniejszyć rozmiar EXE.

Uses

Jeżeli na formularzu umieszczasz jakiś komponent to niejednokrotnie umieszcza on odpowiednie słowo w liście uses. Ta lista to oczywiście lista modułów. Przy bardziej skomplikowanych komponentach taki moduł jest dość duży i przez to zwiększa on rozmiar naszej aplikacji.
Jeżeli usuwasz jakiś komponent to moduł włączający go do listy uses może tam pozostać. Jest to niepotrzebne więc możesz go spokojnie usunąć.

Krok 2: wywal ikony!

Usunąłeś już niepotrzebne moduły? Ok, teraz czeka Cię drugi nieco trudniejszy krok. Nie wiem czy wiesz, ale Delphi automatycznie podczas kompilacji w EXEcu umieszcza ikony i kursory, które nie zawsze muszą być wykorzystane przez Twoją aplikację. Jeżeli już skompilowałeś swój program musisz dostać się "do środka". W tym celu potrzebujesz specjalnego programu. Polecam "ResHack". Ściągnij go sobie. Teraz uruchom program i poleceniem "File" -> "Open" otwórz swój program. Po chwili zobaczysz drzewo katalogów. Nie są to katalogi, ale "środek" Twojego EXEca. Rozwiń gałąź "Bitmap". Zobaczysz kolejną gałąź z nazwami ikon włączonych do EXEca. Po dwukrotnym kliknięciu na którąś gałąź rozwinie się jeszcze jedna z bitmapą - jeżeli w nią klikniesz po prawej stronie zobaczysz podgląd bitmapki. Jeżeli w Twoim programie nie korzystasz z nich to wywal niepotrzebne naciskając prawym przyciskiem na nazwę i wybierając polecenie "Delete". To samo zrób z nieużywanymi kursorami. To już chyba wszystko co możesz wywalić, aby Twoja aplikacja działała poprawnie i jej rozmiar zmniejszył się o kolejne kilka kilobajtów.

Krok 3: Kompresja

Teraz także będziesz potrzebował specjalnego narzędzia - programu UPX. Program ten potrafi zmniejszyć rozmiar Twojego EXEca o dobre kilkaset kilo! Możesz go ściągnąć klikając tutaj.

Ponieważ jest to program DOSowy postępuj według poniższych wskazówek. Skopiuj Twój program do katalogu z UPXem. Teraz otwórz okienko MS - DOS'a ( w menu Start - Programy ). Za pomocą funkcji dosowych musisz przejść do katalogu z UPX'em:

cd Katalog - przechodzi do katalogu o nazwie "Katalog"
cd.. - przechodzi o katalog wyżej.

Ok, jeżeli już jesteś w katalogu z UPX'em wpisz taki ciąg:

upx.exe -9 NazwaTwojegoProgramu.exe

W ten sposób Twój program zostanie skompresowany najlepszą metodą. Po chwili rozmiar EXEca znaczenie się zmniejszy. :)

Jak działają takie programy? Podczas uruchamiania UPX'a plik EXE zostaje kompresowany, a następnie do tego właśnie pliku zostaje dodany dekompresor! Podczas uruchamiania pliku EXE wyciągany zostaje z niego dekompresor, który rozpakowuje plik, a następnie uruchamia.

Jaka jest wada zastosowania takiej techniki? Niektóre programy antywirusowe mogą wziąć taki plik za wirusa. Zawiera on przecież załącznik, czyli tak jak wirusy "doczepia" się do pliku wykonywalnego.

22 komentarzy

Mam inny pomysł co du uses, chociaż może troche głupi.
Można z tych wszystkich modułów z uses, wyciągnąć tylko procedury i funkcję których się używa w programie, a zostawić te których się nie używa, i zapisać to w jakimś oddzielnym module. Wtedy wystarczy tylko dodać ten jeden moduł.
Ale polecam to robić pod koniec ostatecznej wersji programu, bo ciągłe dodawanie nowych funkcji do tego modułu moze być uciążliwe.

A nie ma moze jakiegos kompilatora ktory tworzylby mniejsze exe'ki? Wtedy mozna pracowac na Delphi a dopiero ostateczna wersje skompilowac w tym programiku:)

no racja, tylko pomysl, pisząc aplikacje serwerowe wazne jest zoptymalizowanie KAZDEJ pętli, i rozmiar ma znaczenie, zawsze mozna pisać z uzycim winapi, wywalic zbędne moduły itp. wywalanie zasobow jest nieoplacalne, bo przecierz prawie wogole ich nie ma :D

powiedzcie mi jedno... po grzyba wam w dzisiejszych czasach małe Exeki? Pracujecie na 386 czy jak? Rozpowszechniacie programy na FDD? Macie 16MB Ramu? Tak wiem, delphi nie radzi sobie z kompilacja do malych rozmiarów ale dzis to jest zbedze... jesli pisze sie naprawde duuuuzy projekt to mozna uzyc C, ktore w tym przypadku poradzi sobie znacznie lepiej jak delphi

mozna napisac w WinAPI, formy zajmuja 80% miejsca w zwyklym skompilowanym programie delppppphi

ja tam pisze w winapi, używam dodatkowo biblioteki KOL, a jak jeszcze uzyje FSG i StripReloc to samo okienko zajmuje około 2,5kB :) oczywiście wszystko w delphi :)

Odysseus, dlatego, że taki program nie uruchomi się na żadnym komputerze, jeśli nie zainstalujesz tam Delphi!

Wyniki krótkiego testu: mały programik Delphi zajmujący 400896 bajtów,
Wyniki kompresji:

  1. UPX(-9): 162304 bajtów
  2. ASPack(Maksymalna kompresja): 163840 bajtów
  3. ASPack: 164864 bajtów
  4. FSG: 186753 bajtów
  5. UPX(-1): 211456 bajtów
  6. StripReloc: 376320 bajtów

Moje maksimum: StripReloc-> Resource Hacker (pozostawiłem ikonę)->UPX-9 : 155136bajtów
Pozdrawiam !

Nie wiem czemu nikt nie wspomina o: Project->Options->Zakładka Packages->Zaznacz opcję Build with runtime packages? U mnie taki exec ma 15kB.

Nie wiem czemu nikt nie wspomina o: Project->Options->Zakładka Packages->Zaznacz opcję Build with runtime packages? U mnie taki exec ma 15kB.

do kompresji lepiej zastosować FSG - najlepszy kompresor jaki w życiu widziałem.
http://www.woodmann.net/bart/download.php?id=xt_fsg20.zip

Dodam jeszcze, że należy program skompilować z wyłączonymi wszystkimi opcjami do debugowania i włączoną optymalizacją kodu.

Ja używam takiej kombinacji:
Najpierw wywalam zbędne zasoby (na dłuższą metę to żmudna sprawa), a później wywalam sekcję relokacji za pomocą StripReloc.

Dodam, że kompresowanie exe/dll nie jest opłacalne, zyska się kilkaset kB, a za to program będzie zjadał o wiele więcej RAMu.

Stripreloc
http://www.jrsoftware.org/striprlc.php

ja tez polecam ASPack'a

ja polecam program AsPack czy AssPack, bajera straszna - kompresuje EXE do ... no wlasnie potrafi skompresowac do rozmiaru = 20% poczatkowego roziaru EXE

Można pisać w WinApi ^^

Programy ResHack oraz UPX mozna sciagnac z tej strony, z dzialu Programy.

zamiast ResHack możesz użyć także programu ResXplor dołączonego do każdego delphi w postaci źródła ..\delphi\deoms\ResXplor\ResXplor.dpr z tą różnicą że ResXplor nie może usuwać żadnych plików z zasobów czyli tak takby nic :-)

Naprawdę fajny programik i rzeczywiście bardzo zmniejsza exe'ki.Dobrze ze zostało to tutaj zasygnalizowane że istnieje takie coś jak UPX.Program można ściągnąć z : http://www.pasja.scrypty.com/download.php

Fajnie, ale mógłbyś podać źródła do programów

Nooo!
Ciekawe.
Fajne, super. Pomysłowe i przydatne.
Tylko jak mam ściągnąć te programy(UPX i ResHack) jak tu nie ma żadne go linku !?!?!?!