[ itf @ 24.12.2009. 19:01 ] @
Već nekoliko mjeseci je u izgradnji jedan Open Source projekt pod nazivom "Open Install". Taj projekt sam osobno započeo s manjom skupinom mlađih programera. U projektu je zapravo riječ o sustavu za izradu instalacijskih procedura (client - instalacija, uninstall - deinstalacija, manager - IDE za kreiranje setupa). Moj zadatak je kreiranje client aplikacije tj. setup-a i deinstalacije, a njihov zadatak je zapravo Manager IDE.

Klijent aplikaciju sam radio u Turbo C++ 2006 Pro, dok ću vjerovatno napraviti migraciju na C++ Builder 2010. Evo što je do sada napravljeno:

Aplikacija i source code:
http://www.box.net/shared/st7ylphz87

Novosti u beta 3 verziji:
- Mogućnost instalacije za trenutnog ili sve korisnike sustava
- Kreiranje shortcut-a na desktopu i u start menu/programs
- Moguće resetiranje računala nakon instalacije
- Dodan Njemački jezik
- Redizajn instalacijskog postupka (logovi i brisanje samo instaliranih datoteka)
- Vizualni prikaz deinstalacije
- Gumb browse automatski dodaje naziv i verziju aplikacije i može kreirati novi folder
- Redizajn prozora (odabir putanje, kraj instalacije)
- Ispravljen bug kod definiranja putanje instalacije

Novosti u beta 2 verziji:
- Odabir jezika (Engleski - default, Hrvatski)
- Već postojeća instalacija će biti detektiranja prilikom ponovnog pokretanja instalacije
- Dodan pozadinski prozor (opcionalno za kreatora instalacije, kao i skaliranje boja)
- Moguć prekid instalacije u svakom trenutku i rollback datoteka
- Ispravljen bug kod definiranje putanje instalacije
- Deinstalacija javi porukom kada završi brisanje datoteka ili grešku u slučaju problema
- Ispravljen bug gdje se nekima javljala greška (missing log files) pri deinstalaciji aplikacije (add/remove programs)
- Sitna poboljšanja u logici rada setup i uninstall aplikacije

Pri kraju je i beta 4 verzija koja već ima ugrađen novi skin za aplikaciju, detekciju .net frameworka i sl. stvari. Projektu se pridružilo još nekoliko ljudi tako da smo dobili i domenu:

www.open-install.com

Web stranica je također u izradi. Tko god želi pridružiti se, dobrodošao je :) Mislim da ovim projektom može se prikazati kako je i C++ Builder uz Delphi također vrlo ozbiljan i koristan alat, dok da i sam C++ i dalje predstavlja vrlo jak i koristan programski jezik.

A sad.. Molio bih da pogledate aplikaciju i date svoje mišljenje.. Što je dobro, što nije, što bi se moglo poboljšati, dodati, ispraviti itd itd itd..
[ tkaranovic @ 25.12.2009. 06:07 ] @
Pravio sam deinstalaciju sa C++ B. 2010...

Rekao bi da na kraju treba nešto samo sebe da obriše. Koliko sam uspeo da vidim stavili ste bat fajl (c:\temp.bat). Možda bi bilo bolje da je u temp direktorijumu. Može da se iskoristi i skript ako je potrebno da se napravi kraća pauza (sleep):

Code:

Option Explicit
On Error Resume Next
WScript.Sleep 100

Dim delFile
delFile = WScript.Arguments(0)

Dim fso
Set fso = CreateObject( "Scripting.FileSystemObject" )
fso.DeleteFile( delFile )

WScript.Echo( "deinstalacija gotova" )



Ovakav del.vbs bi na kraju obrisao samog sebe i/ili program koji je radio deinstalaciju. Da bi obrisao program koji ga startuje mora da napravi malu pauzu i da programu mogućnost da završi sa radom da bi ga mogao obristi.
[ itf @ 25.12.2009. 10:06 ] @
Nikada nije sigurno koliko će se morati čekati pa je Sleep nepouzdan... Već sam probao. Ovaj bat će odraditi sve kako treba jer će konstantno provjeravati kad je moguće izbrisati program, i kada bude onda to i napravi.
[ tkaranovic @ 25.12.2009. 12:27 ] @
Nisam se baš udubio u detalje. Ovo bi bio bat fajl (simbolično prepisan) i on radi:

