Winapi 不断获取VBA中RegQueryValueEx的错误2(注册表路径不存在)

Winapi 不断获取VBA中RegQueryValueEx的错误2(注册表路径不存在),winapi,ms-access,vba,registry,ms-access-2010,Winapi,Ms Access,Vba,Registry,Ms Access 2010,我试图让VBA查询注册表以查看是否安装了ODBC驱动程序,在尝试读取某个键的值时出现错误2。我尝试了一个更简单的键/值,但没有雪茄 编辑以澄清 我正在开发一个32位系统,但这需要同时适用于32位和64位系统。问题是对RegOpenKeyEx的调用有效,但RegQueryValueEx返回错误2:我的32位系统上不存在文件。我的语法似乎正确,我做错了什么 Public Const HKEY\U LOCAL\U MACHINE=&H80000002 Public Const ERROR_SUCCES

我试图让VBA查询注册表以查看是否安装了ODBC驱动程序,在尝试读取某个键的值时出现错误2。我尝试了一个更简单的键/值,但没有雪茄

编辑以澄清 我正在开发一个32位系统,但这需要同时适用于32位和64位系统。问题是对RegOpenKeyEx的调用有效,但RegQueryValueEx返回错误2:我的32位系统上不存在文件。我的语法似乎正确,我做错了什么

Public Const HKEY\U LOCAL\U MACHINE=&H80000002
Public Const ERROR_SUCCESS=0和'Successful
Public Const ERROR\u FILE\u NOT\u FOUND=2&'注册表路径不存在
Public Const ERROR\u ACCESS\u DENIED=5&“请求的权限不可用”
公共建筑标准权利阅读=&H20000
公共常量同步=&H100000
Public Const KEY_ENUMERATE_SUB_KEY=&H8
Public Const KEY_NOTIFY=&H10
Public Const KEY\u QUERY\u VALUE=&H1
Public Const KEY\u READ=((标准权限\u READ或KEY\u QUERY\u值_
或键(枚举子键或键通知)_
和(不同步))
Public Const REG_SZ=1'Unicode nul终止字符串
公共声明函数RegOpenKeyEx Lib“advapi32.dll”别名“RegOpenKeyExA”_
(ByVal hKey为长,ByVal lpSubKey为字符串,ByVal ulOptions为_
Long,ByVal samDesired As Long,phkResult As Long)一样长
公共声明函数RegQueryValueEx Lib“advapi32.dll”别名“RegQueryValueExA”_
(ByVal hKey为长,lpValueName为字符串_
ByVal lpReserved为Long,lpType为Long_
lpData尽可能长,lpcbData尽可能长)
公共声明函数RegCloseKey Lib“advapi32.dll”_
(ByVal hKey,只要)只要
子TestRegAPI()
Dim KeyName为字符串,handle为长,handle2为字符串
'KeyName=“SOFTWARE\ODBC\ODBCINST.INI\ODBC驱动程序”
KeyName=“软件\7-Zip”
r=RegOpenKeyEx(HKEY_本地_机器,密钥名,0,密钥读取,句柄)
如果r那么
MsgBox“无法打开指定的注册表项,代码”&r
其他的
'r=RegQueryValueX(句柄,“MySQL ODBC 5.1驱动程序”,0,1&,句柄2,长度)
r=RegQueryValueEx(句柄,“路径”,0,寄存器SZ,句柄2,长度)
RegCloseKey句柄
如果结束
端接头

这适用于我在64位机器上的工作。它是从


从Wikipedia上可以找到,Windows NT4将WMI作为可下载的附加组件,从Windows 2000上,它是Windows的捆绑组件。这里我的示例是加载到Mozilla Thunderbird的安装路径:

Const HKEY_LOCAL_MACHINE = &H80000002

Set objRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv")

strKey_Path = "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\thunderbird.exe"

 ' here the value name is blank, because I want the default value for the key, otherwise it wouldn't be ""
strValue_Name = ""



objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKey_Path, strValue_Name, strThunderbird_Path

我不熟悉VB。反斜杠是否需要在VB字符串文本中转义?是否在64位计算机上运行?--@实际上,shf301很有趣。我在x86机器上开发,让VBA创建并使用WScript.Shell对象来查询注册表。这在x64机器上不起作用,所以我在这里查找了Windows API。WMI是一个生命和理智的保护程序!谢谢你,雷穆!等等,等等。。。它并没有抓住每一个价值。我喜欢它的发展方向;我从中得到了一些很好的测试结果。让我看看我是否能让它为我所需要的工作。。。
Const HKEY_LOCAL_MACHINE = &H80000002

Set objRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv")

strKey_Path = "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\thunderbird.exe"

 ' here the value name is blank, because I want the default value for the key, otherwise it wouldn't be ""
strValue_Name = ""



objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKey_Path, strValue_Name, strThunderbird_Path