用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...