home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 1_2002.ISO / Data / Zips / CODE_UPLOAD88928122000.psc / CFileVersionInfo.cls < prev    next >
Encoding:
Visual Basic class definition  |  1998-08-20  |  17.4 KB  |  503 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "CFileVersionInfo"
  6. Attribute VB_GlobalNameSpace = False
  7. Attribute VB_Creatable = True
  8. Attribute VB_PredeclaredId = False
  9. Attribute VB_Exposed = False
  10. ' *********************************************************************
  11. '  Copyright (C)1995-98 Karl E. Peterson, All Rights Reserved
  12. '  http://www.mvps.org/vb
  13. ' *********************************************************************
  14. '  Warning: This computer program is protected by copyright law and
  15. '  international treaties. Unauthorized reproduction or distribution
  16. '  of this program, or any portion of it, may result in severe civil
  17. '  and criminal penalties, and will be prosecuted to the maximum
  18. '  extent possible under the law.
  19. ' *********************************************************************
  20. Option Explicit
  21. '
  22. ' API declarations
  23. '
  24. Private Declare Function GetFullPathName Lib "kernel32" Alias "GetFullPathNameA" (ByVal lpFileName As String, ByVal nBufferLength As Long, ByVal lpBuffer As String, lpFilePart As Long) As Long
  25. 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
  26. Private Declare Function GetFileVersionInfoSize Lib "Version.dll" Alias "GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, lpdwHandle As Long) As Long
  27. Private Declare Function VerQueryValue Lib "Version.dll" Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, lplpBuffer As Any, puLen As Long) As Long
  28. Private Declare Function VerLanguageName Lib "kernel32" Alias "VerLanguageNameA" (ByVal wLang As Long, ByVal szLang As String, ByVal nSize As Long) As Long
  29. Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal Path As String, ByVal cbBytes As Long) As Long
  30. Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  31. Private Declare Function lstrlenA Lib "kernel32" (ByVal lpString As Long) As Long
  32. Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
  33. '
  34. ' API structures.
  35. '
  36. Private Type VS_FIXEDFILEINFO
  37.    dwSignature As Long
  38.    dwStrucVersionl As Integer     '  e.g. = &h0000 = 0
  39.    dwStrucVersionh As Integer     '  e.g. = &h0042 = .42
  40.    dwFileVersionMSl As Integer    '  e.g. = &h0003 = 3
  41.    dwFileVersionMSh As Integer    '  e.g. = &h0075 = .75
  42.    dwFileVersionLSl As Integer    '  e.g. = &h0000 = 0
  43.    dwFileVersionLSh As Integer    '  e.g. = &h0031 = .31
  44.    dwProductVersionMSl As Integer '  e.g. = &h0003 = 3
  45.    dwProductVersionMSh As Integer '  e.g. = &h0010 = .1
  46.    dwProductVersionLSl As Integer '  e.g. = &h0000 = 0
  47.    dwProductVersionLSh As Integer '  e.g. = &h0031 = .31
  48.    dwFileFlagsMask As Long        '  = &h3F for version "0.42"
  49.    dwFileFlags As Long            '  e.g. VFF_DEBUG Or VFF_PRERELEASE
  50.    dwFileOS As Long               '  e.g. VOS_DOS_WINDOWS16
  51.    dwFileType As Long             '  e.g. VFT_DRIVER
  52.    dwFileSubtype As Long          '  e.g. VFT2_DRV_KEYBOARD
  53.    dwFileDateMS As Long           '  e.g. 0
  54.    dwFileDateLS As Long           '  e.g. 0
  55. End Type
  56. '
  57. ' API constants.
  58. '
  59. Private Const MAX_PATH = 260
  60. ' ----- VS_VERSION.dwFileFlags -----
  61. Private Const VS_FFI_SIGNATURE = &HFEEF04BD
  62. Private Const VS_FFI_STRUCVERSION = &H10000
  63. Private Const VS_FFI_FILEFLAGSMASK = &H3F&
  64. ' ----- VS_VERSION.dwFileFlags -----
  65. Private Const VS_FF_DEBUG = &H1
  66. Private Const VS_FF_PRERELEASE = &H2
  67. Private Const VS_FF_PATCHED = &H4
  68. Private Const VS_FF_PRIVATEBUILD = &H8
  69. Private Const VS_FF_INFOINFERRED = &H10
  70. Private Const VS_FF_SPECIALBUILD = &H20
  71. ' ----- VS_VERSION.dwFileOS -----
  72. Private Const VOS_UNKNOWN = &H0
  73. Private Const VOS_DOS = &H10000
  74. Private Const VOS_OS216 = &H20000
  75. Private Const VOS_OS232 = &H30000
  76. Private Const VOS_NT = &H40000
  77. Private Const VOS_DOS_WINDOWS16 = &H10001
  78. Private Const VOS_DOS_WINDOWS32 = &H10004
  79. Private Const VOS_OS216_PM16 = &H20002
  80. Private Const VOS_OS232_PM32 = &H30003
  81. Private Const VOS_NT_WINDOWS32 = &H40004
  82. ' ----- VS_VERSION.dwFileType -----
  83. Private Const VFT_UNKNOWN = &H0
  84. Private Const VFT_APP = &H1
  85. Private Const VFT_DLL = &H2
  86. Private Const VFT_DRV = &H3
  87. Private Const VFT_FONT = &H4
  88. Private Const VFT_VXD = &H5
  89. Private Const VFT_STATIC_LIB = &H7
  90. ' **** VS_VERSION.dwFileSubtype for VFT_WINDOWS_FONT ****
  91. Private Const VFT2_FONT_RASTER = &H1&
  92. Private Const VFT2_FONT_VECTOR = &H2&
  93. Private Const VFT2_FONT_TRUETYPE = &H3&
  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. ' Member variables.
  108. '
  109. Private m_PathName As String
  110. Private m_Available As Boolean
  111. Private m_StrucVer As String     ' Structure Version - NOT USED
  112. Private m_FileVer As String      ' File Version
  113. Private m_ProdVer As String      ' Product Version
  114. Private m_FileFlags As String    ' Boolean attributes of file
  115. Private m_FileOS As String       ' OS file is designed for
  116. Private m_FileType As String     ' Type of file
  117. Private m_FileSubType As String  ' Sub-type of file
  118. Private m_VerLanguage As String
  119. Private m_VerCompany As String
  120. Private m_VerDescription As String
  121. Private m_VerFileVer As String
  122. Private m_VerInternalName As String
  123. Private m_VerCopyright As String
  124. Private m_VerTrademarks As String
  125. Private m_VerOrigFilename As String
  126. Private m_VerProductName As String
  127. Private m_VerProductVer As String
  128.  
  129. ' ********************************************
  130. '  Initialize and Terminate
  131. ' ********************************************
  132. Private Sub Class_Initialize()
  133.    '
  134.    ' All member variables can be left to defaults.
  135.    '
  136. End Sub
  137.  
  138. Private Sub Class_Terminate()
  139.    '
  140.    ' No special cleanup required.
  141.    '
  142. End Sub
  143.  
  144. ' ********************************************
  145. '  Public Properties
  146. ' ********************************************
  147. Public Property Let FullPathName(ByVal NewVal As String)
  148.    Dim Buffer As String
  149.    Dim nFilePart As Long
  150.    Dim nRet As Long
  151.    '
  152.    ' Retrieve fully qualified path/name specs.
  153.    '
  154.    Buffer = Space(MAX_PATH)
  155.    nRet = GetFullPathName(NewVal, Len(Buffer), Buffer, nFilePart)
  156.    If nRet Then
  157.       m_PathName = Left(Buffer, nRet)
  158.       Refresh
  159.    End If
  160. End Property
  161.  
  162. Public Property Get FullPathName() As String
  163.    ' Returns fully-qualified path/name spec.
  164.    FullPathName = m_PathName
  165. End Property
  166.  
  167. Public Property Get Available() As Boolean
  168.    ' Returns whether version information is available
  169.    Available = m_Available
  170. End Property
  171.  
  172. ' ********************************************
  173. '  Standard Version Information
  174. ' ********************************************
  175. Public Property Get FileFlags() As String
  176.    FileFlags = m_FileFlags
  177. End Property
  178.  
  179. Public Property Get FileOS() As String
  180.    FileOS = m_FileOS
  181. End Property
  182.  
  183. Public Property Get FileType() As String
  184.    FileType = m_FileType
  185. End Property
  186.  
  187. Public Property Get FileSubType() As String
  188.    FileSubType = m_FileSubType
  189. End Property
  190.  
  191. Public Property Get VerFile() As String
  192.    VerFile = m_FileVer
  193. End Property
  194.  
  195. Public Property Get VerProduct() As String
  196.    VerProduct = m_ProdVer
  197. End Property
  198.  
  199. Public Property Get VerStructure() As String
  200.    VerStructure = m_StrucVer
  201. End Property
  202.  
  203. ' ********************************************
  204. '  Better Version Information
  205. ' ********************************************
  206. Public Property Get CompanyName() As String
  207.    CompanyName = m_VerCompany
  208. End Property
  209.  
  210. Public Property Get FileDescription() As String
  211.    FileDescription = m_VerDescription
  212. End Property
  213.  
  214. Public Property Get FileVersion() As String
  215.    FileVersion = m_VerFileVer
  216. End Property
  217.  
  218. Public Property Get InternalName() As String
  219.    InternalName = m_VerInternalName
  220. End Property
  221.  
  222. Public Property Get Language() As String
  223.    Language = m_VerLanguage
  224. End Property
  225.  
  226. Public Property Get LegalCopyright() As String
  227.    LegalCopyright = m_VerCopyright
  228. End Property
  229.  
  230. Public Property Get LegalTrademarks() As String
  231.    LegalTrademarks = m_VerTrademarks
  232. End Property
  233.  
  234. Public Property Get OriginalFilename() As String
  235.    OriginalFilename = m_VerOrigFilename
  236. End Property
  237.  
  238. Public Property Get ProductName() As String
  239.    ProductName = m_VerProductName
  240. End Property
  241.  
  242. Public Property Get ProductVersion() As String
  243.    ProductVersion = m_VerProductVer
  244. End Property
  245.  
  246. ' ********************************************
  247. '  Public Methods
  248. ' ********************************************
  249. Public Sub Refresh()
  250.    Dim nDummy As Long
  251.    Dim nRet As Long
  252.    Dim sBuffer()         As Byte
  253.    Dim lBufferLen        As Long
  254.    Dim lplpBuffer       As Long
  255.    Dim udtVerBuffer      As VS_FIXEDFILEINFO
  256.    Dim puLen     As Long
  257.    Dim sBlock As String
  258.    Dim sTemp As String
  259.    '
  260.    ' Get size
  261.    '
  262.    lBufferLen = GetFileVersionInfoSize(m_PathName, nDummy)
  263.    If lBufferLen Then
  264.       m_Available = True
  265.    Else
  266.       m_Available = False
  267.       Exit Sub
  268.    End If
  269.    '
  270.    ' Store info to udtVerBuffer struct
  271.    '
  272.    ReDim sBuffer(lBufferLen)
  273.    Call GetFileVersionInfo(m_PathName, 0&, lBufferLen, sBuffer(0))
  274.    Call VerQueryValue(sBuffer(0), "\", lplpBuffer, puLen)
  275.    Call CopyMem(udtVerBuffer, ByVal lplpBuffer, Len(udtVerBuffer))
  276.    '
  277.    ' Determine Structure Version number - NOT USED
  278.    '
  279.    m_StrucVer = Format$(udtVerBuffer.dwStrucVersionh) & "." & _
  280.       Format$(udtVerBuffer.dwStrucVersionl)
  281.    '
  282.    ' Determine File Version number
  283.    '
  284.    m_FileVer = Format$(udtVerBuffer.dwFileVersionMSh) & "." & _
  285.       Format$(udtVerBuffer.dwFileVersionMSl, "00") & "."
  286.    If udtVerBuffer.dwFileVersionLSh > 0 Then
  287.       m_FileVer = m_FileVer & Format$(udtVerBuffer.dwFileVersionLSh, "00") & _
  288.          Format$(udtVerBuffer.dwFileVersionLSl, "00")
  289.    Else
  290.       m_FileVer = m_FileVer & Format$(udtVerBuffer.dwFileVersionLSl, "0000")
  291.    End If
  292.    '
  293.    ' Determine Product Version number
  294.    '
  295.    m_ProdVer = Format$(udtVerBuffer.dwProductVersionMSh) & "." & _
  296.       Format$(udtVerBuffer.dwProductVersionMSl, "00") & "."
  297.    If udtVerBuffer.dwProductVersionLSh > 0 Then
  298.       m_ProdVer = m_ProdVer & Format$(udtVerBuffer.dwProductVersionLSh, "00") & _
  299.          Format$(udtVerBuffer.dwProductVersionLSl, "00")
  300.    Else
  301.       m_ProdVer = m_ProdVer & Format$(udtVerBuffer.dwProductVersionLSl, "0000")
  302.    End If
  303.    '
  304.    ' Determine Boolean attributes of File
  305.    '
  306.    m_FileFlags = ""
  307.    If udtVerBuffer.dwFileFlags And VS_FF_DEBUG _
  308.       Then m_FileFlags = "Debug "
  309.    If udtVerBuffer.dwFileFlags And VS_FF_PRERELEASE _
  310.       Then m_FileFlags = m_FileFlags & "PreRel "
  311.    If udtVerBuffer.dwFileFlags And VS_FF_PATCHED _
  312.       Then m_FileFlags = m_FileFlags & "Patched "
  313.    If udtVerBuffer.dwFileFlags And VS_FF_PRIVATEBUILD _
  314.       Then m_FileFlags = m_FileFlags & "Private "
  315.    If udtVerBuffer.dwFileFlags And VS_FF_INFOINFERRED _
  316.       Then m_FileFlags = m_FileFlags & "Info "
  317.    If udtVerBuffer.dwFileFlags And VS_FF_SPECIALBUILD _
  318.       Then m_FileFlags = m_FileFlags & "Special "
  319.    If udtVerBuffer.dwFileFlags And VFT2_UNKNOWN _
  320.       Then m_FileFlags = m_FileFlags + "Unknown "
  321.    m_FileFlags = Trim(m_FileFlags)
  322.    '
  323.    ' Determine OS for which file was designed
  324.    '
  325.    Select Case udtVerBuffer.dwFileOS
  326.       Case VOS_DOS_WINDOWS16
  327.         m_FileOS = "DOS-Win16"
  328.       Case VOS_DOS_WINDOWS32
  329.         m_FileOS = "DOS-Win32"
  330.       Case VOS_OS216_PM16
  331.         m_FileOS = "OS/2-16 PM-16"
  332.       Case VOS_OS232_PM32
  333.         m_FileOS = "OS/2-16 PM-32"
  334.       Case VOS_NT_WINDOWS32
  335.         m_FileOS = "NT-Win32"
  336.       Case Else
  337.         m_FileOS = "Unknown"
  338.    End Select
  339.    '
  340.    ' Determine type of file
  341.    '
  342.    Select Case udtVerBuffer.dwFileType
  343.       Case VFT_APP
  344.          m_FileType = "Application"
  345.       Case VFT_DLL
  346.          m_FileType = "DLL"
  347.       Case VFT_DRV
  348.          m_FileType = "Driver"
  349.          Select Case udtVerBuffer.dwFileSubtype
  350.             Case VFT2_DRV_PRINTER
  351.                m_FileSubType = "Printer drv"
  352.             Case VFT2_DRV_KEYBOARD
  353.                m_FileSubType = "Keyboard drv"
  354.             Case VFT2_DRV_LANGUAGE
  355.                m_FileSubType = "Language drv"
  356.             Case VFT2_DRV_DISPLAY
  357.                m_FileSubType = "Display drv"
  358.             Case VFT2_DRV_MOUSE
  359.                m_FileSubType = "Mouse drv"
  360.             Case VFT2_DRV_NETWORK
  361.                m_FileSubType = "Network drv"
  362.             Case VFT2_DRV_SYSTEM
  363.                m_FileSubType = "System drv"
  364.             Case VFT2_DRV_INSTALLABLE
  365.                m_FileSubType = "Installable"
  366.             Case VFT2_DRV_SOUND
  367.                m_FileSubType = "Sound drv"
  368.             Case VFT2_DRV_COMM
  369.                m_FileSubType = "Comm drv"
  370.             Case VFT2_UNKNOWN
  371.                m_FileSubType = "Unknown"
  372.          End Select
  373.       Case VFT_FONT
  374.          m_FileType = "Font"
  375.          Select Case udtVerBuffer.dwFileSubtype
  376.             Case VFT2_FONT_RASTER
  377.                m_FileSubType = "Raster Font"
  378.             Case VFT2_FONT_VECTOR
  379.                m_FileSubType = "Vector Font"
  380.             Case VFT2_FONT_TRUETYPE
  381.                m_FileSubType = "TrueType Font"
  382.          End Select
  383.       Case VFT_VXD
  384.          m_FileType = "VxD"
  385.       Case VFT_STATIC_LIB
  386.          m_FileType = "Lib"
  387.       Case Else
  388.          m_FileType = "Unknown"
  389.    End Select
  390.    '
  391.    ' Get language translations
  392.    '
  393.    If VerQueryValue(sBuffer(0), "\VarFileInfo\Translation", lplpBuffer, puLen) Then
  394.       If puLen Then
  395.          sTemp = PointerToStringB(lplpBuffer, puLen)
  396.          sTemp = Right("0" & Hex(Asc(Mid(sTemp, 2, 1))), 2) & _
  397.                  Right("0" & Hex(Asc(Mid(sTemp, 1, 1))), 2) & _
  398.                  Right("0" & Hex(Asc(Mid(sTemp, 4, 1))), 2) & _
  399.                  Right("0" & Hex(Asc(Mid(sTemp, 3, 1))), 2)
  400.          sBlock = "\StringFileInfo\" & sTemp & "\"
  401.          '
  402.          ' Determine language
  403.          '
  404.          m_VerLanguage = Space(256)
  405.          nRet = VerLanguageName(CLng("&H" & Left(sTemp, 4)), m_VerLanguage, Len(m_VerLanguage))
  406.          If nRet Then
  407.             m_VerLanguage = Left(m_VerLanguage, nRet)
  408.          Else
  409.             m_VerLanguage = ""
  410.          End If
  411.          '
  412.          ' Get predefined version resources
  413.          '
  414.          If VerQueryValue(sBuffer(0), sBlock & "CompanyName", lplpBuffer, puLen) Then
  415.             If puLen Then
  416.                m_VerCompany = PointerToString(lplpBuffer)
  417.             End If
  418.          End If
  419.          If VerQueryValue(sBuffer(0), sBlock & "FileDescription", lplpBuffer, puLen) Then
  420.             If puLen Then
  421.                m_VerDescription = PointerToString(lplpBuffer)
  422.             End If
  423.          End If
  424.          If VerQueryValue(sBuffer(0), sBlock & "FileVersion", lplpBuffer, puLen) Then
  425.             If puLen Then
  426.                m_VerFileVer = PointerToString(lplpBuffer)
  427.             End If
  428.          End If
  429.          If VerQueryValue(sBuffer(0), sBlock & "InternalName", lplpBuffer, puLen) Then
  430.             If puLen Then
  431.                m_VerInternalName = PointerToString(lplpBuffer)
  432.             End If
  433.          End If
  434.          If VerQueryValue(sBuffer(0), sBlock & "LegalCopyright", lplpBuffer, puLen) Then
  435.             If puLen Then
  436.                m_VerCopyright = PointerToString(lplpBuffer)
  437.             End If
  438.          End If
  439.          If VerQueryValue(sBuffer(0), sBlock & "LegalTrademarks", lplpBuffer, puLen) Then
  440.             If puLen Then
  441.                m_VerTrademarks = PointerToString(lplpBuffer)
  442.             End If
  443.          End If
  444.          If VerQueryValue(sBuffer(0), sBlock & "OriginalFilename", lplpBuffer, puLen) Then
  445.             If puLen Then
  446.                m_VerOrigFilename = PointerToString(lplpBuffer)
  447.             End If
  448.          End If
  449.          If VerQueryValue(sBuffer(0), sBlock & "ProductName", lplpBuffer, puLen) Then
  450.             If puLen Then
  451.                m_VerProductName = PointerToString(lplpBuffer)
  452.             End If
  453.          End If
  454.          If VerQueryValue(sBuffer(0), sBlock & "ProductVersion", lplpBuffer, puLen) Then
  455.             If puLen Then
  456.                m_VerProductVer = PointerToString(lplpBuffer)
  457.             End If
  458.          End If
  459.       End If
  460.    End If
  461. End Sub
  462.  
  463. ' ********************************************
  464. '  Private Methods
  465. ' ********************************************
  466. Private Function PointerToStringW(lpStringW As Long) As String
  467.    Dim Buffer() As Byte
  468.    Dim nLen As Long
  469.    
  470.    If lpStringW Then
  471.       nLen = lstrlenW(lpStringW) * 2
  472.       If nLen Then
  473.          ReDim Buffer(0 To (nLen - 1)) As Byte
  474.          CopyMem Buffer(0), ByVal lpStringW, nLen
  475.          PointerToStringW = Buffer
  476.       End If
  477.    End If
  478. End Function
  479.  
  480. Private Function PointerToString(lpString As Long) As String
  481.    Dim Buffer As String
  482.    Dim nLen As Long
  483.    
  484.    If lpString Then
  485.       nLen = lstrlenA(lpString)
  486.       If nLen Then
  487.          Buffer = Space(nLen)
  488.          CopyMem ByVal Buffer, ByVal lpString, nLen
  489.          PointerToString = Buffer
  490.       End If
  491.    End If
  492. End Function
  493.  
  494. Private Function PointerToStringB(lpString As Long, nBytes As Long) As String
  495.    Dim Buffer As String
  496.    
  497.    If nBytes Then
  498.       Buffer = Space(nBytes)
  499.       CopyMem ByVal Buffer, ByVal lpString, nBytes
  500.       PointerToStringB = Buffer
  501.    End If
  502. End Function
  503.