Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    13

    [VB6] Verificare la versione di un exe

    Scusate ragazzi... vorrei sapere come faccio a verificare la versione di un file .exe che si trova su una cartella che io vado a selezionare?

    Praticamente ogni volta che parte il mio programma all'avvio lui va a controllare in una cartella /Update se vi è un eseguibile(in teoria dovrebbe trovare la nuova versione del mio programma). Se trova il file .exe lui dovrebbe confrontare app.major, app.minor e app.revision con la versione del file che ha trovato. Se tale file è + aggiornato allora dovrebbe copiare il file sulla cartella del programma e ivi riavviare il progamma stesso per fargli eseguire l'aggiornamento. Spero di essere stato chiaro...

    Qualcuno può darmi una mano?

    Grazie raga...

  2. #2
    in un modulo

    codice:
    Option Explicit
    
    Private Const VS_FFI_SIGNATURE = &HFEEF04BD
    Private Const VS_FFI_STRUCVERSION = &H10000
    Private Const VS_FFI_FILEFLAGSMASK = &H3F&
    Private Const VS_FF_DEBUG = &H1
    Private Const VS_FF_PRERELEASE = &H2
    Private Const VS_FF_PATCHED = &H4
    Private Const VS_FF_PRIVATEBUILD = &H8
    Private Const VS_FF_INFOINFERRED = &H10
    Private Const VS_FF_SPECIALBUILD = &H20
    Private Const VOS_UNKNOWN = &H0
    Private Const VOS_DOS = &H10000
    Private Const VOS_OS216 = &H20000
    Private Const VOS_OS232 = &H30000
    Private Const VOS_NT = &H40000
    Private Const VOS__BASE = &H0
    Private Const VOS__WINDOWS16 = &H1
    Private Const VOS__PM16 = &H2
    Private Const VOS__PM32 = &H3
    Private Const VOS__WINDOWS32 = &H4
    Private Const VOS_DOS_WINDOWS16 = &H10001
    Private Const VOS_DOS_WINDOWS32 = &H10004
    Private Const VOS_OS216_PM16 = &H20002
    Private Const VOS_OS232_PM32 = &H30003
    Private Const VOS_NT_WINDOWS32 = &H40004
    Private Const VFT_UNKNOWN = &H0
    Private Const VFT_APP = &H1
    Private Const VFT_DLL = &H2
    Private Const VFT_DRV = &H3
    Private Const VFT_FONT = &H4
    Private Const VFT_VXD = &H5
    Private Const VFT_STATIC_LIB = &H7
    Private Const VFT2_UNKNOWN = &H0
    Private Const VFT2_DRV_PRINTER = &H1
    Private Const VFT2_DRV_KEYBOARD = &H2
    Private Const VFT2_DRV_LANGUAGE = &H3
    Private Const VFT2_DRV_DISPLAY = &H4
    Private Const VFT2_DRV_MOUSE = &H5
    Private Const VFT2_DRV_NETWORK = &H6
    Private Const VFT2_DRV_SYSTEM = &H7
    Private Const VFT2_DRV_INSTALLABLE = &H8
    Private Const VFT2_DRV_SOUND = &H9
    Private Const VFT2_DRV_COMM = &HA
    
    Private Type VS_FIXEDFILEINFO
       dwSignature As Long
       dwStrucVersionl As Integer
       dwStrucVersionh As Integer
       dwFileVersionMSl As Integer
       dwFileVersionMSh As Integer
       dwFileVersionLSl As Integer
       dwFileVersionLSh As Integer
       dwProductVersionMSl As Integer
       dwProductVersionMSh As Integer
       dwProductVersionLSl As Integer
       dwProductVersionLSh As Integer
       dwFileFlagsMask As Long
       dwFileFlags As Long
       dwFileOS As Long
       dwFileType As Long
       dwFileSubtype As Long
       dwFileDateMS As Long
       dwFileDateLS As Long
    End Type
    
    Public Type File
        FileVersion As String
        ProdVersion As String
        Os As String
        Tipo As String
    End Type
    
    Private Declare Function GetFileVersionInfo Lib "Version.dll" Alias "GetFileVersionInfoA" _
        (ByVal lptstrFilename As String, ByVal dwhandle As Long, ByVal dwlen As Long, _
        lpData As Any) As Long
    Private Declare Function GetFileVersionInfoSize Lib "Version.dll" Alias _
        "GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, lpdwHandle As Long) As Long
    Private Declare Function VerQueryValue Lib "Version.dll" Alias "VerQueryValueA" _
        (pBlock As Any, ByVal lpSubBlock As String, lplpBuffer As Any, puLen As Long) As Long
    Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, _
        ByVal Source As Long, ByVal length As Long)
    
    
    Function fileVerInfo(Percorso As String) As File
    
    On Error GoTo lblError
    Dim StrucVer As String
    Dim FileVer As String
    Dim ProdVer As String
    Dim FileFlags As String
    Dim FileOS As String
    Dim FileType As String
    Dim rc As Long
    Dim lDummy As Long
    Dim sBuffer() As Byte
    Dim lBufferLen As Long
    Dim lVerPointer As Long
    Dim udtVerBuffer As VS_FIXEDFILEINFO
    Dim lVerbufferLen As Long
    Dim FileSubType As String
    
        lBufferLen = GetFileVersionInfoSize(Percorso, lDummy)
        If lBufferLen < 1 Then
             Exit Function
        End If
        ReDim sBuffer(lBufferLen)
        rc = GetFileVersionInfo(Percorso, 0&, lBufferLen, sBuffer(0))
        rc = VerQueryValue(sBuffer(0), "\", lVerPointer, lVerbufferLen)
        MoveMemory udtVerBuffer, lVerPointer, Len(udtVerBuffer)
        
        StrucVer = Format$(udtVerBuffer.dwStrucVersionh) & "." & Format$(udtVerBuffer.dwStrucVersionl)
        'trova file version
        FileVer = Format$(udtVerBuffer.dwFileVersionMSh) & "." & Format$(udtVerBuffer.dwFileVersionMSl) & "." & Format$(udtVerBuffer.dwFileVersionLSh) & "." & Format$(udtVerBuffer.dwFileVersionLSl)
        'trova la product version
        ProdVer = Format$(udtVerBuffer.dwProductVersionMSh) & "." & Format$(udtVerBuffer.dwProductVersionMSl) & "." & Format$(udtVerBuffer.dwProductVersionLSh) & "." & Format$(udtVerBuffer.dwProductVersionLSl)
    
        'trova l'os del file
        Select Case udtVerBuffer.dwFileOS
            Case VOS_DOS_WINDOWS16
                FileOS = "DOS-Win16"
            Case VOS_DOS_WINDOWS32
                FileOS = "DOS-Win32"
            Case VOS_OS216_PM16
                FileOS = "OS/2-16 PM-16"
            Case VOS_OS232_PM32
                FileOS = "OS/2-16 PM-32"
            Case VOS_NT_WINDOWS32
                FileOS = "NT-Win32"
            Case Else
                FileOS = "Non specificato"
        End Select
        Select Case udtVerBuffer.dwFileType
            Case VFT_APP
                FileType = "EXE"
            Case VFT_DLL
                FileType = "DLL"
            Case VFT_DRV
                FileType = "Driver"
                Select Case udtVerBuffer.dwFileSubtype
                    Case VFT2_DRV_PRINTER
                        FileSubType = "Printer drv"
                    Case VFT2_DRV_KEYBOARD
                        FileSubType = "Keyboard drv"
                    Case VFT2_DRV_LANGUAGE
                        FileSubType = "Language drv"
                    Case VFT2_DRV_DISPLAY
                        FileSubType = "Display drv"
                    Case VFT2_DRV_MOUSE
                        FileSubType = "Mouse drv"
                    Case VFT2_DRV_NETWORK
                        FileSubType = "Network drv"
                    Case VFT2_DRV_SYSTEM
                        FileSubType = "System drv"
                    Case VFT2_DRV_INSTALLABLE
                        FileSubType = "Installable"
                    Case VFT2_DRV_SOUND
                        FileSubType = "Sound drv"
                    Case VFT2_DRV_COMM
                        FileSubType = "Comm drv"
                    Case VFT2_UNKNOWN
                        FileSubType = "Sconosciuto"
                End Select
            Case VFT_FONT
                FileType = "Font"
            Case VFT_VXD
                FileType = "VxD"
            Case VFT_STATIC_LIB
                FileType = "Lib"
            Case Else
                FileType = "Sconosciuto"
        End Select
        
        'valori di ritorno
        fileVerInfo.FileVersion = FileVer
        fileVerInfo.ProdVersion = ProdVer
        fileVerInfo.Os = FileOS
        fileVerInfo.Tipo = FileType & " " & FileSubType
    Exit Function
    lblError:
        MsgBox Err.Number & " " & Err.Description
       
    End Function

    nella routine che lo richiama
    dove cd1 è una commondialog
    list1 è una listbox
    text1 una textbox
    command1 è un commandbutton

    codice:
    Private Sub Command1_Click()
    Dim F As File
        List1.Clear
        cd1.ShowOpen
        cd1.CancelError = False
        Text1.Text = cd1.FileName
        F = fileVerInfo(cd1.FileName)
        List1.AddItem "FileVersion: " & F.FileVersion
        List1.AddItem "ProdVersion: " & F.ProdVersion
        List1.AddItem "O.S. :       " & F.Os
        List1.AddItem "Tipo:        " & F.Tipo
        
    End Sub
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    13
    Caro Xegallo sei stato + che esauriente....
    Modificherò qualche riga di codice ed elimino tutti quei select case in + (so già che il file da controllare è solo un eseguibile) e lo applico subito sul mio progetto così lo verifico...

    Un'altra cosa: Il programma appena trova questo file nuovo in teoria lo dovrebbe copiare sulla cartella del programma sostituendo a questo punto l'exe attuale di esecuzione del programma.
    Hai qualche consiglio da potermi dare? Posso secondo te sostituire il file exe mentre è in esecuzione?

    Ciao e Grazie

  4. #4
    Originariamente inviato da dejavoo
    Caro Xegallo sei stato + che esauriente....
    Modificherò qualche riga di codice ed elimino tutti quei select case in + (so già che il file da controllare è solo un eseguibile) e lo applico subito sul mio progetto così lo verifico...

    Un'altra cosa: Il programma appena trova questo file nuovo in teoria lo dovrebbe copiare sulla cartella del programma sostituendo a questo punto l'exe attuale di esecuzione del programma.
    Hai qualche consiglio da potermi dare? Posso secondo te sostituire il file exe mentre è in esecuzione?

    Ciao e Grazie
    allora un file non può cancellare se stesso perciò ti consiglio o di creare un file *.bat alla chiusura del programma che viene lanciato immediatamente prima che il programma si chiuda, o meglio far gestire gli aggiornamenti ad un altro programma. Io personalmente adotto la seconda opzione dal momento che gestisco svariati programmi che necessitano di aggiornamenti
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    13
    Mi hai dato degli ottimi suggerimenti... Anche io la penso come te ed opterei per la seconda ma a volte per scelte tecniche(Clienti=Casino) preferisco che il programma faccia tutto da solo lasciando pochissimo spazio al cliente... capisci cosa intendo?

    Grazie per l'aiuto.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    13
    Scusami xegallo
    Mi diresti la sinstassi per far copiare un file da un percorso ad un'altro da scrivere sul file bat?

    Grazie

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    88
    Originariamente inviato da dejavoo
    Scusami xegallo
    Mi diresti la sinstassi per far copiare un file da un percorso ad un'altro da scrivere sul file bat?

    Grazie
    codice:
    copy PathOrigine+NomeFile PathDestinazione+NomeFile

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    13
    grazie cidific...
    purtroppo avevo avuto un lapsus temporaneo

    Grazie

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    88

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.