offline
- Brksi
- Ex KGB officer
- Pridružio: 18 Jul 2003
- Poruke: 4204
- Gde živiš: U zlatnom kavezu
|
Tutorijal by Krckoorascic (doslo je do neke zbrke pa ga zato ja postujem sorry krcko)
U ovom tutorijalu cu objasniti kako je moguce "napraviti" .exe iz vb programa.
Neko ce pitati: "Za sta ce mi to???", pa razlozi su mnogi, recimo da zelite da napravite
svoj SFX (ovaj nacin koji cu ja opisati, zapravo slican, koristi WinRAR kod pravljenja
svojih sfx arhiva a verovatno i mnogi drugi arhiveri mada za ostale nisam siguran jer koristim
samo WinRAR) ili jednostavno zelite da ubacite podatke u vec kompilovan exe.
Pa, da pocnemo; prvo sto vam treba je Visual Basic 6 Very Happy (ovaj kod nije kompatibilan sa VB5 jer
ima razlike u PropertyBag objektu u VB6 i VB5 i to ogromne :p ali moguce je uraditi ovo isto
ali na malo drugaciji nacin i u VB5, no, to necu ovde objasnjavati) sa ucitanim Resource Editorom.
Za one koji ne znaju sta/gde je ResEdit: Resource Editor je AddIn za VB. Ako u 'Project' meniju nemate
'Add New Resource File' onda u 'AddIn' meniju izaberite 'AddIn Manager' i u dobijenoj listi pronadjite
'VB 6 Resource Editor', selektujte ga i cekirajte 'Loaded/Unloaded' i 'Load on Startup' checkboxeve.
Potvrdite sa 'OK' i Resource Editor je ucitan. Resource Editor ce biti koriscen kasnije, mnogo kasnije...
Prvo da pripremimo okruzenje za razvoj ove aplikacije (za pocetnike):
Prozori koji ce nam biti potrebni su 'Project Explorer' (ako ga nemate pritisnite Ctrl+R)
zatim 'Properties Window' (hotkey: F4) i naravno 'Toolbox' Very Happy (ako nije otvoren??? izaberite
u 'View' meniju stavku 'Toolbox')
Sada pokrenite novi projekat (ako vec niste) Standard EXE tipa.
Nazovite ga prjCompiler (klik na Project1 u Project Exploreru i pod '(Name)' u Properties Windowu
otkucajte prjCompiler). Automatski generisanu formu 'Form1' preimenujte u 'frmMain'.
Takodje promenite 'Caption' u nesto lepse, recimo 'Compiler'.
Mozete i da promenite 'BorderStyle' property na '1 - Fixed Single' i 'MinButton' na 'True'.
(ovo sa ivice i min dugme nije potrebno, ali je lepse :p)
I (ako hocete, naravno) izaberite neku lepu ikonicu za frmMain, to ce ujedno biti i ikonica
vaseg programa kada ga budete kompilovali.
Trebace nam Open i Save dijalozi, da se ne bi zezali sa API-jima (ovo je ipak begginer level tutorijal Very Happy)
koristicemo Microsoft Common Dialog kontrolu. Dodajte je u projekat: meni 'Project', pa 'Components' (ili
jednostavno pritisnite Ctr+T) u dobijenom prozoru (u prvom tabu, 'Controls') pronadjite
'Microsoft Common Dialog Control 6.0 (SP6)' (kod vas mozda nece biti '(SP6)' ili ce biti neki drugi)
i cekirajte je, potvrdite sa jednim Enterom i dobicete novu kontrolu u Toolboxu.
Postavite jedan Common Dialog na frmMain i nazovite ga (promenite '(Name)' u Properties prozoru) CD
Kliknite desnim tasterom na dijalog i u padajucem meniju izaberite 'Properties', u prvom tabu
('Open/Save As') cekirajte 'Cancel Error' i zatvorite prozor sa OK.
Sada na frmMain dodajte dve 'TextBox' kontrole nazovite ih txtTitle i txtDescription.
txtDescription malo rasirite (da moze da stane vise linija texta) i promenite mu 'Multiline'
property na 'True'i 'ScrollBars' na '2 - Vertical' izbrisite 'Text' properti oba TextBoxa.
Zatim dodajte jedan 'PictureBox' i nazovite ga 'picPreview'. Sada nam trebaju tri 'CommandButton'
kontrole. Nazovite ih 'cmdBuild', 'cmdPicture' i 'cmdExit'. Kao Caption im stavite (redom) '&Build EXE',
'Browse for &picture' i '&Exit' (slova koja se nalaze posle & ce biti podvucena i omogucavace kombinaciju
'Alt+podvucenoslovo'). Slozite kontrole kako zelite. Mozda cete zeleti i da dodate Label kontrole cisto da
bi vasa aplikacija izgledala "profesionalnije" (pogledajte u projektu koji sam uploadovao kako sam ja to
uradio)...
E zavrsismo sa grafickim okruzenjem, napokon (imate srece sto ovo ne objasnjavam u C++u :p)
sada otvorite 'Code View' (kliknite na frmMain u Project Exploreru i kliknite na malu belu ikonicu u
toolbaru Project Explorera) i otkucajte ovaj kod (preporucujem da ga NE kopirate):
Kod:
Option Explicit
Private Sub cmdBuild_Click()
On Error Resume Next '//zbog CancelError-a dijaloga
CD.DefaultExt = ".exe" '//dodaje .exe ako korisnik nije sam uneo
CD.FileName = "" '//"cistimo" od predhodnog dijaloga
CD.Filter = "Executables (*.exe)|*.exe" '//hocemo da dijalog pokazuje samo .exe fajlove
Call CD.ShowSave '//pozivamo Save As dijalog
If Err.Number = cdlCancel Then Exit Sub '//korisnik je pritisnuo 'Cancel'
If Dir(CD.FileName) <> vbNullString Then '//fajl postoji
Dim msgRet As VbMsgBoxResult
msgRet = MsgBox("File '" & Dir(CD.FileName) & "' already exists." & _
vbNewLine & "Do you want to overwrite it?", _
vbYesNo + vbExclamation, "Overwrite?")
If msgRet = vbNo Then Exit Sub '//korisnik je odabrao 'No', znaci ne radimo nista
'//ako je izabrano 'Yes' pokusavamo da obrisemo fajl
Err.Clear
On Error Resume Next
Call Kill(CD.FileName)
If Err.Number <> 0 Then '//greska prilikom brisanja fajla
Call MsgBox("Couldn't delete file.", vbCritical, "Error")
Exit Sub '//izlazimo iz ove procedure
End If
End If
'//pozivamo BuildExe
Call BuildExe(CD.FileName, txtTitle.Text, txtDescription.Text, picPreview.Picture)
End Sub
Private Sub cmdPicture_Click()
On Error Resume Next '//zbog CancelError-a dijaloga
CD.DefaultExt = ".bmp" '//nije potrebno...
CD.FileName = ""
CD.Filter = "Pictures|*.bmp;*.jpg;*.gif;*.ico" '//prikazuje samo bmp, jpg, gif i ico fajlove
Call CD.ShowOpen '//pozivamo Open dijalog
If Err.Number = cdlCancel Then Exit Sub '//proveravamo Cancel
If Dir(CD.FileName) = vbNullString Then '//"izabrani" fajl ne postoji
Call MsgBox("File not exists.", vbExclamation, "Error")
Exit Sub
End If
Err.Clear '//da "ocistimo" Error objekat za svaki slucaj...
On Error Resume Next
'//ucitavamo sliku u picPreview
picPreview.Picture = LoadPicture(CD.FileName)
If Err.Number <> 0 Then '//greska!!!
Call MsgBox(Err.Description, vbCritical, "Error")
End If
End Sub
Private Sub cmdExit_Click()
On Error Resume Next '//nije potrebno ali kao preventiva... :D
Call Unload(Me) '//izlazimo iz programa...
End Sub
Kod je komentarisan i trebalo bi da bude lak za shvatiti. Jedino sto vas mozda cudi to je
poziv ka nekoj 'BuildExe' funkciji e tu funkciju (koja je glavna tema ovog tutorijala) cemo
sad da napisemo.
Sada bi nam trebao jedan modul (nije potrebno ali je tako bolje da bismo odvojili kod za
generisanje .exe-a od koda za korisnicki interfejs...)
Dakle: desni klik u Project Exploreru i izaberite 'Add/Module', u dobijenom prozoru (u 'New'
tabu) kliknite na 'Open' i 'Module1' ce automatski biti dodat u vas projekat (videcete ga u
Project Exploreru). Promenite mu ime u 'modCompile', zatim ispisite ovaj kod u njega (opet vas
toplo savetujem da NE kopirate, znam da je lakse iskopirati ali tako necete nista nauciti :p)
Kod:
Option Explicit
Public Sub BuildExe(sDest As String, sTitle As String, sDesc As String, sPic As StdPicture)
On Error GoTo errH '//kada dodje do greske idi na errH: label (vidi dole)
Dim PropBag As New PropertyBag '//PropertyBag objekat u koji cemo upisati podatke
Dim ff As Integer '//za open
Dim exe() As Byte '//u ovaj byte array cemo da ucitamo exe iz resourcea
Dim length As Long '//velicina "praznog" exe-a tj. pozicija sa koje kasnije citamo podatke
Dim msgRet As VbMsgBoxResult '//za pitanje na kraju
Screen.MousePointer = vbHourglass '//postavljamo pescanik kao kursor
frmMain.Enabled = False '//"zakljucavamo" frmMain (da korisnik ne bi kliknuo na nesto prilikom "kompilovanja")
'//prvo upisujemo podatke u PropertyBag:
Call PropBag.WriteProperty("Title", sTitle)
Call PropBag.WriteProperty("Description", sDesc)
Call PropBag.WriteProperty("Picture", sPic)
'//kao sto vidite u PropertyBag mozete da upisete sta 'ocete ;)
'//sada ucitavamo template.exe iz resource-a
exe = LoadResData(42, "EXETEMPLATE") '//LoadResData vraca byte array
ff = FreeFile '//uzimamo "slobodan" broj za rad sa fajlovima
'//otvaramo fajl u Binary modu (ovo je vazno!)
Open sDest For Binary As #ff
'//prvo upisujemo template.exe (kao da ga kopiramo na ovu lokaciju)
Put #ff, , exe
'//sada da zapamtimo pozicuju sa koje ce .exe da cita podatke
length = LOF(ff) '//LOF(filenumber) vraca duzinu otvorenog fajla u bajtovima
'//sa Seek pomeramo "kursor" na odredjenu poziciju
Seek #ff, LOF(ff) '//pomeramo se na kraj fajla
'//sada dopisujemo PropertyBag objekat na kraj
Put #ff, , PropBag.Contents
'//i na kraju da zapisemo vrednost koju smo zapamtili da bi .exe
'//znao odakle da cita podatke koje smo mu ubacili :D
Put #ff, , length
'//zatvaramo fajl.
Close #ff
frmMain.Enabled = True '//otkljucavamo formu
Screen.MousePointer = vbNormal '//vracamo kursor u normalu
'//da pitamo korisnika da li zeli da pokrene generisan exe :
msgRet = MsgBox("The executable is compiled successufuly." & vbNewLine & _
"Do you want to test it now?", vbYesNo + vbInformation, "Complited")
'//pokrenimo exe:
If msgRet = vbYes Then Call Shell(sDest, vbNormalFocus)
'//izlazimo pre error handlera
Exit Sub
'//error handler; ukoliko prilikom izvrsavanja ovog gore koda dodje do greske
'//vb ce doci do ovog labela i izvrsiti kod ispod njega (On Error Goto errH valjda sve govori :p)
errH:
'//prijavljujemo gresku korisniku:
Call MsgBox("Error generating executable." & vbNewLine & Err.Description, _
vbCritical, "Error")
'//vracamo sve u normalu:
frmMain.Enabled = True
Screen.MousePointer = vbNormal
'//nije potrebno, ali...
Err.Clear
End Sub
i to je to. Compiler je gotov. Ali jos uvek ne mozemo da kompilujemo ovaj projekat. Moramo prvo
da napisemo template.exe i da ga ubacimo u resource compilera.
Dakle, drugi korak ovog tutorijala:
Otvorite novu instancu Visual Basica (nemojte zatvarati ovu u kojoj ste dosad radili).
Pokrenite novi projekat Standard EXE tipa. Nazovite ga prjTemplate, formu 'Form1' preimenujte
u 'frmMain'.
Zatim na frmMain dodajte TextBox, PictureBox i CommandButton. Evo koje propertije treba da im stavite:
Kod:
TextBox:
Name txtDescription
MulitLine True
ScrollBars 2 - Vertical
Locked True
Text (nista)
PictureBox:
Name picPreview
CommandButton:
Name cmdExit
Caption $Exit
rasporedite ih po zelji.
Sada otvorite Code View frmMain forme i prepisite ovaj kod:
Kod:
Option Explicit
Private Sub Form_Load()
On Error GoTo errH '//error handler
Dim PropBag As New PropertyBag '//propertybag objekat iz koga citamo podatke
Dim ff As Integer '//za open
Dim startPos As Long '//pozicija sa koje citamo podatke
Dim varData As Variant '//prvo cemo da ucitamo podatke u variant promenjivu
Dim b() As Byte '//byte array u koji cemo "premestiti" podatke
ff = FreeFile '//uzimamo "slobodan" broj za rad sa fajlovima
'//sada program otvara sam sebe :D
Open App.Path & "\" & App.EXEName & ".exe" For Binary As #ff
'//citamo pocetnu poziciju (duzinafajla-3 jer ucitavamo u Long tip)
Get #ff, LOF(ff) - 3, startPos '//ovo je ona length promenljiva iz BuildExe
If startPos > 0 Then '//znaci da smo dopisali poziciju
'// sada se pomeramo na pocetak nasih podataka
Seek #ff, startPos
'//i ucitavamo podatke u variant tip
Get #ff, , varData
'//zatim ih prebacujemo u byte array (nije moguce direktno ucitati u byte
b = varData ' array sa Get, zato koristimo ovaj nacin :p)
'//i na kraju ucitavamo podatke u propertybag objekat
PropBag.Contents = b
Else
'//nema podatka!
Call MsgBox("This executable is damaged.", vbCritical, "Error")
Call Unload(Me) '//zatvaramo program
End If
'//zatvaramo exe
Close #ff
'//sada citamo podatke iz PropertyBag-a
Me.Caption = PropBag.ReadProperty("Title") '//postavljamo caption
txtDescription.Text = PropBag.ReadProperty("Description") '//postavljamo opis
picPreview.Picture = PropBag.ReadProperty("Picture") '//i ucitavamo sliku
'//to je to! svi podaci su ucitani Yay! :D
Exit Sub '//izlazimo pre error handlera
errH:
'//nesto je poslo naopako...
Call MsgBox("This executable is damaged.", vbCritical, "Error")
'//izlazimo iz programa
Call Unload(Me)
End Sub
Private Sub cmdExit_Click()
On Error Resume Next
Call Unload(Me)
End Sub
Nemojte pokusavati da pokrenete ovaj program. Dobicete poruku "This executable is damaged."
zato jer nismo nista dopisali na njen kraj. To radi Compiler (koji smo predhodno uradili)
Sada idite na 'File/Make prjTemplate.exe..." u dobijenom prozoru sacuvajte program kao
'template.exe' i pritisnite 'OK'.
Kada ste kompilovali template.exe vratite se na predhodni projekat.
U 'Project' meniju izaberite 'Add New Resource File' u otvorenom prozoru unesite 'compiler.res'
i pritisnite 'Open' (uradite u u istom folderu u kom ste sacuvali prjCompiler.vbp) VB ce vas pitati
da li zelite da napravite novi resource fajl jer taj ne postoji, odgovorite mu sa 'Yes'.
Sada cete dobiti novu (zelenu) ikonicu u Project Exploreru, kliknite dva puta na nju, otvorice vam se
Resource Editor. Kliknite na 'Add Custom Resource..' dugme (drugo s desna, neka kockica sa dve jedinice)
i u dobijenom prozoru pronadjite template.exe. Kada ste ga slektovali, pritisnite 'Open'. Sada vam se
pojavio neki folder ("CUSTOM") u kom se nalazi nesto '101'. Kliknite dva puta na to '101' i u dobijenom
prozoru kao 'Type' unesite "EXETEMPLATE" a kao 'Id' 42, 'Language' ostavite ne 'English'. Sada samo
sacuvajte izmene napravljene nad compiler.res (klik na Save ikonicu, kao disketa) i zatvorite Resource Editor.
Sada kada imamo i resource gotov kompilujte Compiler ('File' meni pa 'Make prjCompiler.exe...') i isprobajte ga!
Samo jos da napomenem da nije obavezno da Resource Type bude "EXETEMPLATE" i da Id bude 42 mozete sta hocete da
stavite, samo pazite da pozivate pravilno, znaci:
Kod:
exe = LoadResData(42, "EXETEMPLATE")
a da ste ostavili sve kako jeste, da niste menjali type i id, onda bi islo ovako:
Kod:
exe = LoadResData(101, "CUSTOM")
Evo to bi bio ovaj mali tutorijal. Nadam se da sam sve dovoljno jasno objasnio, a ako nisam slobodno
pitajte :p
E, da, evo okacio sam uz ovu poruku fajlove koje sam ja napravio dok sam pisao ovaj tutorijal pa pogledajte...
[url=https://www.mycity.rs/must-login.png exe.zip[/url]
pozdrav!
Dopuna: 06 Nov 2005 20:53
@Dejan123
Blokiranje X-a vec bilo....
http://www.mycity.rs/phpbb/viewtopic.php?t=6907
|