Manejo basico del registro

Estado
Cerrado para nuevas respuestas

mek

Nuevo Miembro
Miembro
#1
Manejo basico del registro

Como muchas veces se preguntan como leer/borrar/crear valores del registro voy a explicar lo basico con pequeños ejemplos para que se entienda mejor.Antes de escribir/leer cualquier dato se tiene que conseguir un manejador (handle), RegOpenKey nos da este manejador.

LONG RegOpenKey(

HKEY hKey,  

LPCTSTR lpSubKey,  

PHKEY phkResult );

hKey: identifica que sección queremos abrir, estos valores son:

HKEY_CLASSES_ROOT

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USERS

lpSubKey: sub clave. es decir si queremos abrir HKEY_LOCAL_MACHINE/SOFTWARE/prueba, lpSubKey seria SOFTWARE/Prueba.

phkResult: aquí se nos da el manejador para hacer referencia siempre a la clave abierta, hasta que la cerremos.

si la clave no existe se tiene que crear (como es logico jeje) con RegCreateKey, los parametros son igual que en la funcion anterior. un ejemplo podría ser esto:

Insertar CODE, HTML o PHP:
Function crear() As Long

'si existe devuleve 1 de lo contrario 0

RegOpenKey HKEY_LOCAL_MACHINE, prueba, h

If h Then

crear = 1

Else

RegCreateKey HKEY_LOCAL_MACHINE, prueba, h

crear = 0

End If

End Function
como ya dice el comentario si existe devuleve 1 si no existe devuelve 0, que en este caso da lo mismo porque si no existe la crea y si existe la abre, no se toma el valor de la funcion para si existe hacer una cosa u otra pero bueno creo que se entiende. HKEY_LOCAL_MACHINE es una constante y prueba otra para hacer los ejemplos mas sencillos. en h tendremos el manejador.

Public Const HKEY_LOCAL_MACHINE = &H80000002

Public Const prueba = "SOFTWAREPruebas" 'esta es la clave sobre la que se escribira etc

Escribir un valor alfanumerico con RegSetValueEx:

LONG RegSetValueEx(

HKEY hKey,  

LPCTSTR lpValueName,  

DWORD Reserved,  

DWORD dwType,  

CONST BYTE *lpData,  

DWORD cbData );

hKey: sera el manejador, en este caso el que tenemos en h

lpValueName: es el nombre del valor

Reserved: a 0

dwType: tipo de dato que se escribe/lee, para ver los diferentes tipos de datos darle un ojo a la ayuda.

lpData: los datos que queremos escribir.

cbData: el tamaño de los datos

una vez claros los parametros el ejemplo quedaria de esta forma:

Insertar CODE, HTML o PHP:
Function valorS(nombre As String, valor As String) As Long

valorS = RegSetValueEx(h, nombre, 0, REG_SZ, ByVal valor, Len(valor))

End Function
nombre sera el nombre que contendra el valor, es decir si tenemos abierto HKEY_LOCAL_MACHINE/SOFTWARE/prueba y queremos escribir el valor "saludo" y que este contenga "hola", llamaremos a la funcion de esta forma. valorS("saludo","hola"). si la funcion devuleve 0 es que no hay ningún error, si no es 0 esta claro lo que pasa.

Los otros tipos de datos no voy a explicarlos, ya que es mas de lo mismo. con dar un ojo a la ayuda se aclaran las dudas y si no se preguntan en el foro.

Leer un dato alfanumerico con RegQueryValueEx:

LONG RegQueryValueEx(

HKEY hKey,  

LPTSTR lpValueName,  

LPDWORD lpReserved,  

LPDWORD lpType,  

LPBYTE lpData,  

LPDWORD lpcbData);

creo que no hace falta explicar los parametros, es lo msimo que la funcion anterior. el unico cambio es que antes lpData era lo que queriamos escribir y ahora sera el valor leido. ejemplo:

Insertar CODE, HTML o PHP:
Function leerS(nombre As String) As Long

buffer = String(256, 0)

leerS = RegQueryValueEx(h, nombre, 0, REG_SZ, ByVal buffer, Len(buffer))

End Function
pues ya tenemos en buffer el contenido de la clave que queremos leer, el retorno es lo mismo que antes 0 si no hay error.