Code:

:vrti
del ...dir\uninst.exe
if exist ...dir\uninst.exe goto vrti
rmdir...
del ...temp.bat


Samo bi ipak dodao da sa skriptom može da se napiše komplikovaniji kod od bat fajla, da se stavi i istek vremena posle koga bi prekinuo da radi a sa bat fajlom to ne bi moglo, ovako nešto (a fso ima i FileExists ili FolderExists...):

Code:

Option Explicit
On Error Resume Next

WScript.Echo( "poceo" )

Dim delFile
delFile = WScript.Arguments(0)

Dim fso
Set fso = CreateObject( "Scripting.FileSystemObject" )

Dim time, kraj

time = 0
kraj = 1
Do While kraj <> 0
  WScript.Sleep 100
  time = time + 1
  if time = 10 then
    WScript.Echo( "isteklo vreme" )  
    kraj = 0
  else
   kraj = fso.DeleteFile( delFile )
  end if
Loop

if time < 10 then
  WScript.Echo( "deinstalacija gotova" )
else
 WScript.Echo( "deinstalacija nije gotova..." )
end if


time = 10 je samo jedna sekunda a može da se stavi i (mnogo) više.

Inače sam se javio jer bi me interesovalo da li nešto propuštam, nešto što bat fajl može bolje da uradi. Recimo, da je bat fajl pouzdaniji u smislu da će sigurno raditi na svakoj mašini...
[ itf @ 25.12.2009. 12:31 ] @
Glavni problem je u tome što korisnik možda usred deinstalacije ode npr. na WC :) ili mu npr. zazvoni telefon. Tada nikada ne znaš koliko dugo vremena će mu trebati da zapravo završi deinstalaciju tj. da uninstall.exe bude moguće izbrisati.
[ tkaranovic @ 25.12.2009. 14:07 ] @
To nije problem, prvo se da upozorenje da je zabranjeno korišćenje toaleta dok se ne završi instalacija. :)


Kada uninstall završi deintstalaciju treba prvo da pokrene skript i onda odmah sebe da zatvori:

ShellExecute(...
...::Close();


U slučaju da se baš nešto nepredviđeno dogodi i ne zatvori se uninstall odmah po pokretanju skripta, bolje da se posle nekog vremena skript oglasi i kaže da nije bilo moguće da završi svoj rad nego da (bat) ostane u "mrtvoj" petlji.
[ savkic @ 25.12.2009. 14:47 ] @
> ShellExecute(...

Ovo sa skriptom mi je interesantno, nisam ga nikada koristio, kada mi nešto treba pišem beč fajl. Može se znači startovati preko ShellExecute (radi li sa CreateProcess) i koju ekstenziju treba da ima?
[ tkaranovic @ 25.12.2009. 17:57 ] @
Citat:
savkic:

 > ShellExecute(...

Ovo sa skriptom mi je interesantno, nisam ga nikada koristio, kada mi nešto treba pišem beč fajl. Može se znači startovati preko ShellExecute (radi li sa CreateProcess) i koju ekstenziju treba da ima?


To se odnosilo na deo koda uninstall programa (čiji link je itf stavio...) i kako može da uninstall startuje skrip da bi skript obirsao ununstall.

Međutim, kad smo već kod startovanja iz skipta, skript može ovako nešto:

Code:

Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("...\program.exe")
Do While oExec.Status = 0
   WScript.Sleep 100
Loop
WScript.Echo oExec.Status


Startuje se program i čeka dok ne završi, kad završi prikaže status.

Sa ovim skriptom može da se startuje uninstall i da skript sačeka da on zavši deinstalaciju pa da ga obriše.