[VB.NET] Hé, Installatieprogramma, ik besta al...

Pagina: 1
Acties:
  • 1.036 views sinds 30-01-2008
  • Reageer

  • F-Tim
  • Registratie: November 2003
  • Laatst online: 14-02 11:43
Goede middag mede devvers,

zoals de topictitel al een beetje suggereert, wil ik in Visual Studio 2005 een setup maken voor een applicatie die ik gemaakt heb. Echter wil ik dat in het setup bestand ook een kale database wordt ingesloten. Geen probleem, gewoon de databasebestanden includen en klaar is kees. Echter als het product opnieuw geinstalleerd wordt, of gerepareerd, dan moet hij me de database bestanden ongemoeid laten op de harde schijf.

Nu vroeg ik me dus af of het mogelijk is om na te gaan of een bepaald bestand dat je probeert te installeren al bestaat op de schijf, zo ja, dan het te installeren bestand overslaan, zo nee, het bestand gewoon kopieren.

Wat je dus krijgt is dat je bij de initiele installatie het product + kale database installeert, maar dat als je een herinstall of reparatie doet, dat je dan alleen het product installeert omdat alle databasebestanden al bestaan.

Tevens heb ik nóg een vraagje. Op XP is het bestand msiexec.exe terug te vinden in C:\Windows\System32 ... in Windows 98 is dat terug te vinden in de map C:\Windows\System. Kan ik tijdens de installatie ook verifieren welk OS geinstalleerd is? En aan de hand daarvan de ene óf de andere snelkoppeling aanmaken? Dit is nodig voor de uninstaller van het product.

Nu weet ik wel dat je in Visual Studio ook Launch Conditions kunt instellen, maar dan kan ik geen alternatief aangeven. Bij true doet hij het dan gewoon, bij False krijg je een errormessage. Hoe kan ik dit eventueel ombouwen tot een soort van IF in de installatiewizard? Hopelijk kan iemand me op de goede weg sturen.

Wanna play?


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 19-02 23:22

Janoz

Moderator Devschuur®

!litemod

mbt de laatste vraag. Sowieso het pad niet hard opnemen. Wat nu als ik mijn wondows niet in c:\windows heb geinstaleerd? Ikzelf ben niet zo bekend met software ontwikkeling onder Windows, maar ik neem aan dat hier wel system properties voor zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 14-02 11:43
Janoz schreef op woensdag 21 juni 2006 @ 15:44:
mbt de laatste vraag. Sowieso het pad niet hard opnemen. Wat nu als ik mijn wondows niet in c:\windows heb geinstaleerd? Ikzelf ben niet zo bekend met software ontwikkeling onder Windows, maar ik neem aan dat hier wel system properties voor zijn.
In de snelkoppeling die verwijst naar het Msiexec bestandje ipv C:\Windows gewoon %windir% opnemen ;) Dan is dat al dynamisch gelinked naar je windows dir. Maar ik heb volgens mij al een oplossing daarvoor. De Condition VersionNT en Version9X, in de setup komen dan wel 2 bestanden, maar als het goed is installeert hij er maar 1. Dat ga ik zo testen in ieder geval. Nu alleen nog het "probleem" met als bestanden al geinstalleerd zijn...

[ Voor 5% gewijzigd door F-Tim op 21-06-2006 15:58 ]

Wanna play?


  • TheVMaster
  • Registratie: Juli 2001
  • Laatst online: 14:02

TheVMaster

Moderator WOS
ehh..misschien wazige vraag, wrom maak je zoiets niet met Wise Package Studio?

Dat is speciaal gemaakt om applicaties te packagen ;) Overigens kun je daar ook OS voorwaarden inbouwen (en eventueel welke IE versie geinstalleerd moet zijn).

[ Voor 53% gewijzigd door TheVMaster op 21-06-2006 16:10 ]


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 14-02 11:43
TheVMaster schreef op woensdag 21 juni 2006 @ 16:09:
ehh..misschien wazige vraag, wrom maak je zoiets niet met Wise Package Studio?

Dat is speciaal gemaakt om applicaties te packagen ;) Overigens kun je daar ook OS voorwaarden inbouwen (en eventueel welke IE versie geinstalleerd moet zijn).
Omdat je daar weer apart voor moet betalen en een Visual Studio licentie in huis is? ;)