Borrar un valor con RegDeleteValue:

LONG RegDeleteValue(

HKEY hKey,  

LPCTSTR lpValueName);

Los parametros creo que están claros, hKey ya esta mas que explicado y lpValueName sera el nombre del valor a borrar

Insertar CODE, HTML o PHP:
Function borrarV(nombre As String) As Integer

borrarV = RegDeleteValue(h, nombre)

End Function
si queremos borrar el valor "saludo" que contenia "hola" usaremos la funcion de esta forma. borrarV("saludo").

Borrar la clave completamente con RegDeleteKey:

LONG RegDeleteKey(

HKEY hKey,

LPCTSTR lpSubKey);

Aqui no hay mucho mas que explicar, igual que al crearla nos pedia una sub clave ahora nos la pide para borrarla, siendo en este caso "prueba". ejemplo:

Insertar CODE, HTML o PHP:
Function borrarC(nombre As String) As Long

RegOpenKey HKEY_LOCAL_MACHINE, "SOFTWARE", h

borrarC = RegDeleteKey(h, nombre)

End Function
ahora se abre simplemente "SOFTWARE" sin "prueba" porque va a ser esta la que borremos y tendremos que pasarla como sub clave.

despues de leer/escribir o lo que sea se cierra el manejador con RegCloseKey:

LONG RegCloseKey(

HKEY hKey);

y los paremtros no hace falta explicarlos. esta todo separado en pequeñas funciones para que se entienda bien y no hacer una solo funcion y marear la perdiz. todas las funciones están probadas ya que antes de ponerme a escribir esto las he tenido que hacer y funcionan bien. si hay algún error duda o lo que sea pues para eso esta el foro.

constantes y demas usadas en los ejemplos:

Insertar CODE, HTML o PHP:
Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long         ' Note that if you declare the lpData parameter as String, you must pass it By Value.

Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long         ' Note that if you declare the lpData parameter as String, you must pass it By Value.

Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long

Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long

Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

Public Const HKEY_LOCAL_MACHINE = &H80000002

Public Const prueba = "SOFTWAREPruebas"

Public Const REG_SZ = 1
 

RadicalEd

Ex-Mod
Miembro
#2
Este es para crear claves DWORD y AlfaNumerico.

Insertar CODE, HTML o PHP:
Attribute VB_Name = "APIparaRegistro"

Option Explicit

'Api's para trabajar con el registro

'Constantes

Public Const HKEY_CLASSES_ROOT = &H80000000

Public Const HKEY_CURRENT_USER = &H80000001

Public Const HKEY_LOCAL_MACHINE = &H80000002

Public Const HKEY_USERS = &H80000003

Public Const REG_SZ = 1

Public Const REG_BINARY = 3

Public Const REG_DWORD = 4

Public Const REG_CREATED_NEW_KEY = &H1

Public Const REG_OPENED_EXISTING_KEY = &H2

Public Const SYNCHRONIZE = &H100000

Public Const READ_CONTROL = &H20000

Public Const STANDARD_RIGHTS_READ = (READ_CONTROL)

Public Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)

Public Const STANDARD_RIGHTS_ALL = &H1F0000

Public Const KEY_QUERY_VALUE = &H1

Public Const KEY_ENUMERATE_SUB_KEYS = &H8

Public Const KEY_NOTIFY = &H10

Public Const KEY_SET_VALUE = &H2

Public Const KEY_CREATE_SUB_KEY = &H4

Public Const KEY_READ = ((READ_CONTROL Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))

Public Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))

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 RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long

Public Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As Long, ByVal dwOptions As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As Long

Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long

Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long

Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long

'Funciones propias para leer y escribir en el registro

Public Function LeerValorDeClave(ByVal hKey As Long, ByVal nombreClave As String, _

    ByVal nombreValor As String, ByVal TipoClave As Integer, _

    Optional valorDefecto As Variant = Empty) As Variant

