jac*_*sha 3 vb.net registry vb.net-2010
我使用以下代码
发生此错误:
尝试读取或写入受保护的内存.这通常表明其他内存已损坏.尝试读取或写入受保护的内存.这通常表明其他内存已损坏.
Public Class FormRegEnumValue
Private Const ERROR_SUCCESS = 0&
Private Const ERROR_NO_MORE_ITEMS = 259&
Private Const HKEY_CURRENT_USER = &H80000001
Private Const REG_BINARY = 3
Private Const REG_DWORD = 4
Private Const REG_EXPAND_SZ = 2
Private Const REG_SZ = 1
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, ByVal lpcbValueName As Long, ByVal lpReserved As Long, ByVal lpType As Long, ByVal lpData As Object, ByVal lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal phkResult As Long) As Long
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hKey As Long, num As Long, strName As String
Dim strData As String, Retval As Long, RetvalData As Long
Const Buffer As Long = 255
num = 0
strName = Space(Buffer)
strData = Space(Buffer)
Retval = Buffer
RetvalData = Buffer
If RegOpenKey(HKEY_CURRENT_USER, "Control Panel\Desktop", hKey) = 0 Then 'error
While RegEnumValue(hKey, num, strName, Retval, 0, 0&, strData, RetvalData) <> ERROR_NO_MORE_ITEMS
If RetvalData > 0 Then
ListBox1.Items.Add(strName + Retval + " = " + strData + RetvalData - 1)
End If
num = num + 1
strName = Space(Buffer)
strData = Space(Buffer)
Retval = Buffer
RetvalData = Buffer
End While
RegCloseKey(hKey)
Else
ListBox1.Items.Add("Error")
End If
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
请告诉我正确的方法
这通常是由不正确的Private Declare Function
陈述引起的.Windows API中列出的类型与VB或C#代码中使用的类型不同.这是Windows API和.Net:Win32 API C++到.NET之间的数据类型转换的绝佳列表
该PInvoke的网站往往具有列出的正确VB代码.
对于RegEnumValue,修复数据类型,并且lpcValueName
是ByRef,而不是ByVal:
Declare Auto Function RegEnumValue Lib "Advapi32" ( _
ByVal hKey As IntPtr, _
ByVal dwIndex As Integer, _
ByVal lpValueName As StringBuilder, _
ByRef lpcValueName As Integer, _
ByVal lpReserved As IntPtr, _
ByVal lpType As IntPtr, _
ByVal lpData As IntPtr, _
ByVal lpcbData As IntPtr _
) As Integer
Run Code Online (Sandbox Code Playgroud)
对于RegCloseKey,只需修复数据类型:
Declare Function RegCloseKey Lib "advapi32.dll" ( _
ByVal hKey As UIntPtr _
) As Integer
Run Code Online (Sandbox Code Playgroud)
对于RegOpenKey,修复数据类型并将phkResult更改为ByRef:
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
ByVal hKey As Integer, _
ByVal lpSubKey As String, _
ByRef phkResult As IntPtr _
) As Integer
Run Code Online (Sandbox Code Playgroud)
所以你的功能看起来应该更像这样.不幸的是,我不确定要写什么strData
或者RetvalData
.我添加了一个Try/Finally
块,RegCloseKey
即使发生错误也会确保被调用.你想确保你总是关闭事物,特别是如果出现问题.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Const Buffer As Long = 255
Dim hKey As IntPtr = IntPtr.Zero
Dim num As Integer = 0
Dim strName As New StringBuilder
Dim strData As IntPtr = ' I'm not surte what goes here.
Dim Retval As Integer = Buffer
Dim RetvalData As IntPtr = ' I'm not surte what goes here.
If RegOpenKey(HKEY_CURRENT_USER, "Control Panel\Desktop", hKey) = 0 Then 'error
Try
While RegEnumValue(hKey, num, strName, Retval, IntPtr.Zero, IntPtr.Zero, strData, RetvalData) <> ERROR_NO_MORE_ITEMS
If RetvalData > 0 Then
ListBox1.Items.Add(strName.ToString + Retval + " = " + strData + RetvalData - 1)
End If
num = num + 1
strName = New StringBuilder(Buffer)
strData = ' I'm not sure what goes here.
Retval = Buffer
RetvalData = ' I'm not surte what goes here.
End While
Finally
RegCloseKey(hKey)
End Try
Else
ListBox1.Items.Add("Error")
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16412 次 |
最近记录: |