VBA检测Oracle驱动程序版本32位vs 64位
我正在尝试获取Oracle驱动程序的名称,以便在无DSN ODBC连接字符串中使用,这样就不必在安装数据库的每台计算机上创建ODBC连接 我有下面的代码,它适合我(Windows 10 64位,Oracle驱动程序32位,12.2.0.1)。但是,对于另一个人来说,它不起作用,只是找不到她的驱动程序(Windows1064位,Oracle驱动程序64位,12.2.0.1) 在线报告说代码中的两个注册表项分别用于64位和32位(因此她的驱动程序应该在第一部分中找到)。我的驱动程序在代码的两个部分都有,她的驱动程序在两个部分都没有VBA检测Oracle驱动程序版本32位vs 64位,vba,oracle,ms-access,odbc,Vba,Oracle,Ms Access,Odbc,我正在尝试获取Oracle驱动程序的名称,以便在无DSN ODBC连接字符串中使用,这样就不必在安装数据库的每台计算机上创建ODBC连接 我有下面的代码,它适合我(Windows 10 64位,Oracle驱动程序32位,12.2.0.1)。但是,对于另一个人来说,它不起作用,只是找不到她的驱动程序(Windows1064位,Oracle驱动程序64位,12.2.0.1) 在线报告说代码中的两个注册表项分别用于64位和32位(因此她的驱动程序应该在第一部分中找到)。我的驱动程序在代码的两个部分都
Public Function GetOracleDriver()
Dim strComputer As String
Dim strValueName As String
Dim arrValueNames As Variant
Dim arrValueTypes As Variant
Dim i As Long
Dim R As Long
Dim strKeyPath As String
Dim strValue As String
Dim objReg As Object
Dim MyDriverName As String
Const HKEY_LOCAL_MACHINE = &H80000002
R = 1
strComputer = "."
Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"
objReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
For i = 0 To UBound(arrValueNames)
strValueName = arrValueNames(i)
objReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
If strValue = "Installed" And (arrValueNames(i) Like "*oracle*" And arrValueNames(i) <> "Microsoft ODBC for oracle") Then
GetOracleDriver = arrValueNames(i)
End If
R = R + 1
Next i
If IsNull(GetOracleDriver) Then
R = 1
strComputer = "."
Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\WOW6432NODE\ODBC\ODBCINST.INI\ODBC Drivers"
objReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
For i = 0 To UBound(arrValueNames)
strValueName = arrValueNames(i)
objReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
If strValue = "Installed" And (arrValueNames(i) Like "*oracle*" And arrValueNames(i) <> "Microsoft ODBC for oracle") Then
GetOracleDriver = arrValueNames(i)
End If
R = R + 1
Next i
End If
'Debug.Print GetOracleDriver
End Function
公共函数GetOracleDriver()
作为字符串的Dim STRC计算机
Dim strValueName作为字符串
将值名称作为变量
将类型作为变量
我想我会坚持多久
变暗,变长
作为字符串的Dim strKeyPath
作为字符串的Dim strValue
作为对象的Dim objReg
模糊MyDriverName作为字符串
Const HKEY_本地_机器=&H8000002
R=1
strComputer=“”
Set objReg=GetObject(“winmgmts:\\”&strComputer&“\root\default:StdRegProv”)
strKeyPath=“SOFTWARE\ODBC\ODBCINST.INI\ODBC驱动程序”
objReg.EnumValues HKEY_LOCAL_机器、strKeyPath、arrValueName、arrValueType
对于i=0到UBound(arrValueNames)
strValueName=arrValueNames(i)
objReg.GetStringValue HKEY_LOCAL_机器,strKeyPath,strValueName,strValue
如果strValue=“Installed”和(arrValueNames(i)如“*oracle*”和arrValueNames(i)”Microsoft ODBC for oracle),则
GetOracleDriver=arrValueNames(i)
如果结束
R=R+1
接下来我
如果为空(GetOracleDriver),则
R=1
strComputer=“”
Set objReg=GetObject(“winmgmts:\\”&strComputer&“\root\default:StdRegProv”)
strKeyPath=“SOFTWARE\WOW6432NODE\ODBC\ODBCINST.INI\ODBC驱动程序”
objReg.EnumValues HKEY_LOCAL_机器、strKeyPath、arrValueName、arrValueType
对于i=0到UBound(arrValueNames)
strValueName=arrValueNames(i)
objReg.GetStringValue HKEY_LOCAL_机器,strKeyPath,strValueName,strValue
如果strValue=“Installed”和(arrValueNames(i)如“*oracle*”和arrValueNames(i)”Microsoft ODBC for oracle),则
GetOracleDriver=arrValueNames(i)
如果结束
R=R+1
接下来我
如果结束
'Debug.Print GetOracleDriver
端函数
也许您的excel.exe和她的excel.exe是32位版本的excel.exe。
在这种情况下,Windows会自动将对注册表的访问重定向到Wow6432node。要关闭重定向,可以使用
因为我没有安装Oracle,所以我无法尝试我的代码,但是这个怎么样
Public Function GetOracleDriver()
Dim strComputer As String
Dim strValueName As String
Dim arrValueNames As Variant
Dim arrValueTypes As Variant
Dim i As Long
Dim R As Long
Dim strKeyPath As String
Dim strValue As String
Dim objReg As Object
Dim MyDriverName As String
Const HKEY_LOCAL_MACHINE = &H80000002
R = 1
strComputer = "."
'64bit
'The code derives from
'https://docs.microsoft.com/en-us/windows/win32/wmisdk/requesting-wmi-data-on-a-64-bit-platform
Const HKLM = &H80000002
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 64
objCtx.Add "__RequiredArchitecture", True
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer(strComputer, "root\default", "", "", , , , objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")
'Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
Set objReg = objStdRegProv
strKeyPath = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"
objReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
For i = 0 To UBound(arrValueNames)
strValueName = arrValueNames(i)
objReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
Debug.Print strKeyPath, strValueName, strValue
If strValue = "Installed" And (arrValueNames(i) Like "*oracle*" And arrValueNames(i) <> "Microsoft ODBC for oracle") Then
GetOracleDriver = arrValueNames(i)
End If
R = R + 1
Next i
End
'32bit
If IsNull(GetOracleDriver) Then
R = 1
strComputer = "."
Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\WOW6432NODE\ODBC\ODBCINST.INI\ODBC Drivers"
objReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
For i = 0 To UBound(arrValueNames)
strValueName = arrValueNames(i)
objReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
If strValue = "Installed" And (arrValueNames(i) Like "*oracle*" And arrValueNames(i) <> "Microsoft ODBC for oracle") Then
GetOracleDriver = arrValueNames(i)
End If
R = R + 1
Next i
End If
End Function
公共函数GetOracleDriver()
作为字符串的Dim STRC计算机
Dim strValueName作为字符串
将值名称作为变量
将类型作为变量
我想我会坚持多久
变暗,变长
作为字符串的Dim strKeyPath
作为字符串的Dim strValue
作为对象的Dim objReg
模糊MyDriverName作为字符串
Const HKEY_本地_机器=&H8000002
R=1
strComputer=“”
'64位
“代码源于
'https://docs.microsoft.com/en-us/windows/win32/wmisdk/requesting-wmi-data-on-a-64-bit-platform
常数HKLM=&H8000002
Set objCtx=CreateObject(“WbemScripting.SWbemNamedValueSet”)
objCtx.添加“\uuuu ProviderArchitecture”,64
添加“\uuuuRequiredArchitecture”,True
设置objLocator=CreateObject(“Wbemscripting.SWbemLocator”)
设置objServices=objLocator.ConnectServer(strComputer,“root\default”、“”、“”、objCtx)
设置objStdRegProv=objServices.Get(“StdRegProv”)
'Set objReg=GetObject(“winmgmts:\\”&strComputer&“\root\default:StdRegProv”)
设置objReg=objStdRegProv
strKeyPath=“SOFTWARE\ODBC\ODBCINST.INI\ODBC驱动程序”
objReg.EnumValues HKEY_LOCAL_机器、strKeyPath、arrValueName、arrValueType
对于i=0到UBound(arrValueNames)
strValueName=arrValueNames(i)
objReg.GetStringValue HKEY_LOCAL_机器,strKeyPath,strValueName,strValue
调试。打印strKeyPath、strValueName、strValue
如果strValue=“Installed”和(arrValueNames(i)如“*oracle*”和arrValueNames(i)”Microsoft ODBC for oracle),则
GetOracleDriver=arrValueNames(i)
如果结束
R=R+1
接下来我
终点
'32位
如果为空(GetOracleDriver),则
R=1
strComputer=“”
Set objReg=GetObject(“winmgmts:\\”&strComputer&“\root\default:StdRegProv”)
strKeyPath=“SOFTWARE\WOW6432NODE\ODBC\ODBCINST.INI\ODBC驱动程序”
objReg.EnumValues HKEY_LOCAL_机器、strKeyPath、arrValueName、arrValueType
对于i=0到UBound(arrValueNames)
strValueName=arrValueNames(i)
objReg.GetStringValue HKEY_LOCAL_机器,strKeyPath,strValueName,strValue
如果strValue=“Installed”和(arrValueNames(i)如“*oracle*”和arrValueNames(i)”Microsoft ODBC for oracle),则
GetOracleDriver=arrValueNames(i)
如果结束
R=R+1
接下来我
如果结束
端函数
谢谢!!我今天就试试。我是在ms access中进行此操作的,不是在ms excel中,但我假设这不会改变任何东西