Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Option Explicit
- ' file informations
- Public Filename As String ' file pathname
- Public StrucVer As String ' file info struct version
- Public FileVer As String ' file version
- Public ProdVer As String ' product version
- Public FileFlags As String ' file flags
- Public FileOS As String ' file OS
- Public FileType As String ' file type
- Public FileSubType As String ' file subtype
- ' https://msdn.microsoft.com/en-us/library/windows/desktop/ms646997(v=vs.85).aspx
- Private Type VS_FIXEDFILEINFO
- dwSignature As Long
- dwStrucVersionl As Integer ' e.g. = &h0000 = 0
- dwStrucVersionh As Integer ' e.g. = &h0042 = .42
- dwFileVersionMSl As Integer ' e.g. = &h0003 = 3
- dwFileVersionMSh As Integer ' e.g. = &h0075 = .75
- dwFileVersionLSl As Integer ' e.g. = &h0000 = 0
- dwFileVersionLSh As Integer ' e.g. = &h0031 = .31
- dwProductVersionMSl As Integer ' e.g. = &h0003 = 3
- dwProductVersionMSh As Integer ' e.g. = &h0010 = .1
- dwProductVersionLSl As Integer ' e.g. = &h0000 = 0
- dwProductVersionLSh As Integer ' e.g. = &h0031 = .31
- dwFileFlagsMask As Long ' = &h3F 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 Type
- ' version and support APIs
- 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)
- Private Declare Function GetSystemDirectory Lib "kernel32" Alias _
- "GetSystemDirectoryA" (ByVal Path As String, _
- ByVal cbBytes As Long) As Long
- ' ===== From Win32 Ver.h =================
- ' ----- VS_VERSION.dwFileFlags -----
- Private Const VS_FFI_SIGNATURE = &HFEEF04BD
- Private Const VS_FFI_STRUCVERSION = &H10000
- Private Const VS_FFI_FILEFLAGSMASK = &H3F&
- ' ----- VS_VERSION.dwFileFlags -----
- 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
- ' ----- VS_VERSION.dwFileOS -----
- 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
- ' ----- VS_VERSION.dwFileType -----
- 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
- ' ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_DRV -----
- 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
- ' fonts
- Private Const VFT_FONT_RASTER = &H1&
- Private Const VFT_FONT_VECTOR = &H2&
- Private Const VFT_FONT_TRUETYPE = &H3&
- Public Function LoadVerInfo(ByVal sFileName As String) As Boolean
- 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
- '*** Initialize ****
- LoadVerInfo = False
- Filename = sFileName
- '*** Get size ****
- lBufferLen = GetFileVersionInfoSize(Filename, lDummy)
- If lBufferLen < 1 Then
- Exit Function
- End If
- '**** Store info to udtVerBuffer struct ****
- ReDim sBuffer(lBufferLen)
- rc = GetFileVersionInfo(Filename, 0&, lBufferLen, sBuffer(0))
- rc = VerQueryValue(sBuffer(0), "\", lVerPointer, lVerbufferLen)
- MoveMemory udtVerBuffer, lVerPointer, Len(udtVerBuffer)
- '**** Determine Structure Version number - NOT USED ****
- StrucVer = Format$(udtVerBuffer.dwStrucVersionh) & "." & _
- Format$(udtVerBuffer.dwStrucVersionl)
- '**** Determine File Version number ****
- FileVer = Format$(udtVerBuffer.dwFileVersionMSh) & "." & _
- Format$(udtVerBuffer.dwFileVersionMSl) & "." & _
- Format$(udtVerBuffer.dwFileVersionLSh) & "." & _
- Format$(udtVerBuffer.dwFileVersionLSl)
- '**** Determine Product Version number ****
- ProdVer = Format$(udtVerBuffer.dwProductVersionMSh) & "." & _
- Format$(udtVerBuffer.dwProductVersionMSl) & "." & _
- Format$(udtVerBuffer.dwProductVersionLSh) & "." & _
- Format$(udtVerBuffer.dwProductVersionLSl)
- '**** Determine Boolean attributes of File ****
- FileFlags = ""
- If udtVerBuffer.dwFileFlags And VS_FF_DEBUG _
- Then FileFlags = "Debug "
- If udtVerBuffer.dwFileFlags And VS_FF_PRERELEASE _
- Then FileFlags = FileFlags & "PreRel "
- If udtVerBuffer.dwFileFlags And VS_FF_PATCHED _
- Then FileFlags = FileFlags & "Patched "
- If udtVerBuffer.dwFileFlags And VS_FF_PRIVATEBUILD _
- Then FileFlags = FileFlags & "Private "
- If udtVerBuffer.dwFileFlags And VS_FF_INFOINFERRED _
- Then FileFlags = FileFlags & "Info "
- If udtVerBuffer.dwFileFlags And VS_FF_SPECIALBUILD _
- Then FileFlags = FileFlags & "Special "
- If udtVerBuffer.dwFileFlags And VFT2_UNKNOWN _
- Then FileFlags = FileFlags + "Unknown "
- '**** Determine OS for which file was designed ****
- 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 = "Unknown"
- End Select
- Select Case udtVerBuffer.dwFileType
- Case VFT_APP
- FileType = "App"
- 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 = "Unknown"
- End Select
- Case VFT_FONT
- FileType = "Font"
- Select Case udtVerBuffer.dwFileSubtype
- Case VFT_FONT_RASTER
- FileSubType = "Raster Font"
- Case VFT_FONT_VECTOR
- FileSubType = "Vector Font"
- Case VFT_FONT_TRUETYPE
- FileSubType = "TrueType Font"
- End Select
- Case VFT_VXD
- FileType = "VxD"
- Case VFT_STATIC_LIB
- FileType = "Lib"
- Case Else
- FileType = "Unknown"
- End Select
- LoadVerInfo = True
- End Function
- ' usage sample
- Sub Main()
- Dim sFileName
- Dim sMsg
- If Len(Command) > 0 Then
- ' use given pathname
- sFileName = Command
- Else
- ' use default (ntdll.dll)
- sFileName = Environ("SYSTEMROOT") & "\System32\ntdll.dll"
- End If
- ' try loading version informations
- If Not LoadVerInfo(sFileName) Then
- sMsg = "Cannot read version informations from " & sFileName
- MsgBox sMsg, vbOKOnly + vbExclamation, "Version Info"
- Exit Sub
- End If
- ' display informations
- sMsg = "Filename : " & sFileName & vbCrLf & _
- "File version : " & FileVer & vbCrLf & _
- "Product version : " & ProdVer & vbCrLf & _
- "File flags : " & FileFlags & vbCrLf & _
- "File OS : " & FileOS & vbCrLf & _
- "File type : " & FileType & vbCrLf & _
- "File subtype : " & FileSubType & vbCrLf
- MsgBox sMsg, vbOKOnly + vbInformation, "Version Info"
- End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement