Tentative de lecture ou d'écriture de mémoire protégée. C'est souvent une indication que l'autre mémoire est corrompue
Je suis en utilisant le code suivant
Cette erreur se produit :
Tentative de lecture ou d'écriture de mémoire protégée. C'est souvent une indication que l'autre mémoire est corrompue.
Tentative de lecture ou d'écriture de mémoire protégée. C'est souvent une indication que d'autres mémoire est endommagée.
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
Veuillez me montrer le droit chemin
OriginalL'auteur jack rasha | 2011-11-24
Vous devez vous connecter pour publier un commentaire.
Ce problème est généralement causé par une mauvaise
Private Declare Function
déclaration. Les types énumérés dans l'API Windows sont différents de ceux utilisés dans VB ou C# code. C'est une grande liste des conversions de types de données entre l'API Windows et .Net: Win32 API C++.NETLa PInvoke site a souvent le bon code VB répertoriés.
Pour RegEnumValue, fixer les types de données, et
lpcValueName
est un ByRef, pas un ByVal:Pour RegCloseKey, juste corriger les types de données:
Pour RegOpenKey, fixer les types de données et de changer phkResult à un ByRef:
De sorte que votre fonction doit ressembler à ceci. Malheureusement, je ne sais pas quoi écrire pour
strData
ouRetvalData
. J'ai ajouté dans unTry/Finally
bloc qui est sûr de faireRegCloseKey
, même si une erreur se produit. Vous souhaitez assurez-vous de toujours fermer les choses, surtout si quelque chose va mal.Ajout d'utilisation pour répondre.
Upvote pour les bons liens.
OriginalL'auteur Hand-E-Food
Utiliser les fonctionnalités contenues dans le haut-Microsoft.Win32.Registre de noms à la place.
Vous pouvez trouver la référence et de nombreux exemples MSDN.
Mise à jour
Si vous avez besoin d'utiliser l'API, puis la signature de RegEnumValue doit être changé pour quelque chose comme:
Ensuite, modifiez le type de strData à StringBuilder et de créer une nouvelle instance de la classe StringBuilder où vous êtes actuellement remplissage strData avec des espaces:
Il faudra peut-être d'autres changements apportés ainsi, mais c'est le big one pour l'instant.
Mise à jour 2
L'autre déclaration doivent avoir leur Longue valeurs changé en Entier et le paramètre de résultat pour RegOpenKey est ByRef:
Mise à jour 3
Après avoir examiné mon ancien code de l'API, j'ai découvert que vous avez besoin de faire un peu de travail supplémentaire, afin de traiter les résultats:
Une fois que vous avez déterminé que RegEnumValue a été un succès (valeur de retour de 0), vous devez traiter les résultats sur la base des 3 paramètre à partir de la fin (lpType), qui vous indiquera le type de données.
Puis, en se basant sur le type (c'est à dire REG_SZ, REG_DWORD, etc), vous aurez besoin de faire un appel à l'une des RegQueryValueExA méthodes de l'API:
etc. pour récupérer la valeur dans le registre d'entrée.
rasha: mise à Jour de la réponse avec une signature correcte pour RegEnumValueA et plus d'informations.
erreur : Si RegOpenKey(HKEY_CURRENT_USER, "Control Panel\Desktop", hKey) = 0 Alors erreur"
Ajouté les définitions mises à jour pour d'autres fonctions de réponse.
Ajouté quelques détails supplémentaires sur le travail que vous devez faire afin de traiter les résultats.
OriginalL'auteur competent_tech