Minimální Delphi aplikace

vložil Radek Červinka 11. května 2011 23:09

Díky komentáři Jaroslava Beneše minule pod článkem (určitě se podívejte na jeho stránky s Delphi drobnostmi - např. TinyDB) jsem se zahloubal do stránek delphibasics.info což jsou opravdu hardcore Delphi programátorské stránky, kde jsem se inspiroval.

Obecně nemám rád honbu za minimální velikostí programu (ale i tak se snažím držet se v rozumných mezích), i když minimální velikostí prázdné aplikace jsem se již věnoval v článku Velikosti EXE u jednotlivých verzí Delphi. Pokud Vás velikost opravdu trápí pro trošku reálnější aplikace, můžete použít KOL jako alternativu k VCL a tím zmenšit velikost aplikace, nebo nahradit System.pas a SysInit.pas za minimální System.pas a SysInit.pas.

Small Applications in Delphi je velmi zajímavý článek se zdrojovými kódy, kdy autor dokázal dostat "hello world" aplikaci s MessageBox v Delphi na cca 980 byte. Skládá se ze dvou částí:

  • nahrazení system.pas a sysinit.pas (dva základní soubory RTL) za minimální verze (cca 3.5K)
  • nahrazení linkeru delphi za linker od MS (<1K)

Druhý bod mi přijde nefér, ale i tak je 3,5K slušné. Navíc pro implementaci druhého bodu byla nutná speciální technika: kompilátor z Delphi 4 a další, produkuje jiný formát OBJ souborů než očekává MS linker, takže bylo nutné použít neoficiální nástroj OMF2D (k dostání na uvedené stránce), který převede OBJ na kompatibilní formát (může se někomu hodit!).

Musel jsem ale opravit poskytnuté zdrojáky, jinak při ukončování programu Windows 7 64bit zahlásí problém, úprava se týkala _halt0.

unit SysInit;

interface
procedure _InitExe;
procedure _halt0;
procedure _InitLib(Context: PinitContext);

var
  ModulelsLib: Boolean;
  TlsIndex: Integer = -1;
  TlsLast: Byte;
  
const
  PtrToNil: Pointer = nil;
procedure ExitProcess(ExitCode: Integer); stdcall;
   external 'kernel32.dll' name 'ExitProcess';


implementation

procedure _InitLib(Context: PinitContext);
asm
end;

procedure _InitExe;
asm
end;

procedure _halt0;
begin
  ExitProcess(0);
end;

end.

Není to prima velikost? Zároveň jsem upravil Hello.dpr na

program Hello;
function MessageBoxA(hWnd: Cardinal; lpText, lpCaption: Pchar; uType: Cardinal): Integer; 
  stdcall; external 'user32.dll' name 'MessageBoxA';
begin
  MessageBoxA(0,'Written by n0v4'+#13#10+'www.delphibasics.co.nr','TinyPE in Delphi',0);
end.

Výsledná aplikace byla přeložena D3 kompilátorem (byl v balíku na těch stránkách) na 3584byte. Stejného výsledku jsem dosáhl za použití D5. Za pomocí D2007 se mi překlad už nepodařil (nějak se mi nepodařilo přinutit kompilátor ke kompilaci souboru System.pas).

dcc32.exe -Q system.pas sysinit.pas -M -Y -Z -$D- -0

Tagy: , , ,

Aplikace

Komentáře

12.5.2011 6:22:20 #

pepak

Mě na velikosti programu záleží dost, ale tyhle "minimální unity" (včetně KOL) nepoužívám - v podstatě se nedají použít na nic jiného než na maličké prográmky, které si píšu celé sám. Ale jakmile potřebuji využít cizí komponenty, typicky TPerlRegEx nebo Synapsi, tak jsou mi k ničemu.

pepak

27.1.2012 15:21:56 #

sys

Tak ma napdlo, ci by tymto sposobom (nahradenie delphi linkeru za MS) neslo vytvorit ovladace zariadeni, .sys

sys

27.1.2012 15:36:14 #

Radekc

Jo, přesně tak. Existuje neudržovaný projekt, který to uměl. hledej DDDK41 - Delphi Driver Development Kit

Radekc

27.1.2012 15:41:09 #

Radekc

http://w-shadow.com/files/DDDK004.zip

Radekc

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců