如何判断IE的版本?
如何判断是否安装了某一程序?版本多少?

解决方案 »

  1.   

    我要做一个安装程序,只能用vb6做。
    判断IE的版本,判断是否安装了某一程序,版本多少。然后我才能决定安装哪些组件。
      

  2.   

    查找注册表HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\InstallInfo\Version 
    还有
    HKEY_LOCAL_MACHINE\Software\Microsoft\IE Setup\Setup\OldIEVersion
    主要用
    HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Version
      

  3.   

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version Vector
      

  4.   

    查找注册表HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\InstallInfo\Version 
    还有
    HKEY_LOCAL_MACHINE\Software\Microsoft\IE Setup\Setup\OldIEVersion
    主要用
    HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Version
      

  5.   

    谢谢各位的帮助。
    如果注册表中的内容如下:  名称       类型        数据
    (默认)    REG_SZ    2.7.143.556我该如何引用名称?
      

  6.   

    Option Explicit
    Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long         ' Note that if you declare the lpData parameter as String, you must pass it By Value.
    Private Const HKEY_LOCAL_MACHINE = &H80000002Private Sub Command1_Click()
        Dim REG As Long, Value As String, lValue As Long
        RegOpenKey HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Internet Explorer", REG
        Value = String(255, Chr(0))
        lValue = 256
        RegQueryValueEx REG, "Version", 0, ByVal 0, ByVal Value, lValue
        Value = Left(Value, InStr(Value, Chr(0)))
        MsgBox "IE版本号:  " & Value
    End Sub
      

  7.   

    谢谢你卢培培,IE的版本我已经取出来了,我现在的问题是:如果注册表中的内容如下:  名称       类型        数据
    (默认)    REG_SZ    6.0.5153.29我该如何引用名称?
      

  8.   

    查注册表似乎不太稳妥,因为可以修改注册表的值。'Example Name: Obtaining Internet Explorer's Version'------------------------------------------------------------------------------
    '
    ' Form Code
    '
    '------------------------------------------------------------------------------Option Explicit'Identifies the platform for which the DLL was built.
    Private Const DLLVER_PLATFORM_WINDOWS As Long = &H1  'Windows 95
    Private Const DLLVER_PLATFORM_NT As Long = &H2       'Windows NTPrivate Type DllVersionInfo
       cbSize As Long
       dwMajorVersion As Long
       dwMinorVersion As Long
       dwBuildNumber As Long
       dwPlatformID As Long
    End TypePrivate Type VS_FIXEDFILEINFO
       dwSignature As Long
       dwStrucVersion As Long
       dwFileVersionMS As Long
       dwFileVersionLS As Long
       dwProductVersionMS As Long
       dwProductVersionLS As Long
       dwFileFlagsMask As Long
       dwFileFlags As Long
       dwFileOS As Long
       dwFileType As Long
       dwFileSubtype As Long
       dwFileDateMS As Long
       dwFileDateLS As Long
    End Type
    Private Declare Function DllGetVersion Lib "shlwapi" _
      (dwVersion As DllVersionInfo) As Long
      
    Private Declare Function GetSystemDirectory Lib "kernel32" _
       Alias "GetSystemDirectoryA" _
      (ByVal lpBuffer As String, _
       ByVal nSize As Long) As LongPrivate Declare Function GetFileVersionInfoSize Lib "version.dll" _
       Alias "GetFileVersionInfoSizeA" _
      (ByVal lptstrFilename As String, _
       lpdwHandle As Long) As LongPrivate 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 VerQueryValue Lib "version.dll" _
       Alias "VerQueryValueA" _
      (pBlock As Any, _
       ByVal lpSubBlock As String, _
       FI As Any, nVerSize As Long) As LongPrivate Declare Sub CopyMemory Lib "kernel32" _
       Alias "RtlMoveMemory" _
      (Destination As Any, _
       Source As Any, _
       ByVal Length As Long)
       
    Private Declare Function lstrcpyA Lib "kernel32" _
      (ByVal RetVal As String, ByVal Ptr As Long) As Long
                            
    Private Declare Function lstrlenA Lib "kernel32" _
      (ByVal Ptr As Any) As Long
      Private Sub Command1_Click()   Dim DVI As DllVersionInfo
       Call GetIEVersion(DVI)
       
       Frame1.Caption = GetIEVersionString()
       Label2(0).Caption = DVI.dwMajorVersion
       Label2(1).Caption = DVI.dwMinorVersion
       Label2(2).Caption = DVI.dwBuildNumber
       Label2(3).Caption = DVI.dwPlatformID
       Label2(4).Caption = GetDLLPlatformName(DVI.dwPlatformID)
       Label2(5).Caption = GetIECypherVersion()
       
    End Sub
      
      
    Private Function GetIECypherVersion() As String   Dim FI As VS_FIXEDFILEINFO
       Dim sBuffer() As Byte
       Dim nBufferSize As Long
       Dim lpBuffer As Long
       Dim nVerSize As Long
       Dim nUnused As Long
       Dim tmpVer As String
       Dim sBlock As String
       Dim sDLLFile As String
       Dim sSysPath As String
       
       sSysPath = GetSystemDir()   If sSysPath > "" Then     'set file that has the encryption level
         'info and call to get required size
          sDLLFile = sSysPath & "\schannel.dll"
          nBufferSize = GetFileVersionInfoSize(sDLLFile, nUnused)
          
          ReDim sBuffer(nBufferSize)
          
          If nBufferSize > 0 Then
          
            'get the version info
             Call GetFileVersionInfo(sDLLFile, 0&, nBufferSize, sBuffer(0))
             Call VerQueryValue(sBuffer(0), "\", lpBuffer, nVerSize)
             Call CopyMemory(FI, ByVal lpBuffer, Len(FI))
       
             If VerQueryValue(sBuffer(0), "\VarFileInfo\Translation", lpBuffer, nVerSize) Then
                
                If nVerSize Then
                   tmpVer = GetPointerToString(lpBuffer, nVerSize)
                   tmpVer = Right("0" & Hex(Asc(Mid(tmpVer, 2, 1))), 2) & _
                            Right("0" & Hex(Asc(Mid(tmpVer, 1, 1))), 2) & _
                            Right("0" & Hex(Asc(Mid(tmpVer, 4, 1))), 2) & _
                            Right("0" & Hex(Asc(Mid(tmpVer, 3, 1))), 2)
                   sBlock = "\StringFileInfo\" & tmpVer & "\FileDescription"
                   
                  'Get predefined version resources
                   If VerQueryValue(sBuffer(0), sBlock, lpBuffer, nVerSize) Then
                   
                      If nVerSize Then
                      
                        'get the file description string
                         tmpVer = GetStrFromPtrA(lpBuffer)
                         
                        'File versions for 40 and 128-bit releases can
                        'be the same, so we have to do a string search
                        'to determine the encryption level. If the file
                        'description contains the line:
                        'PCT/SSL Security Provider (Export Version), its 40-bit.
                        'If it contains the line:
                        'PCT/SSL Security Provider (US and Canada Use Only), its 128-bit.
                        
                         Select Case InStr(1, tmpVer, "(US and Canada Use Only)", vbTextCompare)
                            Case 0:    GetIECypherVersion = "40-bit normal encryption"
                            Case Else: GetIECypherVersion = "128-bit strong encryption"
                         End Select
                         
                      End If  'If nVerSize
                   End If  'If VerQueryValue
                End If  'If nVerSize
             End If  'If VerQueryValue
          
          Else
          
             GetIECypherVersion = "schannel.dll is not in the system folder."
          
          End If  'If nBufferSize
       End If  'If sSysPathEnd FunctionPrivate Function GetPointerToString(lpString As Long, nBytes As Long) As String   Dim Buffer As String
       
       If nBytes Then
          Buffer = Space(nBytes)
          CopyMemory ByVal Buffer, ByVal lpString, nBytes
          GetPointerToString = Buffer
       End If
       
    End Function
    Private Function GetStrFromPtrA(ByVal lpszA As Long) As String   GetStrFromPtrA = String$(lstrlenA(ByVal lpszA), 0)
       Call lstrcpyA(ByVal GetStrFromPtrA, ByVal lpszA)
       
    End Function
    Private Function GetSystemDir() As String    Dim nSize As Long
        Dim tmp As String
        
        tmp = Space$(256)
        nSize = Len(tmp)
        Call GetSystemDirectory(tmp, nSize)
        
        GetSystemDir = TrimNull(tmp)
        
    End Function
    Private Function TrimNull(item As String)    Dim pos As Integer
       
       'double check that there is a chr$(0) in the string
        pos = InStr(item, Chr$(0))
        If pos Then
              TrimNull = Left$(item, pos - 1)
        Else: TrimNull = item
        End If
      
    End Function
    Private Function GetIEVersion(DVI As DllVersionInfo) As Long
       
       DVI.cbSize = Len(DVI)
       Call DllGetVersion(DVI)
       GetIEVersion = DVI.dwMajorVersion
       
    End Function
    Private Function GetDLLPlatformName(dwPlatform As Long) As String
       
       Select Case dwPlatform
       Case DLLVER_PLATFORM_WINDOWS: GetDLLPlatformName = "DLL built for Windows 95"
       Case DLLVER_PLATFORM_NT:      GetDLLPlatformName = "DLL built for Windows NT"
       End SelectEnd Function
    Private Function GetIEVersionString() As String
       
       Dim DVI As DllVersionInfo
       
       DVI.cbSize = Len(DVI)
       Call DllGetVersion(DVI)   GetIEVersionString = "Internet Explorer " & DVI.dwMajorVersion & "." & _
                            DVI.dwMinorVersion & "." & _
                            DVI.dwBuildNumber
       
    End Function
      

  9.   

    这好像是访问注册表的问题了,呵呵。
    其实就是把名称部分传成“空串”就可以了。

    RegQueryValueEx REG, "Version", 0, ByVal 0, ByVal Value, lValue
    改成
    RegQueryValueEx REG, "", 0, ByVal 0, ByVal Value, lValue
      

  10.   

    这好像是访问注册表的问题了,呵呵。
    其实就是把名称部分传成“空串”就可以了。

    RegQueryValueEx REG, "Version", 0, ByVal 0, ByVal Value, lValue
    改成
    RegQueryValueEx REG, "", 0, ByVal 0, ByVal Value, lValue
      

  11.   

    to 卢培培:
       谢谢你!!
    以下是我读注册表模块中的代码:
    Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal Hkey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal Hkey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
    Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal Hkey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As LongConst ERROR_SUCCESS = 0&
    Const REG_SZ = 1
    Const REG_DWORD = 4
    Const REG_EXPAND_SZ = 2Public Enum HKeyTypes
        HKEY_CLASSES_ROOT = &H80000000
        HKEY_CURRENT_USER = &H80000001
        HKEY_LOCAL_MACHINE = &H80000002
        HKEY_USERS = &H80000003
        HKEY_PERFORMANCE_DATA = &H80000004
    End EnumFunction GetString(Hkey As HKeyTypes, strPath As String, strValue As String)
         
        Dim keyhand As Long
        Dim datatype As Long
        Dim lRegResult As Long
        Dim strBuf As String
        Dim lDataBufSize As Long
        Dim intZeroPos As Integer
        
        Dim lValueType As Long
        
      lRegResult = RegOpenKey(Hkey, strPath, keyhand)
      lRegResult = RegQueryValueEx(keyhand, strValue, 0&, lValueType, ByVal 0&, lDataBufSize)
      intZeroPos = InStr(strbuffer, Chr$(0))    If lValueType = REG_SZ Or REG_EXPAND_SZ Then
            strBuf = String(lDataBufSize, " ")
            lResult = RegQueryValueEx(keyhand, strValue, 0&, 0&, ByVal strBuf, lDataBufSize)
            If lResult = ERROR_SUCCESS Then
                intZeroPos = InStr(strBuf, Chr$(0))
                If intZeroPos > 0 Then
                    GetString = Left$(strBuf, intZeroPos - 1)
                Else
                    GetString = strBuf
                End If
            End If
        End If
    End Function我用空字符串时却不返回值,为什么?
      

  12.   

    lRegResult = RegQueryValueEx(keyhand, strValue, 0&, lValueType, ByVal 0&, lDataBufSize)
    这行怎么回事?倒数第二个参数应该是个字符串缓冲区。intZeroPos = InStr(strbuffer, Chr$(0)) 这行中的 strbuffer 也没声明。
      

  13.   

    ' 下面的是我的,放到标准模块中就能调用了。Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
    Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long' 注册表数据类型...
    Const REG_SZ = 1                         ' 字符串值
    Const REG_EXPAND_SZ = 2                  ' 可扩充字符串值
    Const REG_BINARY = 3                     ' 二进制值
    Const REG_DWORD = 4                      ' DWORD值
    Const REG_MULTI_SZ = 7                   ' 多字符串值' 注册表关键字根类型...
    Const HKEY_CLASSES_ROOT = &H80000000
    Const HKEY_CURRENT_USER = &H80000001
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const HKEY_USERS = &H80000003
    Const HKEY_PERFORMANCE_DATA = &H80000004
    Const HKEY_CURRENT_CONFIG = &H80000005
    Const HKEY_DYN_DATA = &H80000006'---------------------------------------------------------------
    '- 获得已存在的注册表关键字的值...
    '- 如果 ValueName="" 则返回 KeyName 项的默认值...
    '- 如果指定的注册表关键字不存在, 则返回空串...
    '---------------------------------------------------------------
    Public Function GetKeyValue(KeyRoot As Long, KeyName As String, ValueName As String, Optional ValueType As Long) As String
        Dim i As Long                                       ' 循环变量
        Dim REG As Long                                     ' 注册表打开项的句柄
        Dim TempValue As String                             ' 注册表关键字的临时值
        Dim Value As String                                 ' 注册表关键字的值
        Dim ValueSize As Long                               ' 注册表关键字的值的实际长度
        TempValue = Space(1024)                             ' 存储注册表关键字的临时值的缓冲区
        ValueSize = 1024                                    ' 设置注册表关键字的值的默认长度
        
        '------------------------------------------------------------
        '- 打开一个已存在的注册表关键字...
        '------------------------------------------------------------
        RegOpenKeyEx KeyRoot, KeyName, 0, KEY_ALL_ACCESS, REG
        
        '------------------------------------------------------------
        '- 获得已打开的注册表关键字的值...
        '------------------------------------------------------------
        RegQueryValueEx REG, ValueName, 0, ValueType, ByVal TempValue, ValueSize
        
        '------------------------------------------------------------
        '- 返回注册表关键字的的值...
        '------------------------------------------------------------
        Select Case ValueType                                                        ' 通过判断关键字的类型, 进行处理
            Case REG_SZ, REG_MULTI_SZ, REG_EXPAND_SZ
                TempValue = Left$(TempValue, ValueSize - 1)                          ' 去掉TempValue尾部空格
                Value = TempValue
            Case REG_DWORD
                ReDim dValue(3) As Byte
                RegQueryValueEx REG, ValueName, 0, REG_DWORD, dValue(0), ValueSize
                For i = 3 To 0 Step -1
                    Value = Value + String(2 - Len(Hex(dValue(i))), "0") + Hex(dValue(i))   ' 生成长度为8的十六进制字符串
                Next i
                Value = Format("&h" + Value)                                         ' 将十六进制的 Value 转换为十进制
            Case REG_BINARY
                If ValueSize > 0 Then
                    ReDim bValue(ValueSize - 1) As Byte                                  ' 存储 REG_BINARY 值的临时数组
                    RegQueryValueEx REG, ValueName, 0, REG_BINARY, bValue(0), ValueSize
                    For i = 0 To ValueSize - 1
                        Value = Value + String(2 - Len(Hex(bValue(i))), "0") + Hex(bValue(i)) + " "  ' 将数组转换成字符串
                    Next i
                End If
        End Select
        
        '------------------------------------------------------------
        '- 关闭注册表关键字...
        '------------------------------------------------------------
        RegCloseKey REG
        
        GetKeyValue = Trim(Value)                                                    ' 返回函数值
    End Function