Search code examples
internet-explorervb6version-detection

Detect Internet Explorer Version using VB6


I'm updating a legacy app and it has some functionality that detects the version of Internet Explorer that's installed, just for display and error reporting not because any components are required. The code used for IE version detection is basically the code from VBnet - DllGetVersion: Detailed Internet Explorer Version Info (Author: Kay-Christian Hansen, VBnet - Randy Birch). Unfortunately this code doesn't detect IE version greater than IE6.

So I'm wondering what the accepted VB6 method of detecting the installed version of Internet Explorer is these days?

Thanks.


Solution

  • Here is a class I use to get file version information:

    Option Explicit
    
    'property storage variables
    Private m_strCompanyName As String
    Private m_strFileDescription As String
    Private m_strFileVersion As String
    Private m_strInternalName As String
    Private m_strCopyright As String
    Private m_strOriginalFileName As String
    Private m_strProductName As String
    Private m_strProductVersion As String
    Private m_strPrivateBuild As String
    Private m_strSpecialBuild As String
    Private m_strComments As String
    Private m_strLegalTrademark As String
    
    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 GetSystemDirectory Lib "Kernel32" Alias "GetSystemDirectoryA" (ByVal Path As String, ByVal cbBytes As Long) As Long
    Private Declare Function lstrcpy Lib "Kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 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 OpenFile Lib "Kernel32" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT, ByVal wStyle 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 Const OFS_MAXPATHNAME = 128
    Private Const OF_EXIST = &H4000
    Private Const INVALID_HANDLE_VALUE = -1
    
    Private Type OFSTRUCT
        cBytes As Byte
        fFixedDisk As Byte
        nErrCode As Long
        Reserved1 As Long
        Reserved2 As Long
        szPathName(OFS_MAXPATHNAME) As Byte
    End Type
    
    Public Function GetVersionInfo(ByRef lpFile As String) As Boolean
       Dim buffer As String
       Dim rc As Long
       Dim FullFileName As String
       Dim sFName As String
       Dim lBufferLen As Long
       Dim lDummy As Long
    
       On Error GoTo errGetVersionInfo
    
       If FileExists(lpFile) Then
          buffer = String(255, 0)
          '*** Get size ****
          lBufferLen = GetFileVersionInfoSize(lpFile, lDummy)
          If lBufferLen  0 Then
                Dim bytebuffer(255) As Byte
                MoveMemory bytebuffer(0), lVerPointer, lBufferLen
                Dim Lang_Charset_String As String
                Dim HexNumber As Long
    
                HexNumber = CLng(bytebuffer(2)) + CLng(bytebuffer(3)) * &H100 + _
                    CLng(bytebuffer(0)) * &H10000 + CLng(bytebuffer(1)) * &H1000000
    
                Lang_Charset_String = Hex(HexNumber)
                'now we change the order of the language id and code page
                'and convert it into a string representation.
                'For example, it may look like 040904E4
                'Or to pull it all apart:
                '04------        = SUBLANG_ENGLISH_USA
                '--09----        = LANG_ENGLISH
                ' ----04E4 = 1252 = Codepage for Windows:Multilingual
                Do While Len(Lang_Charset_String)  0
          End If   'lBufferLen  INVALID_HANDLE_VALUE Then
            FileExists = True
        Else
            FileExists = False
        End If
    
    End Function
    
    Friend Property Get CompanyName() As String
    
       CompanyName = m_strCompanyName
    
    End Property
    Private Property Let CompanyName(ByVal vNewValue As String)
    
       m_strCompanyName = Trim$(vNewValue)
    
    End Property
    
    Friend Property Get FileDescription() As String
    
       FileDescription = m_strFileDescription
    
    End Property
    Private Property Let FileDescription(ByVal vNewValue As String)
    
       m_strFileDescription = Trim$(vNewValue)
    
    End Property
    
    Friend Property Get FileVersion() As String
    
       FileVersion = m_strFileVersion
    
    End Property
    Private Property Let FileVersion(ByVal vNewValue As String)
    
       m_strFileVersion = Trim$(vNewValue)
    
    End Property
    
    Friend Property Get InternalName() As String
    
       InternalName = m_strInternalName
    
    End Property
    Private Property Let InternalName(ByVal vNewValue As String)
    
       m_strInternalName = Trim$(vNewValue)
    
    End Property
    
    Friend Property Get Copyright() As String
    
       Copyright = m_strCopyright
    
    End Property
    Private Property Let Copyright(ByVal vNewValue As String)
    
       m_strCopyright = Trim$(vNewValue)
    
    End Property
    
    Friend Property Get OriginalFileName() As String
    
       OriginalFileName = m_strOriginalFileName
    
    End Property
    Private Property Let OriginalFileName(ByVal vNewValue As String)
    
       m_strOriginalFileName = Trim$(vNewValue)
    
    End Property
    
    Friend Property Get ProductName() As String
    
       ProductName = m_strProductName
    
    End Property
    Private Property Let ProductName(ByVal vNewValue As String)
    
       m_strProductName = Trim$(vNewValue)
    
    End Property
    
    Friend Property Get ProductVersion() As String
    
       ProductVersion = m_strProductVersion
    
    End Property
    Private Property Let ProductVersion(ByVal vNewValue As String)
    
       m_strProductVersion = Trim$(vNewValue)
    
    End Property
    
    Friend Property Get PrivateBuild() As String
    
       ProductVersion = m_strPrivateBuild
    
    End Property
    Private Property Let PrivateBuild(ByVal vNewValue As String)
    
       m_strPrivateBuild = Trim$(vNewValue)
    
    End Property
    
    Friend Property Get SpecialBuild() As String
    
       ProductVersion = m_strSpecialBuild
    
    End Property
    Private Property Let SpecialBuild(ByVal vNewValue As String)
    
       m_strSpecialBuild = Trim$(vNewValue)
    
    End Property
    
    Friend Property Get Comments() As String
    
       Comments = m_strComments
    
    End Property
    Private Property Let Comments(ByVal vNewValue As String)
    
       m_strComments = vNewValue
    
    End Property
    
    Friend Property Get LegalTrademark() As String
    
       LegalTrademark = m_strLegalTrademark
    
    End Property
    Private Property Let LegalTrademark(ByVal vNewValue As String)
    
       m_strLegalTrademark = vNewValue
    
    End Property
    

    These are my results for IE 8.
    Company name: Microsoft Corporation
    File description: Internet Explorer
    Product version: 8.00.6001.18702 (longhorn_ie8_rtm(wmbla).090308-0339)
    Internal name: iexplore
    Legal copyright: © Microsoft Corporation. All rights reserved.
    Original file name: IEXPLORE.EXE
    Product name: Windows® Internet Explorer
    Comments: Windows® Internet Explorer
    Trademarks: Windows® Internet Explorer
    File version: 8.00.6001.18702 (longhorn_ie8_rtm(wmbla).090308-0339)
    Private build:
    Special build: