[ gajo2 @ 03.10.2006. 15:16 ] @
Pozdrav,

Citao sam negde da u Delphiju nije moguce staticko linkovanje .lib fajlova, kao npr. u C-u. Da li medjutim ipak postoji neki nacin? Razmisljao sam da spojim DLL sa EXE fajlom, pa onda prilikom startovanja iscitam bajtove iz EXE fajla i da napravim temp fajl, tj. moci ce da se poveze sa programom. Medjutim mnogo bolje bi bilo kad bi postojao neki vec postojeci nacin u Delphiju.

Inace koristim Delphi 5.
[ savkic @ 03.10.2006. 17:45 ] @
> Citao sam negde da u Delphiju nije moguce staticko linkovanje .lib fajlova, kao npr. u C-u. Da li medjutim ipak postoji neki nacin?

Lib fajlovi su specifični za C, statičko povezivanje možeš ostvariti i u Delphiu ali na drugi način.

> Razmisljao sam da spojim DLL sa EXE fajlom, pa onda prilikom startovanja iscitam bajtove iz EXE fajla i da napravim temp fajl, tj. moci ce
> da se poveze sa programom. Medjutim mnogo bolje bi bilo kad bi postojao neki vec postojeci nacin u Delphiju.

Nisam te uopšte razumeo, objasni šta zapravo hoćeš.

[ gajo2 @ 03.10.2006. 18:02 ] @
:)

Ovako, imam exe fajl sto sam napravio u Delphiju. Spojim ovaj exe fajl sa jednim zip fajlom. To mogu da uradim npr. sa

copy /b program.exe /b + arhiva.zip /b rezultat.exe /b

Dakle rezultat.exe sadrzi i moj program i zip fajl. E sada, kada se pokrene ovaj program i korisnik pritisne dugme Extract, onda se desava sledece:
1) Napravim kopiju exe fajla
2) Otvorim tu kopiju
3) Seek-ujem do 232632-tog bajta, i nakon toga ostatak upisujem u jedan poseban fajl
4) Taj poseban fajl je zapravo onaj prvobitni ZIP fajl
5) Sada, koristeci ZipMaster biblioteku, ja extractujem taj zip fajl negde
6) Na kraju brisem temp fajlove

Ovo sve lepo radi, ali problem je sto ZipMaster koristi poseban fajl DelZip179.dll, tj. bez njega nece da radi. Posto je glupo da imas self-extracting arhivu koja ne radi bez nekog dll-a, onda je resenje da taj dll linkujem zajedno sa ostatkom programa u jedan jedinstven exe fajl, tj. da uradim staticki link.

Kako se ovo moze uraditi u Delphiju?
[ reiser @ 03.10.2006. 18:05 ] @
Hm.. nisam siguran da te razumem, ali mozda mozes to da izvedes tako sto ces mapirati fajl sa CreateFileMapping, MapViewOfFile etc...
Ako lupam brisite :)
[ gajo2 @ 03.10.2006. 18:07 ] @
Ono moje (glupavo) resenje je da spojim

program + dll + zip

pa posle kada se pokrene program da kopiram sve izmedju 232632-og i 436265-og bajta u jedan poseban dll fajl, i posle uradim LoadLibrary. Onda sve posle 436265-og bajta kopiram u poseban zip fajl itd.

Ali ovo se sigurno moze uraditi i lakse, tj. statickim linkovanjem.
[ gajo2 @ 03.10.2006. 18:09 ] @
Citat:
Hm.. nisam siguran da te razumem, ali mozda mozes to da izvedes tako sto ces mapirati fajl sa CreateFileMapping, MapViewOfFile etc...
Ako lupam brisite :)

Nemoguce da me niko ne razume!!! Pa meni je sve jasno! :)
[ Miloš Baić @ 03.10.2006. 19:31 ] @
Pozdrav,

verovatno si malo zakomplikovao pitanje, siguran sam da si bolje objasnio i rešenje bi dobio brzo.
Možda ti je pristup rešenju problema pogrešan. To često zna biti problem.
[ delalt @ 03.10.2006. 20:07 ] @
Citat:
gajo2: Nemoguce da me niko ne razume!!! Pa meni je sve jasno! :)

Je'l to hoćeš da uradiš neku samoraspakirajuću instalaciju ili tražiš način da zaštitiš svoj program?
Za ovo prvo sam siguran da imaš već gotova rješenja (besplatna). Možda ti je stvarno pristup pogrešan.
Pojasni malo, kakva je svrha toga.
[ gajo2 @ 03.10.2006. 20:18 ] @
Pa zelim da napravim self-extracting ZIP fajl. To je sve. Imam svoj exe fajl, i posle njega ide zip fajl. Moj exe fajl raspakuje zip fajl.

Meni je problem samo sto koristim ZipMaster biblioteku, koja zahteva jedan DLL fajl. Ja zelim da svako moze da pokrene exe fajl bez ovog dll-a. Resenje za to je da se dll staticki linkuje sa ostatkom programa.

Ili jednostavno receno, kako mogu staticki da linkujem LIB fajl u Delphiju?
[ savkic @ 03.10.2006. 20:50 ] @
> copy /b program.exe /b + arhiva.zip /b rezultat.exe /b