Wanna play?


  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 08:57
Doe je het met de setup wizard of gewoon een kaal project?

Kaal project:

Visual Basic .NET:
1
2
3
4
5
Imports system.io

If file.exists("Padnaarbestand") then
msgbox("Het bestand bestaat al")
End if

  • F-Tim
  • Registratie: November 2003
  • Laatst online: 14-02 11:43
DoDo schreef op woensdag 21 juni 2006 @ 16:32:
Doe je het met de setup wizard of gewoon een kaal project?

Kaal project:

Visual Basic .NET:
1
2
3
4
5
Imports system.io

If file.exists("Padnaarbestand") then
msgbox("Het bestand bestaat al")
End if
Setup Wizard helaas.... :/ de gewone File.Exists en Directory.Exists code gebruik ik al in de code, maar toch bedankt voor het meedenken :)

Wanna play?


  • kunnen
  • Registratie: Februari 2004
  • Niet online
Gewoon installeren en de lege DB in een extra bestand, en dan je applicatie laten kijken of deze al op de werkelijke plaats bestaat. Zo ja -> lege DB weg. Zo nee -> move lege DB naar juiste locatie.

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Custom Actions zijn je antwoord, hiermee kun je het installeren van de DB alleen bij de "installatie" doen en laat je deze custom action weg bij repair of uninstall.

Wat het geinstalleerde OS betreft kun je gewoon een launch-condition gebruiken.

Nu met Land Rover Series 3 en Defender 90


  • Vedett.
  • Registratie: November 2005
  • Laatst online: 19-02 19:21
Je kunt in die installer mappen aanmaken.
Op die map kun je properties instellen zoal 'IfNotExits' of iets dergelijks.
In dat geval ge je dus pas de map aanmaken (met de files ering) als hij niet bestaat.

  • TheVMaster
  • Registratie: Juli 2001
  • Laatst online: 14:02

TheVMaster

Moderator WOS
F-Tim schreef op woensdag 21 juni 2006 @ 16:26:
[...]


Omdat je daar weer apart voor moet betalen en een Visual Studio licentie in huis is? ;)
Als het voor 1 appje is download je toch ff een demoversie :)

Maar het principe blijft gelijk en idd een custom action is je ding. Nu weet ik niet of dat op dezelfde manier werkt als in Wise.

Gewoon de lege dbase in het package meenemen (in desnoods een subfolder newdb ofzo) en dan een custom action (ik doe het altijd emt vbscript) laten checken of er al een dbase in de appdir staat, zo niet dan lege dbase in appdir kopieeren anders niets doen (desnoods lege dbase+newdb map weggooien).

[ Voor 45% gewijzigd door TheVMaster op 22-06-2006 09:06 ]


  • Brent
  • Registratie: September 2001
  • Laatst online: 15:57
TheVMaster schreef op donderdag 22 juni 2006 @ 09:02:
[...]


Als het voor 1 appje is download je toch ff een demoversie :)
Of je gebruikt gewoon NSIS, minstens zo krachtig.

Humanist | Kernpower! | Determinist | Verken uw geest | Politiek dakloos


  • Mickman
  • Registratie: Juni 2001
  • Laatst online: 00:43
Vanuit Visual Studio kun je gewoon MSI's bouwen.

Geef aan het component waarin de database file staan de volgende instellingen mee.

- Never overwrite if key file exists
- Leave installed on uninstall

Daarnaast moet je wel de keyfile op een van de database files zetten.

  • TheVMaster
  • Registratie: Juli 2001
  • Laatst online: 14:02

TheVMaster

Moderator WOS
Breepee schreef op donderdag 22 juni 2006 @ 09:08:
[...]

Of je gebruikt gewoon NSIS, minstens zo krachtig.
Ken ik niet..is dat freeware?

  • F-Tim
  • Registratie: November 2003
  • Laatst online: 14-02 11:43
NSIS is idd freeware, wordt ook gebruik van gemaakt bij de installatie van WinAmp :)

Maar ik ben tussentijds al met de custom acties aan de slag gegaan, en ik krijg nu tijdens de installatie de fout "Index ligt buiten de matrixgrenzen".... mááár ik zie niet in waar die fout gaat? Ik vermoed dat hij de arguments niet goed doorstuurt. Maar vraag me niet hoe dát werkt, want als ik tutorials op internet bekijk staat dat een Custom Action áltijd een property Arguments heeft, maar die van mij heeft dat niet :?