'Declaraciones previas

    Dim handle As Long, resLong As Long

    Dim resString As String, length As Long

    Dim resBinary() As Byte

    ' Prepara el valor por defecto

    LeerValorDeClave = valorDefecto

    ' Abre la clave, y sale si no la encuentra

    If RegOpenKeyEx(hKey, nombreClave, 0, KEY_READ, handle) Then Exit Function

    

    Select Case TipoClave

        Case REG_DWORD

            ' Lee el valor si es un long

            If RegQueryValueEx(handle, nombreValor, 0, REG_DWORD, _

                resLong, 4) = 0 Then

                LeerValorDeClave = resLong

            End If

        Case REG_SZ

            ' Lee el valor si es una cadena

            length = 1024: resString = Space$(length)

            If RegQueryValueEx(handle, nombreValor, 0, REG_SZ, _

                ByVal resString, length) = 0 Then

                ' Si encuentra el valor, corta los caracteres que no necesita

                LeerValorDeClave = Left$(resString, length - 1)

            End If

        Case REG_BINARY

            ' Lee el valor si es una entrada binaria

            length = 4096

            ReDim resBinary(length - 1) As Byte

            If RegQueryValueEx(handle, nombreValor, 0, REG_BINARY, _

                resBinary(0), length) = 0 Then

                ReDim Preserve resBinary(length - 1) As Byte

                LeerValorDeClave = resBinary()

            End If

        Case Else

            ' Error en el tipo de clave

            Err.Raise 1001, , "Tipo de valor no soportado, cambiar TipoClave"

    End Select

    RegCloseKey handle  ' Cierra la clave del registro

End Function

' Crea o escribe en un valor del Registro

' Usar KeyName = "" para el valor de la clave por defecto

' Soporta sólo los tipos del registro SZ, DWORD y BINARY

Public Sub SetValorRegistro(ByVal hKey As Long, ByVal KeyName As String, ByVal ValueName As String, ByVal KeyType As Integer, value As Variant)

    Dim handle As Long, lngValue As Long

    Dim strValue As String

    Dim binValue() As Byte, length As Long

    

    ' Abre la clave, sale si no la encuentra

    If RegOpenKeyEx(hKey, KeyName, 0, KEY_WRITE, handle) Then Exit Sub

    

    Select Case KeyType

        Case REG_DWORD

            lngValue = value

            RegSetValueEx handle, ValueName, 0, KeyType, lngValue, 4

        Case REG_SZ

            strValue = value

            RegSetValueEx handle, ValueName, 0, KeyType, ByVal strValue, Len(strValue)

        Case REG_BINARY

            binValue = value

            length = UBound(binValue) - LBound(binValue) + 1

            RegSetValueEx handle, ValueName, 0, KeyType, binValue(LBound(binValue)), length

    End Select

    

    ' Cierra la clave

    RegCloseKey handle

End Sub

' Borra un valor

Public Sub BorrarValorRegistro(ByVal hKey As Long, ByVal KeyName As String, ByVal ValueName As String)

    Dim handle As Long

    

    ' Abre la clave, sale si no la encuentra

    If RegOpenKeyEx(hKey, KeyName, 0, KEY_WRITE, handle) Then Exit Sub

    ' Borra el valor

    RegDeleteValue handle, ValueName

    ' Cierra la clave

    RegCloseKey handle

End Sub

' Crea una clave en el registro y la cierra

' Devuelve True si ya existe, y False si ha sido creada

Public Function CrearClaveRegistro(ByVal hKey As Long, ByVal KeyName As String) As Boolean

    Dim handle As Long, disposition As Long

If CheckClave(hKey, KeyName) = False Then

    If RegCreateKeyEx(hKey, KeyName, 0, 0, 0, 0, 0, handle, disposition) Then

        Err.Raise 1001, , "No ha sido posible crear la clave"

    Else

        ' Devuelve True si ya existía

        CrearClaveRegistro = (disposition = REG_OPENED_EXISTING_KEY)

        ' Cierra la clave

        RegCloseKey handle

    End If

End If

End Function

' Comprueba si existe o no una clave

Function CheckClave(ByVal hKey As Long, ByVal KeyName As String) As Boolean

    Dim handle As Long

    ' Intenta abrir la clave

    If RegOpenKeyEx(hKey, KeyName, 0, KEY_READ, handle) = 0 Then

        ' La clave existe

        CheckClave = True

        ' La cierra cuando existe

        RegCloseKey handle

    End If

End Function
Ojala les guste.

Chao
 
Estado
Cerrado para nuevas respuestas
Arriba Pie