Attribute VB_Name = "mGetDllVersion" Option ExplicitPrivate 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 Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length 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 Type VS_FIXEDFILEINFO dwSignature As Long dwStrucVersion As Long ' e.g. 0x00000042 = "0.42" ' dwFileVersionMS As Long ' e.g. 0x00030075 = "3.75" ' separate into high-order and low-order integers dwFileVersionMS_lo As Integer ' e.g. "3" dwFileVersionMS_hi As Integer ' e.g. ".75" ' dwFileVersionLS As Long ' e.g. 0x00000031 = "0.31" ' separate into high-order and low-order integers dwFileVersionLS_lo As Integer ' e.g. "0" dwFileVersionLS_hi As Integer ' e.g. ".31" dwProductVersionMS As Long ' e.g. 0x00030010 = "3.10" dwProductVersionLS As Long ' e.g. 0x00000031 = "0.31" dwFileFlagsMask As Long ' = 0x3F for version "0.42" dwFileFlags As Long ' e.g. VFF_DEBUG Or VFF_PRERELEASE dwFileOS As Long ' e.g. VOS_DOS_WINDOWS16 dwFileType As Long ' e.g. VFT_DRIVER dwFileSubtype As Long ' e.g. VFT2_DRV_KEYBOARD dwFileDateMS As Long ' e.g. 0 dwFileDateLS As Long ' e.g. 0 End TypePublic Function GetFileVer(ByVal strFilePath As String) As String Dim lngBufferLen As Long Dim lngHandle As Long Dim strBuffer() As Byte Dim lngPointerBuffer As Long Dim lngVerLen As Long Dim VerBuffer As VS_FIXEDFILEINFO Dim strFileVer As String ' Check for existence of file If Dir(strFilePath) = "" Then GetFileVer = "-1" Exit Function End If lngBufferLen = GetFileVersionInfoSize(strFilePath, lngHandle) ' lngHandle is unused If lngBufferLen = 0 Then GetFileVer = "0" Exit Function End If ReDim strBuffer(lngBufferLen) Call GetFileVersionInfo(strFilePath, 0&, lngBufferLen, strBuffer(0)) Call VerQueryValue(strBuffer(0), "\", lngPointerBuffer, lngVerLen) Call CopyMemory(VerBuffer, ByVal lngPointerBuffer, Len(VerBuffer)) strFileVer = Format(VerBuffer.dwFileVersionMS_hi) & "." strFileVer = strFileVer & Format$(VerBuffer.dwFileVersionMS_lo, "0") & "." If VerBuffer.dwFileVersionLS_hi > 0 Then strFileVer = strFileVer & Format(VerBuffer.dwFileVersionLS_hi, "0") & "." End If strFileVer = strFileVer & Format(VerBuffer.dwFileVersionLS_lo, "0") GetFileVer = strFileVer End Function
Option ExplicitPrivate 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 Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length 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 Type VS_FIXEDFILEINFO
dwSignature As Long
dwStrucVersion As Long ' e.g. 0x00000042 = "0.42"
' dwFileVersionMS As Long ' e.g. 0x00030075 = "3.75"
' separate into high-order and low-order integers
dwFileVersionMS_lo As Integer ' e.g. "3"
dwFileVersionMS_hi As Integer ' e.g. ".75"
' dwFileVersionLS As Long ' e.g. 0x00000031 = "0.31"
' separate into high-order and low-order integers
dwFileVersionLS_lo As Integer ' e.g. "0"
dwFileVersionLS_hi As Integer ' e.g. ".31"
dwProductVersionMS As Long ' e.g. 0x00030010 = "3.10"
dwProductVersionLS As Long ' e.g. 0x00000031 = "0.31"
dwFileFlagsMask As Long ' = 0x3F for version "0.42"
dwFileFlags As Long ' e.g. VFF_DEBUG Or VFF_PRERELEASE
dwFileOS As Long ' e.g. VOS_DOS_WINDOWS16
dwFileType As Long ' e.g. VFT_DRIVER
dwFileSubtype As Long ' e.g. VFT2_DRV_KEYBOARD
dwFileDateMS As Long ' e.g. 0
dwFileDateLS As Long ' e.g. 0
End TypePublic Function GetFileVer(ByVal strFilePath As String) As String
Dim lngBufferLen As Long
Dim lngHandle As Long
Dim strBuffer() As Byte
Dim lngPointerBuffer As Long
Dim lngVerLen As Long
Dim VerBuffer As VS_FIXEDFILEINFO
Dim strFileVer As String ' Check for existence of file
If Dir(strFilePath) = "" Then
GetFileVer = "-1"
Exit Function
End If
lngBufferLen = GetFileVersionInfoSize(strFilePath, lngHandle) ' lngHandle is unused
If lngBufferLen = 0 Then
GetFileVer = "0"
Exit Function
End If
ReDim strBuffer(lngBufferLen)
Call GetFileVersionInfo(strFilePath, 0&, lngBufferLen, strBuffer(0))
Call VerQueryValue(strBuffer(0), "\", lngPointerBuffer, lngVerLen)
Call CopyMemory(VerBuffer, ByVal lngPointerBuffer, Len(VerBuffer))
strFileVer = Format(VerBuffer.dwFileVersionMS_hi) & "."
strFileVer = strFileVer & Format$(VerBuffer.dwFileVersionMS_lo, "0") & "."
If VerBuffer.dwFileVersionLS_hi > 0 Then
strFileVer = strFileVer & Format(VerBuffer.dwFileVersionLS_hi, "0") & "."
End If
strFileVer = strFileVer & Format(VerBuffer.dwFileVersionLS_lo, "0")
GetFileVer = strFileVer
End Function