用Delphi如何编写几十K的小程序呀?(50分)

  • 主题发起人 主题发起人 xuehn
  • 开始时间 开始时间
X

xuehn

Unregistered / Unconfirmed
GUEST, unregistred user!
用Delphi如何编写几十K的小程序呀?
 
不用VCL,不用组件,直接编写代码然后用那个BCC??.EXE编译,象DOS下的PASCAL编写一样.
怎么?做病毒啊?
 
可我新建一个工程,不加控件;窗体,不写任何代码,编译出来的程序就300多K!
 
console application
 
KOL or WIN SDK
 
没有很大的必要
因为如果软件真的很棒的话再大也会有人下载
而现在随着宽待的普及,因此容量不是问题
 
15k的小程序
===========

program SmallDemo;

uses Windows, Messages;

function AppWindowProc(hWnd:HWND; uMsg:UINT;wParam:WPARAM; lParam:LPARAM):LRESULT; stdcall;
begin
Result := 0;
case uMsg of
WM_DESTROY: begin
PostQuitMessage(0);
Exit;
end;
end;
Result:=DefWindowProc(hWnd, uMsg, wParam, lParam);
end;

var
wc: TWndClass;
hWnd: Integer;
MSG: TMsg;
begin
wc.style := CS_VREDRAW or CS_HREDRAW;
wc.lpfnWndProc := @AppWindowProc;
wc.cbClsExtra := 0;
wc.cbWndExtra := 0;
wc.hInstance := HInstance;
wc.hIcon := LoadIcon(0, IDI_APPLICATION);
wc.hCursor := LoadCursor(0, IDC_ARROW);
wc.hbrBackground := (COLOR_BTNFACE+1);
wc.lpszMenuName := nil;
wc.lpszClassName := 'My App';
if RegisterClass(wc)=0 then Exit;
hWnd:= CreateWindow(wc.lpszClassName,'TEST',WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,HInstance,nil);
if hWnd=0 then Exit;
ShowWindow(hWnd, SW_SHOWNORMAL);
while GetMessage(MSG, 0, 0, 0) do begin
TranslateMessage(MSG);
DispatchMessage(MSG);
end;
Halt(MSG.wParam);
end.
 
{不是我写的,只有一个工程文件}
program DeskPop;

uses
Windows, Messages, ShellAPI, sysutils;

{$R *.RES}
{$R ICONS.RES}

const
AppName = 'DeskTop Hide';

var
x: integer;
tid: TNotifyIconData;
WndClass: array[0..50] of char;

procedure Panic (szMessage: PChar);
begin
if szMessage <> Nil then
MessageBox (0, szMessage, AppName, mb_ok);
Halt (0);
end;

procedure HandleCommand (Wnd: hWnd; Cmd: Word);
begin
case Cmd of
Ord ('A'): MessageBox (0, 'Freeware brian.slack@strath.ac.uk 1997', AppName, mb_ok);
Ord ('E'): PostMessage (Wnd, wm_Close, 0, 0);
end;
end;

function DummyWindowProc (Wnd: hWnd; Msg, wParam: Word; lParam: LongInt): LongInt; stdcall;
var
TrayHandle: THandle;
dc: hDC;
i: Integer;
pm: HMenu;
pt: TPoint;
begin
DummyWindowProc := 0;
StrPCopy(@WndClass[0], 'Progman');
TrayHandle := FindWindow(@WndClass[0], nil);
case Msg of
wm_Create: // Program initialisation - just set up a tray icon
begin
tid.cbSize := sizeof (tid);
tid.Wnd := Wnd;
tid.uID := 1;
tid.uFlags := nif_Message or nif_Icon or nif_Tip;
tid.uCallBackMessage := wm_User;
tid.hIcon := LoadIcon (hInstance, 'MAINICON');
lstrcpy (tid.szTip,'Desktop is on');
Shell_NotifyIcon (nim_Add, @tid);
end;
wm_Destroy:
begin
Shell_NotifyIcon (nim_Delete, @tid);
PostQuitMessage (0);
ShowWindow(TrayHandle, SW_RESTORE);
end;
wm_Command: // Command notification
begin
HandleCommand (Wnd, LoWord (wParam));
Exit;
end;
wm_User: // Had a tray notification - see what to do
if (lParam = wm_LButtonDown) then
begin
if x = 0 then
begin
ShowWindow(TrayHandle, SW_HIDE);
tid.hIcon := LoadIcon (hInstance, 'offICON');
lstrcpy (tid.szTip,'Desktop is off');
Shell_NotifyIcon (NIM_MODIFY, @tid);
x:=1
end else
begin
ShowWindow(TrayHandle, SW_RESTORE);
tid.hIcon := LoadIcon (hInstance, 'ONICON');
lstrcpy (tid.szTip,'Desktop is on');
Shell_NotifyIcon (NIM_MODIFY, @tid);
x:= 0;
end;
end else
if (lParam = wm_RButtonDown) then
begin
GetCursorPos (pt);
pm := CreatePopupMenu;
AppendMenu (pm, 0, Ord ('A'), 'About DeskTop Hide...');
AppendMenu (pm, mf_Separator, 0, Nil);
AppendMenu (pm, 0, Ord ('E'), 'Exit DeskTop Hide');
SetForegroundWindow (Wnd);
dc := GetDC (0);
if TrackPopupMenu (pm, tpm_BottomAlign or tpm_RightAlign, pt.x,GetDeviceCaps(dc,HORZRES){pt.y}, 0, Wnd, Nil) then
SetForegroundWindow (Wnd);
DestroyMenu (pm)
end;
end;

