[ bojan21 @ 18.07.2006. 18:00 ] @
| Pravim jedan prost program i zelim da ga podelim na delove (znaci vise DLL-ova)!!! Ipak kad iskompajliram jedan DLL on zauzima skoro 400Kb!!! Znaci oko 5 DLL-oav i to dodje na 3MB (ukljucen i exe) !!! Previse za mali program!!! Da li neko zna kako smanjiti velicinu ovih DLL-ova? Velicina im se povecava zbog unit-a koji moraju da se dodaju za neku funkciju ili proceduru! Ali ako meni svih pet DLL-ova koriste recimo i Windows.pas i Registry.pas i Forms.pas sta da uradim da oni zajednicki koriste te unit-e a ne da ih svaki posebno stavlja u svoj DLL??? |
[ bojan21 @ 18.07.2006. 18:36 ] @
A da!!! I sta je to staticko a sta dinamicko povezivanje???
[ opcode @ 18.07.2006. 19:35 ] @
Daj kod da vidim, ne mogu ti ovako napamet pomoc..
ako imas neki blabla.dll i u njemu funkciju koja glasi:
function zbroji(br1,br2:integer):integer;
begin
Result:=br1+br2;
end;
Staticko povezivanje iz programa:
Code:
function zbroji(br1,br2:integer):integer; stdcall; external 'blabla.dll' name 'zbroji';
Dinamicko povezivanje:
Code:
type tf=function (br1,br2:integer):integer;
var M:HModule;
f:tf;
M:=LoadLibrary('blabla.dll');
@t=GetProcAddress(M,'zbroji');
writeln(t(3,3));
FreeLibrary(M);
[ icobh @ 18.07.2006. 21:16 ] @
[ Rapaic Rajko @ 18.07.2006. 21:34 ] @
Radis u Delphi-ju, je li tako?
Onda koristi bpl-ove, a ne dll-ove. Bpl - Borland Pascal Library je unapredjena (Borlandova) verzija dll-a, i ima tu prednost sto mogu da se importuju i klase, a ne samo funkcije i procedure. Zatim, podesi se za sve bpl-ove (i exe) check-irano "Build with runtime libraries" i to je to.
Rajko
[ Srki_82 @ 19.07.2006. 07:12 ] @
Dllovi su ti veliki verovatno zato sto koristis unite vezane za VCL (forms, stdctrls,...). Ako mozes da izbegnes koriscenje tih unita dobio bi manji fajl i dll za tvoj program ne bi morao da se pise samo u Delphiu.
Bpl fajlovi imaju par kvaka... kada ukljucis opciju Build with runtime libraries i kompajliras program, moraces da distribuiras sve bplove koje program koristi... znaci, minimum rtl i vcl. Da bi program mogao da koristi bpl kako treba, i program i bpl moraju biti iskompajlirani u istoj verziji Delphia. Ako pravis neki program koji treba da podrzava third party dodatke, onda ti ovo nikako nece ici na ruku, ali ako sam pises program i dodatke onda ti ovo nece mnogo smetati.
I bpl i dll imaju prednosti i mane... na tebi je da odlucis sta ti vise odgovara.
[ bojan21 @ 23.07.2006. 14:51 ] @
Pravim taj program u delphiu i za sad imam 3 dll-a sa funkcijama koje poziva program!!! Jedan je 14,5kb (ok), jedan 80kb (ok) a glavni 359kb (uuh)!!! U tom glavnom dll-u koristim unite: StdCtrls, ComCtrls, ExtCtrls... Medjutim ako stavim samo StdCtrls opet je 359kb ili ako ostavim samo ExtCtrls opet je velicina 359kb!!! Molim Vas recite mi kako samo da sttavim da nekako dll-ovi zajednicki koriste unit-e , a ne svaki da ga stavlja u svoje uses zaglavlje!!! Dll-ove koristim jer ako bude potreban neki update za program samo zamenim jedan dll!!!
[ Srki_82 @ 23.07.2006. 15:03 ] @
I StdCtrls i ComCtrls i ExtCtrls su sve uniti koji imaju veze sa VCL. Ako hoces da ti dll bude mali, ne smes da koristis ove unite. Nema tu pomoci... mozes da probas da ih smanjis programom UPX, ali ce i dalje biti dosta veliki. VCL je napisan tako da bude lak za upotrebu, ali je losa strana to sto izvrsni fajl jednostavno bude velik.
Svaki dll koji pravis mora sam da uzme unite koji mu trebaju i svaki u kojem imas u uses delu neki unit koji ima veze sa VCL ce biti velik.
Mozda bi mogao da postavis ovde kod pa ce ti neko sa vise iskustva pomoci da napises dll koji ce raditi ono sto zelis i bez VCL unita.
[ bojan21 @ 23.07.2006. 15:10 ] @
Taj dll koristim da prevedem program!!! Ako recimo program koristi engleski i srpski i korisnik hoce da prevede program sa jednog na drugi on poziva dll koji ce prevesti program!!! Zato moram da Koristim StdCtrls (za labele i ostalo), ExtCtrls i ComCtrls!!! Hvala u svakom slucaju!!!
[ bojan21 @ 23.07.2006. 15:11 ] @
A da!!! Gledam sad neki program na kompu koji takodje koristi dll-ove da prevede program (ima english.dll , serbian.dll , denmark.dll ... i svaki zauzima oko 80kb)!!! Kako ja to da postignem!!!
[ bojan21 @ 23.07.2006. 15:13 ] @
Ili predlozi mi koje je najbolje resenje za program ako planiram da pravim update za njega a program je veoma mali (oko 3MB) i prost (tipa ScreenShot manager-a)!!!???
[ Srki_82 @ 23.07.2006. 15:18 ] @
Zasto moras da koristis te unite!?
Mozes dllu da posaljes npr. MainForm:ButtonOpen:Caption, a dll u tabeli pronadje string koji tu treba da stoji i posalje ti npr: &Otvori, zatim posaljes npr. MainForm:ButtonOpen:Font, a dll ti vrati Tahoma:10:Bold+Italic, pa posaljes npr. MainForm:ButtonOpen:Hint, a dll vrati Klikom na ofo dugme otvarate fajl, itd, itd...
Ne samo sto mozes da uradis lokalizaciju na ovaj nacin, nego mozes svaki property da definises u dllu.
[ bojan21 @ 23.07.2006. 15:25 ] @
Nisam ovo razumeo!!! Kakav je ovo kod:
Code:
MainForm:ButtonOpen:Caption
zar ne treba da stoje tacke umesto dvotacki???
I kakve tabele???
Ako moze tako onda je problem resen :)!!!
[ bojan21 @ 23.07.2006. 15:26 ] @
Nisam ovo razumeo!!! Kakav je ovo kod:
Code:
MainForm:ButtonOpen:Caption
zar ne treba da stoje tacke umesto dvotacki???
I kakve tabele???
Ako moze tako onda je problem resen  !!!
[ Srki_82 @ 23.07.2006. 15:50 ] @
Ok... sad cu malo da ti sazvacem ovo :)
Iz dlla exportujes funkciju koja izgleda npr. ovako:
Code: function GetLocalizedData(ControlProperty: PChar; Data: PChar; var DataSize: Integer): Integer; stdcall;
Dakle... u prvom parametru saljes string kojim trazis sta hoces, drugi parametar je string u kojem ces dobiti rezultat, treci parametar predstavlja koliko mesta imas u tom stringu.
Dll ce da uzme ControlProperty strign i recimo da u njemu pise MainForm:ButtonOpen:Caption... svoj dll mozes da hardcodiras i da napises nesto kao:
Code: if ControlProperty = 'MainForm:ButtonOpen:Caption' then
vrati Otvori
mada bi najbolje bilo na imas neki script fajl u kome ces definisati sta dll da vrati kad treba tako da neces morati da pises dll za svaki jezik nego da pises u obicnom notepadu samo skriptu koja bi izgledala recimo ovako:
Code: MainForm:ButtonOpen:Caption="Otvori"
Kad dobijes string koji treba da vratis, prvo pogledas da li je Data razlicito od nil i da li je DataSize vece ili jednako s duzinom stringa koji treba da vratis. Ako je tako samo upises string u Data i vratis duzinu stringa koju si upisao (sve je proslo ok). Ako je Data nil ili u DataSize kaze da ima manje mesta nego sto treba, onda samo vratis duzinu stringa koju treba da upises.
u glavnom programu funkciju pozivas npr ovako:
Code: procedure NekaProcedura;
var
DataString: String;
begin
SetLength(DataString, GetLocalizedData('MainForm:ButtonOpen:Caption', nil, 0));
GetLocalizedData('MainForm:ButtonOpen:Caption', PChar(DataString), Length(DataString));
btnOpen.Caption := DataString;
end;
Nadam se da je sad bilo jasno.
[ bojan21 @ 23.07.2006. 15:56 ] @
Hvala ti probacu pa cu da ti javim!!! I jos jedno pitanje: kako iz dll-a da direktno pozovem promenu na primer:
Code:
procedure ChangeCaption; stdcall;
begin
Form1.Caption:= 'Dll';
end;
Meni prijavljuje gresku kad ovu funkciju pozovem iz aplikacije!!!
[ Srki_82 @ 23.07.2006. 16:07 ] @
Obican dll ne moze to da radi, ali zato moze bpl :)
Pogledaj u helpu razlike izmedju dll i bpl biblioteka.
P.S. Slobodno me cimni ba neki od messengera pa cu ti pomoci.
[ bojan21 @ 23.07.2006. 16:23 ] @
Cekaj malo!!! Kako da napravim bpl??? Gde le opcija za bpl u New->???
[ Srki_82 @ 23.07.2006. 17:57 ] @
Bpl pravis tako sto izaberes File->New->Other->Package (tako je bar u Delphi 7 ako se ne varam).
Obrati paznju i na sve nezeljene posledice koje imas ako hoces da koristis bpl. Program moras da linkujes sa runtime bibliotekama i zbog toga uz svoj program moras da saljes i vcl.bpl, rtl.bpl i svaki bpl za kontrole koje koristis. Takodje, ako ikad predjes na neku drugu verziju Delphia, bpl koji kompajliras nece biti kompatibilan sa exe fajlom.
[ bojan21 @ 23.07.2006. 19:27 ] @
Pa oce onda manje zauzimati program sa bpl fajlovima ili sa dll-ovima (ako je razlika do 300kb onda nista)!!!???
[ Srki_82 @ 23.07.2006. 21:29 ] @
Hehe, pa ne vidim svrhu koriscenja bpl fajlova ako neces koristiti klase (uglavnom VCL) u njima :) Sa bpl ce ti dodaci za program imati mnoooogo vecu moc nego da su dll, ali ce biti vise fajlova uz exe i verovatno ce biti veci.
[ Vladica Savić @ 24.07.2006. 17:12 ] @
Nadam se da necu mnogo da odstupim od teme jer koliko sam video sve ovo je radi lokalizacije programa, mene zanima moze li da se koristi za tako nesto neki *.Ini fajl iz kog bi se citali caption-i, text i sl. vrednosti i na osnovu toga se vrsila lokalizacija? Ako moze, zar to ne bi bio jednostavniji nacin da se dodje do resenja?
Bas me zanima 
[ Srki_82 @ 25.07.2006. 08:46 ] @
Hehe... tako je, uvek sam koristio "neki ini fajl" za cuvanje podatka o lokalizaciji, ali decko se vezao dlla 
[ Vladica Savić @ 25.07.2006. 16:55 ] @
Pa, mozda je njemu ovo lakse, ko ce ga znati... 
[ bojan21 @ 25.07.2006. 21:25 ] @
Pa mogu i preko ini fajla ali recimo sta ako dodam nesto novo, nece mi biti dovoljno da promenim samo ini fajl, treba dodati funkciju u dll!!!
[ bojan21 @ 25.07.2006. 21:38 ] @
Srki nisu ti losi oni tutorijali ali zasto ne dodas jos neki??? (mislim na http://www.progtuts.co.sr/ )
[ Srki_82 @ 26.07.2006. 00:55 ] @
Ne moras dodati funkciju u dll-u, ako je prvi put napises da bude dovoljno flexibilna :)
Trenutno pisem nene tutoriale za OpenGL koji rade na skoro svim pltformama (Lazarus/FPC kompajler) i radim na par projekata pa nemam vremena da pisem tutoriale za Delphi, a i onako Delphi vec dugo nisam pokretao. Nekako mi se Lazarus cini mocnijim :)
[ bojan21 @ 26.07.2006. 17:25 ] @
Sta je to Lazarus? I sta je OpenGL tacno (kratko necu da te smaram)!!!???
[ Srki_82 @ 26.07.2006. 20:01 ] @
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|