用Delphi產生乙個最小的可執行程式

2021-04-13 06:06:14 字數 2189 閱讀 2680

用delphi產生乙個最小的可執行程式 

曾經在網上看到有人說delphi能夠產生大小只有16k的win32應用程式,而我自己曾經編寫過的這種可執行檔案大小則是在17k左右,因而我一度猜想delphi恐怕也只能將**優化到這種程度了。最近由於測試的目的重新把這個程式寫了一遍,才發現利用一些技巧,還能夠將檔案的大小進一步縮減到8.5k。這個程式也能夠顯示delphi作為類似於visual c++的、非rad工具的另乙個側面。如果你對此感興趣的話,請看我是如何做到這一點的。

用delphi生成乙個預設的專案,然後用工具欄上的remove file from project按鈕,將唯一的窗體(form1)從專案中刪除。然後選擇view->project source命令,開啟專案檔案,並編輯**如下所示:

uses

windows, messages;

// const

function wndproc(awnd:hwnd; message:uint; wp:wparam; lp:lparam):lresult;stdcall;

begin

result := 0;

case message of

wm_destroy:

postquitmessage(0);

else

result := defwindowproc(awnd, message, wp, lp);

end;

end;

varwc : wndclass;

hmainwnd : hwnd;

amsg : msg;

begin

with wc do begin

style := cs_vredraw or cs_hredraw;

lpfnwndproc := @wndproc;

cbcl***tra := 0;

cbwndextra := 0;

hcursor := loadcursor(0, idc_arrow);

hbrbackground := getsyscolorbrush(color_window);

hinstance := hinstance;

lpszmenuname := nil;

end;

registerclass(wc);

integer(cw_usedefault), integer(cw_usedefault),

integer(cw_usedefault), integer(cw_usedefault),

hwnd_desktop, 0,

hinstance, nil);

showwindow(hmainwnd, cmdshow);

updatewindow(hmainwnd);

while getmessage(amsg, 0, 0, 0) do begin

translatemessage(amsg);

dispatchmessage(amsg);

end;

end.

1.delphi程式沒有像c程式那樣的winmain入口,程式的執行就從.dpr檔案的begin開始,到與之匹配的end結束。而c程式中傳遞給winmain的四個引數,在delphi中則以全域性變數的形式定義在system以及sysinit單元中,它們分別是hinstance、hprevinst、cmdline和cmdshow(hprevinst已經沒有意義)。

3.我把一句也注釋起來了,這樣可以從檔案中剔除冗餘的資源,從而節省大約1k左右的空間。

4.程式完成後,開啟project options對話方塊,翻到compiler頁,將runtime errors和debugging分類中的選項全部清除,這樣也可以稍微減小最終檔案的大小。

儘管還不能說8.5k一定就是最小的尺寸,不過我猜想這已經非常接近delphi的極限了。在visual c++中,很有意思的一點是所有可執行檔案的大小都會對齊到4k的邊界,所以在visual c++中最小的.exe和最小的.dll大小都只能達到28k,除非使用一些非常特殊的隱藏編譯開關。儘管win32中的分頁預設是4k,不過我實在想不通visual c++把可執行檔案的大小也對齊到4k究竟有什麼意義?

另外,我手頭還有一套非常非常古老的turbo pascal for windows 1.5,它所編譯出的最小的windows可執行檔案的大小——你肯定無法相信——只有1.75k!當然了,它畢竟只是個win16程式而已。

用delphi產生乙個最小的可執行程式

乙個可拖動的ScrollView

我們經常看到這樣的效果,乙個listview和gridview亦或者是recycleview,再上拉或下拉到頂部的時候,還能再拖拽一段距離,這種效果是是非常常見的,因為用的比較多,所以記錄一下.實現思路是自定義乙個scrollview 具體 如下 package fenganoschina.feng...

乙個簡單的子集產生演算法

在做關聯規則挖掘模組的時候,由頻繁項集產生關聯規則,需要使用到子集產生的演算法。比如 char a 集合a中,產生所有a的子集,這些。在openminer的關聯模組實現之處,我考慮的方法和人們思考產生子集的方法型別,既是先產生所有的單個元素的子集,然後產生2個元素的子集,然後3個的,一直到n個元素的...

用Delphi寫乙個UTF8編碼格式的文字檔案

var f textfile begin assignfile f,test.txt rewrite f write f,ef bb bf utf 8 bom,關鍵就是寫入這個utf 8的bom,bom 是 bype order mark 的縮寫。writeln f,utf8encode 中文 cl...