DummyWindowProc := DefWindowProc (Wnd, Msg, wParam, lParam);
end;

procedure WinMain;
var
Wnd: hWnd;
Msg: TMsg;
cls: TWndClass;
begin
{ Previous instance running ? If so, exit }
if FindWindow (AppName, Nil) <> 0 then Panic (AppName + ' is already running.');

{ Register the window class }
FillChar (cls, sizeof (cls), 0);
cls.lpfnWndProc := @DummyWindowProc;
cls.hInstance := hInstance;
cls.lpszClassName := AppName;
RegisterClass (cls);

{ Now create the dummy window }
Wnd := CreateWindow (AppName, AppName, ws_OverlappedWindow,
cw_UseDefault, cw_UseDefault, cw_UseDefault, cw_UseDefault,
0, 0, hInstance, Nil);
x:= 0;
if Wnd <> 0 then
begin
ShowWindow (Wnd, sw_Hide);
while GetMessage (Msg, 0, 0, 0) do
begin
TranslateMessage (Msg);
DispatchMessage (Msg);
end;
end;
end;

begin
WinMain;
end.
 
cyberwalker的程序我也写过,现在来个更简单的:
新建工程,选Project->Remove from Project...,去除Unit1,
选View->Units...,打开Project1,修改代码如下:
program Project1;

uses
windows;

begin
MessageBox(0, PChar('<=8192'), PChar('小程序'), MB_ICONINFORMATION);
end.
我在XP、Delphi6下编译得到的程序是8192,估计实际程序更小,因为我加了一些代码得到
的还是8192。
 
关键是不能用delphi的VCL和Form,仅用Windows API。
但这样就失去快速RAD的意义了。
 
我也想知道,顶一下
 
虽然分少,但我也来顶一下拉
 
以前好像见过一个,用了 form,但不到 100K,不知道是不是记错了
 
Delphi是基于VCL的,如果你要用VCL,那么没办法,程序一定会比较大!如果你根本就不用
VCL,为什么要用Delphi呢?
其实想把应用程序变小,也好办。
在Project Options里选择Packages页,选中Build with runtime packages,
并填入你用到的packages,vcl;rtl等。
在默认情况下,一个project,有一个Form,一个Button大小为365K.
使用上述方法后变成18.5K!即使你用了很多第三方组件,程序很大,也能把你的程序
缩小到只有原来的25%左右。

但是你知道吗?如果你使用Build with runtime packages,程序运行的时候会把你用的
packages全部载入内存,vcl可能就有2M大,所以它用的内存将会比较大。使用这种方法
,上面的程序使用内存为5126K。如果不使用这种方法却只有3396K!

所以在你的程序比较大的时候用build with runtime packages会比较好(没有做深入研究)
 
[8D]同意用 console application
 
你只要不用什么大的控件,多一些代码,这样就可以把程序做的很小,但这样对系统的要求很大,因为,你要用别的控点的时候,就需要动态创建。很对系统资源的需求比较大。呵呵
 
console application
将uses的不用部分去掉!不用vcl
 
后退
顶部