如何判断IE的版本?

Surpass 2003-07-31 02:54:41
如何判断IE的版本?
如何判断是否安装了某一程序?版本多少?
...全文
1083 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Surpass 2003-08-06
  • 打赏
  • 举报
回复
解决了!
谢谢你卢培培。
Surpass 2003-08-05
  • 打赏
  • 举报
回复
谢谢各位的帮助。
如果注册表中的内容如下:

名称 类型 数据
(默认) REG_SZ 2.7.143.556

我该如何引用名称?
goodname008 2003-08-05
  • 打赏
  • 举报
回复
' 下面的是我的,放到标准模块中就能调用了。

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
goodname008 2003-08-05
  • 打赏
  • 举报
回复
lRegResult = RegQueryValueEx(keyhand, strValue, 0&, lValueType, ByVal 0&, lDataBufSize)
这行怎么回事?倒数第二个参数应该是个字符串缓冲区。

intZeroPos = InStr(strbuffer, Chr$(0)) 这行中的 strbuffer 也没声明。


Surpass 2003-08-05
  • 打赏
  • 举报
回复
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 Long

Const ERROR_SUCCESS = 0&
Const REG_SZ = 1
Const REG_DWORD = 4
Const REG_EXPAND_SZ = 2

Public Enum HKeyTypes
HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_USER = &H80000001
HKEY_LOCAL_MACHINE = &H80000002
HKEY_USERS = &H80000003
HKEY_PERFORMANCE_DATA = &H80000004
End Enum

Function 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

我用空字符串时却不返回值,为什么?
goodname008 2003-08-05
  • 打赏
  • 举报
回复
这好像是访问注册表的问题了,呵呵。
其实就是把名称部分传成“空串”就可以了。

RegQueryValueEx REG, "Version", 0, ByVal 0, ByVal Value, lValue
改成
RegQueryValueEx REG, "", 0, ByVal 0, ByVal Value, lValue
goodname008 2003-08-05
  • 打赏
  • 举报
回复
这好像是访问注册表的问题了,呵呵。
其实就是把名称部分传成“空串”就可以了。

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


hisofty 2003-08-05
  • 打赏
  • 举报
回复
查注册表似乎不太稳妥,因为可以修改注册表的值。

'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 NT

Private Type DllVersionInfo
cbSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformID As Long
End Type

Private 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 Long

Private Declare Function GetFileVersionInfoSize Lib "version.dll" _
Alias "GetFileVersionInfoSizeA" _
(ByVal lptstrFilename As String, _
lpdwHandle As Long) As Long

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 VerQueryValue Lib "version.dll" _
Alias "VerQueryValueA" _
(pBlock As Any, _
ByVal lpSubBlock As String, _
FI As Any, nVerSize As Long) As Long

Private 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 sSysPath

End Function



Private 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 Select

End 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
Surpass 2003-08-05
  • 打赏
  • 举报
回复
谢谢你卢培培,IE的版本我已经取出来了,我现在的问题是:

如果注册表中的内容如下:

名称 类型 数据
(默认) REG_SZ 6.0.5153.29

我该如何引用名称?
goodname008 2003-08-05
  • 打赏
  • 举报
回复
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 = &H80000002

Private 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
Surpass 2003-08-05
  • 打赏
  • 举报
回复
再帮一下忙就结贴了,谢谢大家。
suntt 2003-07-31
  • 打赏
  • 举报
回复
查找注册表

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
lxcc 2003-07-31
  • 打赏
  • 举报
回复
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version Vector
suntt 2003-07-31
  • 打赏
  • 举报
回复
查找注册表

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
Surpass 2003-07-31
  • 打赏
  • 举报
回复
到哪个键值下找呀
didishu0807 2003-07-31
  • 打赏
  • 举报
回复
查注册表信息
Alicky 2003-07-31
  • 打赏
  • 举报
回复
注册表
lwm1977 2003-07-31
  • 打赏
  • 举报
回复
用API读取注册表相关项
Surpass 2003-07-31
  • 打赏
  • 举报
回复
我要做一个安装程序,只能用vb6做。
判断IE的版本,判断是否安装了某一程序,版本多少。然后我才能决定安装哪些组件。
minghui000 2003-07-31
  • 打赏
  • 举报
回复
这小玩意用ASP可能更好
加载更多回复(1)

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