program Project1;
uses
Dialogs;
begin
showmessage('Warning: This EXE file is to big, you must reinstall
Windows!');
end.
zašto onda kompajlirano iznosi 305Kb
jel se to može nekako smanjiti na recimo 20Kb jer mislim da ovakva
aplikacije ne bi trebala više od toga zauzimati
Moze se smanjiti tako da za kreiranje objekata koristis API pozive, a ne
standardne forme, gumbe....
Ako bilo sta dodajes jos u taj svoj projekt, velicina kompajliranog file-a
nece bitno promjeniti velicinu... Ovisi o unit-ima koje pozivas u programu
(uses lista).
>
>
>
Kao sto ti je Stanislav napisao - koristi API pozive....
Evo ti program koji kompajliran iznosi 16kb .
Program inache provjerava da li TV karta ima BT chip na sebi i koji je
(asembler nije moj - prepiso :-))) )
Izbaci funkciju KojiChip (assembler) i to je to.
program Bt8x8Chip;
uses
Windows,
Messages;
// SysUtils;
{$R Prvi.res}
const
AppName = 'Bt8x8';
Tekst: String='Chip Type: ';
var
hWindow: HWnd;
hLabel: hWND;
function KojiChip(PCIDeviceId: Word; var PhysicalAdress: Integer): Boolean;
var
BiosResult: Word;
BusNumber: Byte;
ChipAddress: Integer;
DeviceId: Byte;
DeviceInfo: Word;
begin
asm
pushad
mov ah, $00b1 // PCI_FUNCTION_ID
mov al, $0002 // FIND_PCI_DEVICE
mov cx, PciDeviceId // PCI_DEVICE_ID_BT8x8
mov dx, $109e // PCI_VENDOR_ID_BROOKTREE
mov si, $0000 // INDEX
int $1a
mov BiosResult, ax
mov DeviceInfo, bx
popad
end;
if (Hi(BiosResult) = 0) then
begin
BusNumber:= Hi(DeviceInfo);
DeviceId:= Lo(DeviceInfo);
asm;
pushad
mov ah, $00b1 // PCI_FUNCTION_ID
mov al, $000a // READ_CONFIG_DWORD
mov bh, BusNumber
mov bl, DeviceId
mov di, $0010 // PCI_BASE_ADDRESS_0
int $1a
mov BiosResult, ax
mov ChipAddress, ecx
popad
end;
if (Hi(BiosResult) = 0) then
begin
PhysicalAdress:= ChipAddress and $FFFFF000;
Result:= True;
end
else
Result:= False;
end
else
Result:= False;
end;
function KojiChipThread: Boolean;
var
x: Integer;
PaintStruct: TPaintStruct;
DC:HDC;
begin
DC:=BeginPaint(hWindow, PaintStruct);
SetBKMode(DC, TRANSPARENT);
TextOut(DC, 20, 20, PChar(Tekst), Length(Tekst));
TextOut(DC, 90, 105, PChar('Author: Robert Petrunic'), Length('Author:
Robert Petrunic'));
if KojiChip($0350, x) then
begin
TextOut(DC, 20, 40, PChar('BT848'), Length('BT848'));
end
else if KojiChip($0351, x) then
begin
TextOut(DC, 20, 40, PChar('BT849'), Length('BT849'));
end
else if KojiChip($036E, x) then
begin
TextOut(DC, 20, 40, PChar('BT878'), Length('BT878'));
end
else if KojiChip($036F, x) then
begin
TextOut(DC, 20, 40, PChar('BT879'), Length('BT879'));
end
else TextOut(DC, 20, 40, PChar('No BT Chip on this system :o)'),
Length('No BT Chip on this system :o)'));
EndPaint(hWindow, PaintStruct);
end;
// Funkcija koja obrađuje poruke koje se šalju od i prema aplikaciji
function WindowProc(Window: HWnd; AMessage, WParam, LParam: Longint):
Longint; stdcall; export;
var
hThread: THandle;
ThreadID: DWord;
begin
WindowProc := 0;
case AMessage of
WM_DESTROY:
begin
PostQuitMessage(0);
Exit;
end;
WM_CREATE:
begin
hThread := CreateThread(nil,
0,
@KojiChipThread,
nil,
0,
ThreadID);
end;
WM_PAINT:
begin
KojiChipThread;
end;
end;
WindowProc := DefWindowProc(Window, AMessage, WParam, LParam);
end;
// Registriram klasu prozora -> !. stvar koja se mora napraviti
function Registriram: Boolean;
var
WindowClass: TWndClass;
begin
WindowClass.Style := cs_hRedraw or cs_vRedraw;
WindowClass.lpfnWndProc := @WindowProc;
WindowClass.cbClsExtra := 0;
WindowClass.cbWndExtra := 0;
WindowClass.hInstance := HInstance;
WindowClass.hIcon := LoadIcon(hInstance, 'ikona');
WindowClass.hCursor := LoadCursor(0, idc_Arrow);
WindowClass.hbrBackground := HBrush(Color_Window);
WindowClass.lpszMenuName := nil;
WindowClass.lpszClassName := AppName;
Result := RegisterClass(WindowClass) <> 0;
end;
// Kreiram klasu prozora -> 2. stvar koja se mora napraviti
function Kreiram: HWnd;
var
Dimenzije: Integer;
begin
hWindow := CreateWindow(AppName,
'BT Detection',
WS_OVERLAPPED {or WS_MINIMIZEBOX} or WS_SYSMENU,
{WS_DLGFRAME, WS_CAPTION,WS_BORDER or ws_OVERLAPPEDWINDOW}
50,
50,
250,
150,
0,
0,
HInstance,
nil);
if hWindow <> 0 then
begin
ShowWindow(hWindow, CmdShow);
UpdateWindow(hWindow);
end;
Result := hWindow;
end;
// Ovo se prvo izvršava !!!!
var
AMessage: TMsg;
begin
if not Registriram then
begin // Pozovi funkciju Registriram -> Ako ne uspije ubij aplikaciju
MessageBox(0, 'Register failed', nil, mb_Ok);
Exit;
end;
hWindow := Kreiram;// Pozovi funkciju Kreiram -> Ako ne uspije ubij
aplikaciju
if hWindow = 0 then
begin
MessageBox(0, 'WinCreate failed', nil, mb_Ok);
Exit;
end;
// Ovo daje true sve dok nije pozvana naredba PostQuitMessage(0) LOOP
// Hvata poruke poslane od i prema aplikaciji
while GetMessage(AMessage, 0, 0, 0) do
begin
TranslateMessage(AMessage);
DispatchMessage(AMessage);
end;
Halt(AMessage.wParam);
end.
> > zašto onda kompajlirano iznosi 305Kb
> >
> > jel se to može nekako smanjiti na recimo 20Kb jer mislim da ovakva
> > aplikacije ne bi trebala više od toga zauzimati
> >
>
> Moze se smanjiti tako da za kreiranje objekata koristis API pozive, a ne
> standardne forme, gumbe....
> Ako bilo sta dodajes jos u taj svoj projekt, velicina kompajliranog file-a
> nece bitno promjeniti velicinu... Ovisi o unit-ima koje pozivas u programu
> (uses lista).
Moze se smanjiti i bez koristenja API-ja. Naime, recimo MS alati imaju svoje
runtime DLLove koji se nalaze u Windowsima, ako i ti "rastavis" program na
dijelove i snimis potrebne DLL-ove u npr. windows dir - i ti ces moci
napraviti .exe od 20 kb.
Stovise, cak sam se iznenadio kad je ispalo da Delphi moze napraviti manji
.exe od .NET studia (za neki jednostavan primjer).
> Moze se smanjiti i bez koristenja API-ja. Naime, recimo MS alati imaju
svoje
> runtime DLLove koji se nalaze u Windowsima, ako i ti "rastavis" program na
> dijelove i snimis potrebne DLL-ove u npr. windows dir - i ti ces moci
> napraviti .exe od 20 kb.
Stoji, samo sto su ti "run time dll-ovi" par MB pa za distribuciju
aplikacije trebas dodati i tih par MB sto je onda i gore od 300kb. Isplativo
kad imas paket programa, ali za samostojecu aplikaciju - NE.
Meni osobno ide na zivce kad instaliram neki program i onda moram uzeti
BUG-ov CD da stavim i run time za njega - program je mali, ali da nema BUG-a
i CD-a bil bi jako velik (jer bi moral downloadati run time s weba isl.
Borlandovih dpl-ova nema na BUG-ovim CD-ovima i to je mali problemich za
takve distribucije, ne?
> Stovise, cak sam se iznenadio kad je ispalo da Delphi moze napraviti manji
> .exe od .NET studia (za neki jednostavan primjer).
Delphi rules ;-)
Robert
>program Project1;
>uses
> Dialogs;
>begin
> showmessage('Warning: This EXE file is to big, you must reinstall
>Windows!');
>end.
program Project1;
uses
Windows;
begin
MessageBoxA(0,'Ovo je poruka','Naslov Pozorcica',MB_OK);
end.
Ispadne oko 15Kb. :) Za detaljnije koristenje Win32APIja imas help s
Delphijem, ali bih ti preporucio da nabavis MSDN help koji je
detaljniji.
A inace, zar ti je vazno sto je program 200 Kila, pukni ga UPXom,
smanjis ga upola, a 100ak kila je sitno za danasnje programe. Jos
pogotovo sto nakon sto je ovo kao neka pocetna velicina koja se nece
znacajno povecati dodavanjem jos elemenata u program.
--
: Night Rider -a-k-a- [NeveR] http://nrx.da.ru ...
: Windows message: "CPU not found. Software emulation"
hm... to znaci da za pokrenut exe na drugom kompjuteru
koji nema instaliran builder (recimo 4.0)
treba na njega kopirat .bpl fileove
jel se moze tu znat koje bpl fileove treba kopirat i
gdje to treba stavit
pogledas u packadges kaj je u kojem od njih i pogledas kaj ti koristis - pa
kopiras samo njih. Ima cak i neki programcic na Borlandovom siteu koji
pogleda koje su komponente koristene u programu
Robert
>begin
> MessageBoxA(0,'Ovo je poruka','Naslov Pozorcica',MB_OK);
>end.
Samo opaska: primjetio sam da furaš ove ime_funkcijeA i ime_funkcijeW
deklaracije što je neportabilno. Ne bi li Delphi negdje unutar svojih
zaglavlja i nekog rudimentnog predprocesora trebao pretpostaviti
koristi li se ANSI ili Unicode i potom wrappati jednu od gornje dvije
navedene funkcije u poziv obične ime_funkcije funkcije?
--
Ignorance is bliss.
Nisam baš siguran da se taj Borlandov programčić bavi package-ima.
Moj savjet je da pogledaš listu u D5 Project|Information, a ako nije
točna imaš i sofisticiranije oruđe:
http://www.drbob42.first-web.com/required.zip
---
Danilo Cuculic
U pravu si - Delphi to radi sam...
Robert
Nisam rekao da veli koji packadge nego "koje su komponente koristene unutar
programa", ne?
Robert
>Samo opaska: primjetio sam da furaš ove ime_funkcijeA i ime_funkcijeW
>deklaracije što je neportabilno. Ne bi li Delphi negdje unutar svojih
>zaglavlja i nekog rudimentnog predprocesora trebao pretpostaviti
>koristi li se ANSI ili Unicode i potom wrappati jednu od gornje dvije
>navedene funkcije u poziv obične ime_funkcije funkcije?
Mda, imas pravo sto se toga tice. Isao sam nabrzinu sloziti programcic
koji radi pa nisam ni obracao previse paznju ...
Točno, nisi to rekao, samo sam stvar prokomentirao u svjetlu prvobitno
postavljenog pitanja.
---
Danilo Cuculic