Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Problema con l'aggiornamento di vecchi file durante setup (versione e data)

Dunque sembra che al setup di vb non freghi niente se un file da installare
ha la data piu' recente di quello gia' installato, controlla solo la
fantomatica "versione" dei file.
Se quindi un file, ad esempio "splash.jpg" nel file cab e' del 2003 mentre
quello gia' installato e' del 2002, il setup dira' comunque all'utente "il
file da installare non e' piu' recente della versione gia' installata" e poi
"consiglia" di mantenere il vecchio file.
Ora, posso capire per i file eseguibili di varia natura (exe, dll, ocx)
perche' in quel caso si puo' modificare la versione quando li si compila, ma
io come piffero faccio a cambiare la versione di un file jpg, o di un
generico file ".bin"?
Ho fatto ricerche in rete e sembra ci sia un modo valido solo sotto nt
usando findresource e updateresource pero' mi sembra strano che non ci sia
un modo piu' semplice.
Nel fso ho trovato un getfileversion ma nessuno SetFileVersion.
Ho provato anche (beata ingenuita' :-) a modificare nel file setup.lst il
numero di versione a fianco del file ma e' chiaro che quel valore e' li solo
come info e non perche' venga utilizzato durante il setup.
Ora vorrei sapere se c'e' un modo per:
- Cambiare la versione interna di un generico file (jpg, .bin o altro)
- Oppure, modificare il file setup.lst per dire al setup: installa sempre
questo file senza controllare la versione
ciao
Paolo B.

 sempre questo file senza controllare la versione
Io ho modificato la CopySection (di setup1.bas) nel modo che segue (cerca di
interpretare, non vorrei assumermi troppe responsabilità):
            ...
            fSrcVer = True
            sSrcVerInfo = sFile.sVerInfo
            If sSrcVerInfo.FileVerPart1 = gintNOVERINFO Then
                fSrcVer = GetFileVerStruct(strSrcDir & strSrcName,
sSrcVerInfo)
            End If
            '
            'If there is an existing destination file with version
information, then
            'compare its version number to the source file version number.
            '
            fOverWrite = True
            If intRC <> vbIgnore Then
                fRemoteReg = (sFile.strRegister = mstrREMOTEREGISTER)
                If GetFileVerStruct(strDestDir & strDestName, sDestVerInfo,
fRemoteReg) = True Then
                    If fSrcVer = True Then
                        'MsgBox "Il file esistente (" & strDestName & ")
dispone di informazioni sulla versione"    'EASY
                        Dim risultato As Integer
'EASY
                        risultato = IsNewerVer(sSrcVerInfo, sDestVerInfo)
'EASY
                        Select Case risultato
'EASY
                            Case -1     'Versione origine minore
'EASY
                                Call MsgBox("Il file da installare" & vbCrLf
& "(" & strSrcName & ")" & vbCrLf & "ha una versione (" &
sSrcVerInfo.FileVerPart1 & "." & sSrcVerInfo.FileVerPart2 & "." &
sSrcVerInfo.FileVerPart3 & "." & sSrcVerInfo.FileVerPart4 & ")" & vbCrLf &
"inferiore di quello già installato" & vbCrLf & "(" & strDestName & ")" &
vbCrLf & "(" & sDestVerInfo.FileVerPart1 & "." & sDestVerInfo.FileVerPart2 &
"." & sDestVerInfo.FileVerPart3 & "." & sDestVerInfo.FileVerPart4 & ")." &
vbCrLf & vbCrLf & "Il file non verrà installato!", vbOKOnly + vbExclamation)
'EASY
                                copiare = False
'EASY
                            Case 1      'Versione origine maggiore
'EASY
                                copiare = True
'EASY
                            Case 0      'Versioni identiche
'EASY
                                copiare = False
'EASY
                        End Select
'EASY
                        If copiare = False Then
'EASY
                            intRC = vbIgnore
                            fFileWasUpToDate = True
                            DecideIncrementRefCount strDestDir &
strDestName, sFile.fShared, sFile.fSystem, True
                            If (Extension(sFile.strDestName) =
gsEXT_FONTFON) Or (Extension(sFile.strDestName) = gsEXT_FONTTTF) Then
                                'do nothing
                            Else
                                AddActionNote
ResolveResString(resLOG_FILEUPTODATE)
                                CommitAction
                            End If
                        End If
'EASY
                    End If
                Else
                    '
                    'Se il file di destinazione non include informazioni
sulla versione,
                    'il file di origine viene copiato se include un numero
di versione.
                    'Se per nessuno dei due file è disponibile un numero di
versione,
                    'verranno confrontate le date.
                    '
                    'MsgBox "Il file esistente (" & strDestName & ") non
dispone di informazioni sulla versione" & vbCrLf & sFile.varDate & vbCrLf &
CVDate(FileDateTime(strDestDir & strDestName))   'EASY
                    If sFile.varDate < CVDate(FileDateTime(strDestDir &
strDestName)) Then
                        If Err = 0 Then
                            '
                            'Sebbene né il file di origine né il file di
destinazione
                            'contengano informazioni sulla versione, il file
esistente
                            'ha una data più recente e pertanto verrà
utilizzato questo
                            'file.
                            '
                            'MsgBox "Il file esistente (" & strDestName & ")
è più recente (come data) di quello che si desidera installare. Verrà
mantenuto il file esistente."    'EASY
                            copiare = IIf(MsgBox("Il file da installare" &
vbCrLf & "(" & strSrcName & ")" & vbCrLf & "ha una data (" & sFile.varDate &
") anteriore a quello già installato" & vbCrLf & "(" & strDestName & ")" &
vbCrLf & "(" & CVDate(FileDateTime(strDestDir & strDestName)) & ")." &
vbCrLf & vbCrLf & "Desideri comunque forzare l'installazione?", vbYesNo +
vbQuestion) = vbYes, True, False) 'EASY
                            If copiare = False Then     'EASY
                                intRC = vbIgnore
                                fFileWasUpToDate = True
                                DecideIncrementRefCount strDestDir &
strDestName, sFile.fShared, sFile.fSystem, True
                                If (Extension(sFile.strDestName) =
gsEXT_FONTFON) Or (Extension(sFile.strDestName) = gsEXT_FONTTTF) Then
                                    'do nothing
                                Else
                                    AddActionNote
ResolveResString(resLOG_FILEUPTODATE)
                                    CommitAction
                                End If
                            End If                      'EASY
                        Else
                            Err = 0
                        End If
                    End If
                End If
            End If
        End If
        If fOverwriteAll Then fOverWrite = True
        '
        'If the file wasn't split, or if this is the last extent of a split
file
        '
        If fSplit = False Then
            '
            'After all of this, if we're still ready to copy, then give it a
whirl!
            '
            If intRC <> vbIgnore Then
        ...


Ti ringrazio molto.
Anche io pensavo di fare delle modifiche al setup1 ma la leggibilita' di
quei sorgenti e' prossima allo zero, tra "goto" e una gestione degli errori
bizzarra.
Ora provo a sostituire il tuo codice, se ho capito bene  a parita' di
versione (o mancanza di informazioni sulla versione) usa le date.
Sarebbe l'ideale in effetti.
ciao
Paolo B.

 Sarebbe l'ideale in effetti.
Sě, vale per tutti i file che non hanno versione, come, ad esempio, il jpg
che citavi.
Aggiungo una considerazione, probabilmente valida solo per il mio
applicativo: In altra parte del Setup ho forzato, in ogni caso,
l'installazione/sostituzione di alcuni file che, nel mio applicativo, sono
comuni e che, per non rischiare di bypassarli, preferisco decisamente
installare/sostituire sempre, indipendentemente anche dalle date. Quelli
personalizzati eventualmente dall'utente hanno nomi diversi e io non li
distribuisco. Pensaci su e, se il setup dura un minuto di piů (non 30),
chettefrega?...
Aggiungo anche che io ho preferito strutturare il tutto in questo modo: Il
mio setup si limita (per server e postazioni collegate) ad
installare/registrare esclusivamente la mia DLL e i vari OCX, null'altro.
Ovviamente uso il Setup di VB, quello di cui stiamo parlando.
Per i programmi e file correlati, ovvero per tutto ciň che non necessita di
registrazione, uso (ovviamente solo per il server e pur sempre dalla stessa
finestra che parte in Autorun dal CD e che puň avviare anche il Setup di VB)
delle normalissime istruzioni VB per copiare i file e qui non controllo
niente, nč le versioni, nč le date. Installo/sostituisco sempre.

             If sSrcVerInfo.FileVerPart1 = gintNOVERINFO Then
Ho un problema qui.
L'udt sSrcVerInfo non ha nella versione originale il membro FileVerPart1
Nel mio sorgente la definizione e' la seguente:
Type VERINFO                                            'Version
FIXEDFILEINFO
    strPad1 As Long                                     'Pad out struct
version
    strPad2 As Long                                     'Pad out struct
signature
    nMSLo As Integer                                    'Low word of ver #
MS DWord
    nMSHi As Integer                                    'High word of ver #
MS DWord
    nLSLo As Integer                                    'Low word of ver #
vblf & vblf DWord
    nLSHi As Integer                                    'High word of ver #
vblf & vblf DWord
    strPad3(1 To 16) As Byte                            'Skip some of
VERINFO struct (16 bytes)
    FileOS As Long                                      'Information about
the OS this file is targeted for.
    strPad4(1 To 16) As Byte                            'Pad out the resto
of VERINFO struct (16 bytes)
End Type

[*Paolo B.* = 
dolce...@tiscali.it
 in
news:bkq7bf$4keek$
1...@ID-78415.news.uni-berlin.de
] ha scritto:

Questo è il mio, ma a questo punto ti direi STOP (salvo adeguamenti
"studiati"), perchè temo che stiamo parlando di versioni diverse (io ho VB6
SP5, ma, bada bene, NON son sicuro di aver utilizzato l'ultima versione del
setup, mi viene il dubbio di aver mantenuto in ogni caso la prima, in quanto
avevo già apportato modifiche e non volevo ristudiarle):
Type VERINFO                                            'Version
FIXEDFILEINFO
    'There is data in the following two dwords, but it is for Windows
internal
    '   use and we should ignore it
    Ignore(1 To 8) As Byte
    'Signature As Long
    'StrucVersion As Long
    FileVerPart2 As Integer
    FileVerPart1 As Integer
    FileVerPart4 As Integer
    FileVerPart3 As Integer
    ProductVerPart2 As Integer
    ProductVerPart1 As Integer
    ProductVerPart4 As Integer
    ProductVerPart3 As Integer
    FileFlagsMask As Long 'VersionFileFlags
    FileFlags As Long 'VersionFileFlags
    FileOS As Long 'VersionOperatingSystemTypes
    FileType As Long
    FileSubtype As Long 'VersionFileSubTypes
    'I've never seen any data in the following two dwords, so I'll ignore
them
    Ignored(1 To 8) As Byte 'DateHighPart As Long, DateLowPart As Long
End Type


In effetti sembra ci siano altre differenze.
La variabile (prob. una costante) gsExt_FontFon nel mio sorgente non e'
definita. :-/
Io ho vb6 con sp4
Fra l'altro ho notato una cosa, che quando uso il setup1.exe compilato
partendo dai sorgenti ha uno strano comportamento perche' invece di creare
la cartella dell'applicazione in c:\programmi la crea direttamente nella
radice del disco C:\
Non potresti mandarmi uno zip con i sorgenti della cartella "setup1", quello
gia' modificato?
Mi faresti un favore. :-)
ciao
Paolo B.

 Io ho vb6 con sp4
Installa SP5. Non fa assolutamente male.