访问冲突异常RegEnumValue

时间:2014-10-14 09:59:48

标签: vb.net winapi pinvoke

我正在使用此代码枚举注册表项中的所有值。

    Private ReadOnly HKeyLocalMachine As New IntPtr(-2147483646)
    Private Const KeyQueryValueWow64Key As Integer = &H101
    Private Const ErrorNoMoreItems As Integer = &H103
    Private Const errorSuccess As Integer = &H0

                Dim keyHandle As IntPtr = Nothing
                RegOpenKeyEx(HKeyLocalMachine, newPath, 0, KeyQueryValueWow64Key, keyHandle)

                If keyHandle = Nothing Then
                    Return "Error accessing registry key"
                End If

                Dim index As Integer = 0
                Dim valueName As New StringBuilder(1000)
                Dim valueLenght As UInteger
                Dim valueDataLenght As IntPtr

                If RegQueryInfoKey(keyHandle, Nothing, Nothing, Nothing, Nothing, Nothing,       Nothing, Nothing, valueLenght, valueDataLenght, Nothing, Nothing) = errorSuccess Then
                  Debug.WriteLine("SUCCESS IN REGQUERYINFOKEY")
                End If

                    Do
                        returnValue = RegEnumValue(keyHandle, index, valueName, valueLenght, Nothing, Nothing, datalenght, valueDataLenght)

                   If returnValue = errorSuccess Then
                            Debug.WriteLine("Success")
                        End If

                    index = index + 1
                Loop Until returnValue = ErrorNoMoreItems

以下是我的API声明:

 <DllImport("advapi32.dll", CharSet:=CharSet.Unicode)> _
    Private Shared Function RegOpenKeyEx( _
    hKey As IntPtr, _
    subKey As String, _
    ulOptions As Integer, _
    samDesired As Integer, _
    ByRef hkResult As IntPtr _
    ) As Integer
    End Function


    <DllImport("advapi32.dll", SetLastError:=True)> _
Private Shared Function RegEnumValue( _
   ByVal hKey As IntPtr, _
   ByVal dwIndex As Integer, _
   ByVal lpValueName As StringBuilder, _
   ByRef lpcValueName As UInteger, _
   ByVal lpReserved As IntPtr, _
   ByVal lpType As IntPtr, _
   ByVal lpData As IntPtr, _
   ByVal lpcbData As IntPtr _
) As Integer
End Function

<DllImport("advapi32.dll")> _
Private Shared Function RegQueryInfoKey( _
hkey As IntPtr, _
ByRef lpClass As StringBuilder, _
ByRef lpcbClass As UInteger, _
lpReserved As IntPtr, _
ByRef lpcSubKeys As UInteger, _
ByRef lpcbMaxSubKeyLen As UInteger, _
ByRef lpcbMaxClassLen As UInteger, _
ByRef lpcValues As UInteger, _
ByRef lpcbMaxValueNameLen As UInteger, _
ByRef lpcbMaxValueLen As IntPtr, _
ByRef lpcbSecurityDescriptor As UInteger, _
lpftLastWriteTime As IntPtr _
) As Integer
End Function

当我传递RegEnumValue的最后一个参数非空时,我得到了AccessViolationException,如果我传递一个null IntPtr函数成功但没有检索到数据,只有名称。 我试过没有运气改变API变量,其他两个函数总是成功。

1 个答案:

答案 0 :(得分:0)

代码失败的原因是您没有初始化valueDataLenght。顺便说一下,您的意思是将此变量命名为valueDataLength

您需要IntPtr变量valueDataLength来引用包含数据缓冲区长度的DWORD。在这里使用IntPtr会让您的生活变得困难。我将这样的参数声明为:

ByRef lpcbData As Integer