VBA检测Oracle驱动程序版本32位vs 64位

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位(因此她的驱动程序应该在第一部分中找到)。我的驱动程序在代码的两个部分都

我正在尝试获取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中,但我假设这不会改变任何东西