Advertisement
Guest User

verinfo.bas

a guest
Feb 20th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Option Explicit
  2.  
  3. Public Filename As String
  4. Public StrucVer As String
  5. Public FileVer As String
  6. Public ProdVer As String
  7. Public FileFlags As String
  8. Public FileOS As String
  9. Public FileType As String
  10. Public FileSubType As String
  11.  
  12. Private Type VS_FIXEDFILEINFO
  13.    dwSignature As Long
  14.    dwStrucVersionl As Integer     '  e.g. = &h0000 = 0
  15.   dwStrucVersionh As Integer     '  e.g. = &h0042 = .42
  16.   dwFileVersionMSl As Integer    '  e.g. = &h0003 = 3
  17.   dwFileVersionMSh As Integer    '  e.g. = &h0075 = .75
  18.   dwFileVersionLSl As Integer    '  e.g. = &h0000 = 0
  19.   dwFileVersionLSh As Integer    '  e.g. = &h0031 = .31
  20.   dwProductVersionMSl As Integer '  e.g. = &h0003 = 3
  21.   dwProductVersionMSh As Integer '  e.g. = &h0010 = .1
  22.   dwProductVersionLSl As Integer '  e.g. = &h0000 = 0
  23.   dwProductVersionLSh As Integer '  e.g. = &h0031 = .31
  24.   dwFileFlagsMask As Long        '  = &h3F for version "0.42"
  25.   dwFileFlags As Long            '  e.g. VFF_DEBUG Or VFF_PRERELEASE
  26.   dwFileOS As Long               '  e.g. VOS_DOS_WINDOWS16
  27.   dwFileType As Long             '  e.g. VFT_DRIVER
  28.   dwFileSubtype As Long          '  e.g. VFT2_DRV_KEYBOARD
  29.   dwFileDateMS As Long           '  e.g. 0
  30.   dwFileDateLS As Long           '  e.g. 0
  31. End Type
  32.  
  33. Private Declare Function GetFileVersionInfo Lib "Version.dll" Alias _
  34.    "GetFileVersionInfoA" (ByVal lptstrFilename As String, ByVal _
  35.    dwhandle As Long, ByVal dwlen As Long, lpData As Any) As Long
  36.    
  37. Private Declare Function GetFileVersionInfoSize Lib "Version.dll" Alias _
  38.    "GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, _
  39.    lpdwHandle As Long) As Long
  40.    
  41. Private Declare Function VerQueryValue Lib "Version.dll" Alias _
  42.    "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, _
  43.    lplpBuffer As Any, puLen As Long) As Long
  44.    
  45. Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
  46.    (dest As Any, ByVal Source As Long, ByVal length As Long)
  47.  
  48. Private Declare Function GetSystemDirectory Lib "kernel32" Alias _
  49.    "GetSystemDirectoryA" (ByVal Path As String, _
  50.                           ByVal cbBytes As Long) As Long
  51.  
  52. ' ===== From Win32 Ver.h =================
  53. ' ----- VS_VERSION.dwFileFlags -----
  54. Private Const VS_FFI_SIGNATURE = &HFEEF04BD
  55. Private Const VS_FFI_STRUCVERSION = &H10000
  56. Private Const VS_FFI_FILEFLAGSMASK = &H3F&
  57.  
  58. ' ----- VS_VERSION.dwFileFlags -----
  59. Private Const VS_FF_DEBUG = &H1
  60. Private Const VS_FF_PRERELEASE = &H2
  61. Private Const VS_FF_PATCHED = &H4
  62. Private Const VS_FF_PRIVATEBUILD = &H8
  63. Private Const VS_FF_INFOINFERRED = &H10
  64. Private Const VS_FF_SPECIALBUILD = &H20
  65.  
  66. ' ----- VS_VERSION.dwFileOS -----
  67. Private Const VOS_UNKNOWN = &H0
  68. Private Const VOS_DOS = &H10000
  69. Private Const VOS_OS216 = &H20000
  70. Private Const VOS_OS232 = &H30000
  71. Private Const VOS_NT = &H40000
  72.  
  73. Private Const VOS__BASE = &H0
  74. Private Const VOS__WINDOWS16 = &H1
  75. Private Const VOS__PM16 = &H2
  76. Private Const VOS__PM32 = &H3
  77. Private Const VOS__WINDOWS32 = &H4
  78.  
  79. Private Const VOS_DOS_WINDOWS16 = &H10001
  80. Private Const VOS_DOS_WINDOWS32 = &H10004
  81. Private Const VOS_OS216_PM16 = &H20002
  82. Private Const VOS_OS232_PM32 = &H30003
  83. Private Const VOS_NT_WINDOWS32 = &H40004
  84.  
  85. ' ----- VS_VERSION.dwFileType -----
  86. Private Const VFT_UNKNOWN = &H0
  87. Private Const VFT_APP = &H1
  88. Private Const VFT_DLL = &H2
  89. Private Const VFT_DRV = &H3
  90. Private Const VFT_FONT = &H4
  91. Private Const VFT_VXD = &H5
  92. Private Const VFT_STATIC_LIB = &H7
  93.  
  94. ' ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_DRV -----
  95. Private Const VFT2_UNKNOWN = &H0
  96. Private Const VFT2_DRV_PRINTER = &H1
  97. Private Const VFT2_DRV_KEYBOARD = &H2
  98. Private Const VFT2_DRV_LANGUAGE = &H3
  99. Private Const VFT2_DRV_DISPLAY = &H4
  100. Private Const VFT2_DRV_MOUSE = &H5
  101. Private Const VFT2_DRV_NETWORK = &H6
  102. Private Const VFT2_DRV_SYSTEM = &H7
  103. Private Const VFT2_DRV_INSTALLABLE = &H8
  104. Private Const VFT2_DRV_SOUND = &H9
  105. Private Const VFT2_DRV_COMM = &HA
  106.  
  107. Public Function LoadVerInfo(ByVal sFileName As String) As Boolean
  108.    Dim rc                As Long
  109.    Dim lDummy            As Long
  110.    Dim sBuffer()         As Byte
  111.    Dim lBufferLen        As Long
  112.    Dim lVerPointer       As Long
  113.    Dim udtVerBuffer      As VS_FIXEDFILEINFO
  114.    Dim lVerbufferLen     As Long
  115.  
  116.    '*** Initialize ****
  117.   LoadVerInfo = False
  118.    Filename = sFileName
  119.  
  120.    '*** Get size ****
  121.   lBufferLen = GetFileVersionInfoSize(Filename, lDummy)
  122.    If lBufferLen < 1 Then
  123.       Exit Function
  124.    End If
  125.  
  126.    '**** Store info to udtVerBuffer struct ****
  127.   ReDim sBuffer(lBufferLen)
  128.    rc = GetFileVersionInfo(Filename, 0&, lBufferLen, sBuffer(0))
  129.    rc = VerQueryValue(sBuffer(0), "\", lVerPointer, lVerbufferLen)
  130.    MoveMemory udtVerBuffer, lVerPointer, Len(udtVerBuffer)
  131.  
  132.    '**** Determine Structure Version number - NOT USED ****
  133.   StrucVer = Format$(udtVerBuffer.dwStrucVersionh) & "." & _
  134.       Format$(udtVerBuffer.dwStrucVersionl)
  135.  
  136.    '**** Determine File Version number ****
  137.   FileVer = Format$(udtVerBuffer.dwFileVersionMSh) & "." & _
  138.       Format$(udtVerBuffer.dwFileVersionMSl) & "." & _
  139.       Format$(udtVerBuffer.dwFileVersionLSh) & "." & _
  140.       Format$(udtVerBuffer.dwFileVersionLSl)
  141.  
  142.    '**** Determine Product Version number ****
  143.   ProdVer = Format$(udtVerBuffer.dwProductVersionMSh) & "." & _
  144.       Format$(udtVerBuffer.dwProductVersionMSl) & "." & _
  145.       Format$(udtVerBuffer.dwProductVersionLSh) & "." & _
  146.       Format$(udtVerBuffer.dwProductVersionLSl)
  147.  
  148.    '**** Determine Boolean attributes of File ****
  149.   FileFlags = ""
  150.    If udtVerBuffer.dwFileFlags And VS_FF_DEBUG _
  151.       Then FileFlags = "Debug "
  152.    If udtVerBuffer.dwFileFlags And VS_FF_PRERELEASE _
  153.       Then FileFlags = FileFlags & "PreRel "
  154.    If udtVerBuffer.dwFileFlags And VS_FF_PATCHED _
  155.       Then FileFlags = FileFlags & "Patched "
  156.    If udtVerBuffer.dwFileFlags And VS_FF_PRIVATEBUILD _
  157.       Then FileFlags = FileFlags & "Private "
  158.    If udtVerBuffer.dwFileFlags And VS_FF_INFOINFERRED _
  159.       Then FileFlags = FileFlags & "Info "
  160.    If udtVerBuffer.dwFileFlags And VS_FF_SPECIALBUILD _
  161.       Then FileFlags = FileFlags & "Special "
  162.    If udtVerBuffer.dwFileFlags And VFT2_UNKNOWN _
  163.       Then FileFlags = FileFlags + "Unknown "
  164.  
  165.    '**** Determine OS for which file was designed ****
  166.   Select Case udtVerBuffer.dwFileOS
  167.       Case VOS_DOS_WINDOWS16
  168.         FileOS = "DOS-Win16"
  169.       Case VOS_DOS_WINDOWS32
  170.         FileOS = "DOS-Win32"
  171.       Case VOS_OS216_PM16
  172.         FileOS = "OS/2-16 PM-16"
  173.       Case VOS_OS232_PM32
  174.         FileOS = "OS/2-16 PM-32"
  175.       Case VOS_NT_WINDOWS32
  176.         FileOS = "NT-Win32"
  177.       Case Else
  178.         FileOS = "Unknown"
  179.    End Select
  180.    Select Case udtVerBuffer.dwFileType
  181.       Case VFT_APP
  182.          FileType = "App"
  183.       Case VFT_DLL
  184.          FileType = "DLL"
  185.       Case VFT_DRV
  186.          FileType = "Driver"
  187.          Select Case udtVerBuffer.dwFileSubtype
  188.             Case VFT2_DRV_PRINTER
  189.                FileSubType = "Printer drv"
  190.             Case VFT2_DRV_KEYBOARD
  191.                FileSubType = "Keyboard drv"
  192.             Case VFT2_DRV_LANGUAGE
  193.                FileSubType = "Language drv"
  194.             Case VFT2_DRV_DISPLAY
  195.                FileSubType = "Display drv"
  196.             Case VFT2_DRV_MOUSE
  197.                FileSubType = "Mouse drv"
  198.             Case VFT2_DRV_NETWORK
  199.                FileSubType = "Network drv"
  200.             Case VFT2_DRV_SYSTEM
  201.                FileSubType = "System drv"
  202.             Case VFT2_DRV_INSTALLABLE
  203.                FileSubType = "Installable"
  204.             Case VFT2_DRV_SOUND
  205.                FileSubType = "Sound drv"
  206.             Case VFT2_DRV_COMM
  207.                FileSubType = "Comm drv"
  208.             Case VFT2_UNKNOWN
  209.                FileSubType = "Unknown"
  210.          End Select
  211.       Case VFT_FONT
  212.          FileType = "Font"
  213. '         Select Case udtVerBuffer.dwFileSubtype
  214. '            Case VFT_FONT_RASTER
  215. '               FileSubType = "Raster Font"
  216. '            Case VFT_FONT_VECTOR
  217. '               FileSubType = "Vector Font"
  218. '            Case VFT_FONT_TRUETYPE
  219. '               FileSubType = "TrueType Font"
  220. '         End Select
  221.      Case VFT_VXD
  222.          FileType = "VxD"
  223.       Case VFT_STATIC_LIB
  224.          FileType = "Lib"
  225.       Case Else
  226.          FileType = "Unknown"
  227.    End Select
  228.    
  229.    LoadVerInfo = True
  230. End Function
  231.  
  232. Sub Main()
  233.   Dim sFileName
  234.   Dim sMsg
  235.  
  236.   sFileName = Environ("SYSTEMROOT") & "\System32\ntdll.dll"
  237.   If Not LoadVerInfo(sFileName) Then
  238.     MsgBox "Version informations not available", vbOKOnly + vbExclamation, "Version Info"
  239.     Exit Sub
  240.   End If
  241.  
  242.   sMsg = "Filename " & sFileName & vbCrLf & _
  243.          "File version " & FileVer & vbCrLf & _
  244.          "Product version " & ProdVer & vbCrLf
  245.          
  246.   MsgBox sMsg, vbOKOnly + vbInformation, "Version Info"
  247. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement