Я пытаюсь заставить VBA запросить реестр, чтобы увидеть, установлен ли драйвер ODBC, и я получаю ошибку 2 при попытке прочитать значение ключа. Я попробовал более простой ключ / значение, но без сигары.
Редактировать для уточнения
Я занимаюсь разработкой 32-битной системы, но она должна работать как для 32-битных, так и для 64-битных систем. Проблема в том, что вызов RegOpenKeyEx работает, но RegQueryValueEx возвращает ошибку 2: файл не существует в моей 32-разрядной системе. Мой синтаксис выглядит правильно, что я делаю не так?
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const ERROR_SUCCESS = 0& ' Successful
Public Const ERROR_FILE_NOT_FOUND = 2& ' Registry path does not exist
Public Const ERROR_ACCESS_DENIED = 5& ' Requested permissions not available
Public Const STANDARD_RIGHTS_READ = &H20000
Public Const SYNCHRONIZE = &H100000
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE _
Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) _
And (Not SYNCHRONIZE))
Public Const REG_SZ = 1 ' Unicode nul terminated string
Public 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
Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
(ByVal hKey As Long, lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, _
lpData As Any, lpcbData As Long) As Long
Public Declare Function RegCloseKey Lib "advapi32.dll" _
(ByVal hKey As Long) As Long
Sub TestRegAPI()
Dim KeyName As String, handle As Long, handle2 As String
'KeyName = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"
KeyName = "SOFTWARE\7-Zip"
r = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KeyName, 0, KEY_READ, handle)
If r Then
MsgBox "Unable to open the specified Registry key, code " & r
Else
'r = RegQueryValueEx(handle, "MySQL ODBC 5.1 Driver", 0, 1&, handle2, length)
r = RegQueryValueEx(handle, "Path", 0, REG_SZ, handle2, length)
RegCloseKey handle
End If
End Sub