Hieronder volgt mijn code:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<System.ComponentModel.RunInstallerAttribute(True)> _
   Public Class DBaseInstaller
    Inherits System.Configuration.Install.Installer

    Const EVENTSOURCE_NAME = "Database Install Shield"

    Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
        Dim f() As String = System.Environment.GetCommandLineArgs
        Dim fTgt As String = f(4) ' het 4de argument zou standaard de targetdir zijn?

        MsgBox(fTgt) 'Deze heb ik toegevoegd om te kijken óf hij uberhaupt wel een goede targetdir  
                             'heeft, maar dit laat hij me geeneens zien.

        Try
            If System.IO.Directory.Exists(fTgt + "\CSDATA") Then
                'De map bestaat al, dus moeten we controleren welke bestanden nog niet bestaan
                Dim dir As New IO.DirectoryInfo(fTgt + "\_CSDATA")
                Dim file As IO.FileInfo
                For Each file In dir.GetFiles
                    If Not System.IO.File.Exists(fTgt + "\CSDATA\" + file.Name) Then
                        System.IO.File.Copy(fTgt + "\_CSDATA\" + file.Name, fTgt + "\CSDATA\" + file.Name)
                    End If
                Next
                System.IO.Directory.Delete(fTgt + "\_CSDATA")
            Else
                'De map bestaat niet, alle bestanden in _CSDATA mogen gekopieerd worden
                System.IO.Directory.Move(fTgt + "\_CSDATA", fTgt + "\CSDATA")
            End If
        Catch exc As Exception
            MsgBox("Er is een fout opgetreden tijdens de database installatie!" + vbCrLf + exc.Message, MsgBoxStyle.Exclamation, "Database Install Shield")
        End Try
    End Sub

    Public Overrides Sub Uninstall(ByVal savedState As System.Collections.IDictionary)
        'Tijdens de uninstall blijf je maar lekker van de database af...
    End Sub

End Class 'DBaseInstaller


Edit: voor mensen die zich afvragen waarom ik een database op fileniveau kopieer, dan komt dit omdat dit een aparte database is die gewoon losse bestanden heeft per tabel ;)

[ Voor 13% gewijzigd door F-Tim op 22-06-2006 11:50 ]

Wanna play?


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14:52

gorgi_19

Kruimeltjes zijn weer op :9

sloop je try catch en er eens uit en laat hem eens goed crashen in debugmode, dan zie je waar het fout gaat.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 14-02 11:43
Try .. Catch eruit slopen heeft geen nut :{, dan krijg ik precies hetzelfde probleem.

Hij komt de Try ... Catch geeneens in volgens mij, want de foutmelding daar staat niets bij van "Er is een fout opgetreden tijdens....", het is gewoon een standaard Windows Installer schermpje wat dan komt, en zegt dat de index buiten de matrixgrenzen ligt...

Edit: zelfs als ik het hele stuk eruit sloop krijg ik "Index ligt buiten de matrixgrenzen"... en dan hou ik puur en alleen deze code over |:( nu word ik toch écht gestoord ervan 8)7
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<System.ComponentModel.RunInstallerAttribute(True)> _
   Public Class DBaseInstaller
    Inherits System.Configuration.Install.Installer

    Const EVENTSOURCE_NAME = "Database Install Shield"

    Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
        'ff lekker nixxen
    End Sub

    Public Overrides Sub Uninstall(ByVal savedState As System.Collections.IDictionary)
        'Tijdens de uninstall blijf je maar lekker van de database af...
    End Sub

End Class 'DBaseInstaller


Edit2: Eindelijk werkend precies zoals het hoort :) De parameters zoals ze op de andere manier werden meegegeven werkte niet goed. Als ik CustomActionData meegeef met de waarde /folder="[TARGETDIR]\", en dan in de installer class Me.Context.Parameters("folder") gebruik dan werkt het wel goed. Al vind ik het nog altijd vreemd dat de andere manier niet werkt, maaaaargoed.

[ Voor 77% gewijzigd door F-Tim op 22-06-2006 14:24 ]

Wanna play?

Pagina: 1