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