> Dakle rezultat.exe sadrzi i moj program i zip fajl. E sada, kada se pokrene ovaj program i korisnik pritisne dugme Extract, onda se desava sledece:
> 1) Napravim kopiju exe fajla
> 2) Otvorim tu kopiju
> 3) Seek-ujem do 232632-tog bajta, i nakon toga ostatak upisujem u jedan poseban fajl
> 4) Taj poseban fajl je zapravo onaj prvobitni ZIP fajl
> 5) Sada, koristeci ZipMaster biblioteku, ja extractujem taj zip fajl negde
> 6) Na kraju brisem temp fajlove

> Ovo sve lepo radi, ali problem je sto ZipMaster koristi poseban fajl DelZip179.dll, tj. bez njega nece da radi. Posto je glupo da imas
> self-extracting arhivu koja ne radi bez nekog dll-a, onda je resenje da taj dll linkujem zajedno sa ostatkom programa u jedan jedinstven
> exe fajl, tj. da uradim staticki link.

Evo kako je lakše kada opišeš pravi problem. Nije neophodno da radiš tako kako si naumio, postoje biblioteke (recimo Chief's UNZIP ) za unzip sa source kodom tako da ih možeš slobodno uvezati sa ostatkom programa. Varijanta dva je da ne koristiš zip kao arhiver već zlib koji je dobro podržan u Delphiu i može se uključiti u sam exe.
Ako je iz nekog razloga ZipMaster obavezan uslov, dll možeš uključiti u exe kao resurs, raspakovati ga kada ti zatreba i posle ga obrisati.

> Ili jednostavno receno, kako mogu staticki da linkujem LIB fajl u Delphiju?

Nije moguće. Koristiš pogrešnu terminologiju, lib fajl sadrži informacije o načinu povezivanja programa i funkcija koje se nalaze u dllu, on ne sadrži izvršni kod i ne može se ni uključiti u exe, ono što se može uključiti u exe su .obj fajlovi.
[ delalt @ 03.10.2006. 21:39 ] @
Ako baš hoćeš sam nešto da radiš onako kako si započeo, iz Delphi-ja, pogledaj ovaj link:

http://delphi.about.com/od/objectpascalide/a/stub.htm

Ako ti to ne pomogne, možeš koristiti recimo 7-zip:

http://www.gdgsoft.com/faq/7zsfx.htm
[ Miloš Baić @ 03.10.2006. 21:48 ] @
Donji link ne ide!?!
[ reiser @ 03.10.2006. 22:28 ] @
U svakom slucaju, ne moras da koristis bas ZIP algoritam za pakovanje fajla, uzmi LZMA recimo koji ima identicni compression ratio, a ne treba ti nikakav dodatni DLL, vec samo jedan unit i nekoliko obj fajlova
[ Srki_82 @ 03.10.2006. 23:08 ] @
Delphi ne moze da linkuje *.lib fajlove, ali ima mogucnost da linkuje *.obj fajlove koji su, takodje, prilicno rasprostranjeni.

U tom obj fajlu moras da imas iskompajliran ceo dll koji ti treba. Ti sam ne mozes nikako od dll fajla napraviti lib ili obj fajl. Taj fajl moras da trazis/skines od kreatora dll fajla.

Cak i ako imas obj fajl, u njemu mora biti kompletan kod dlla... jer ako imas obj fajl koji radi LoadLibray, dll fajl ce ti opet trebati.

Ukratko, ako sa mesta gde si skinuo dll nemas obj fajl za staticko linkovanje, od posla nema nista.
[ Nemanja Avramović @ 04.10.2006. 11:08 ] @
Čekaj, da razjasnimo terminologiju Statičko linkovanje biblioteka je kada biblioteku učitavaš po pokretanju programa (samim tim ako ista ne postoji program neće raditi) a dinamičko linkovanje je kada biblioteku učitavaš onda kada ti zatreba neka njena funkcija. Ako ti je problem samo to što hoćeš da imaš aplikaciju "bez dll-ova" odnosno da ubaciš dll u exe, to možeš preko resursa, ali fajl opet moraš da izdvojiš u neki privremeni fajl. Ako je problem do kompresovanja, možeš da uzmeš recimo ZipForge, to je "native vcl", sve ide u exe fajl, bez dodatnih fajlova, a besplatna je za ličnu upotrebu. Besplatna verzija nema ama baš nikakva ograničenja
[ gajo2 @ 05.10.2006. 17:53 ] @
Evo konacno sam uspeo da sredim da sve radi :)

Napisao sam pismo autoru ZipMastera koji mi je rekao da postoji jedan RES fajl koji mogu kompajlirati sa programom i onda mi ne treba DLL. Na zalost, exe fajl onda postaje minimalno 350 KB, sto je preveliko.
Probao sam sa Chief's Zip bibliotekom, ali ona je napisana za Delphi 3 i ranije verzije, i koriste se unit-i koji vise ne postoje u Delphiju 5 (WinCrt, WinDos, Strings...)

Na kraju sam iz jednog linka sto ste ga ovde postovali nasao biblioteku Abbrevia. E to je pravo cudo, ne treba mu nikakav DLL a zauzima samo 15 KB kada se doda programu. Jako dobra stvar. Za svaki fajl sto se ekstraktuje iz arhive mozes posebno da navedes sta da se radi s njim, npr. ako je password-protected da izbaci dijalog za unos lozinke.

Dakle na kraju ispada da radi i sa ZIP arhivama koji su password-protected i kompresovani sa Winzip 9-ovom "Enhanced deflate (not portable)", tako da nemam reci, autori su stvarno majstori. Nakon UPX-a exe fajl je "samo" 200 KB, sto je dovoljno dobro.

Hvala svima na komentarima i savetima!