Cómo utilizar el API de registro para guardar y recuperar la configuración

Seleccione idioma Seleccione idioma
Id. de artículo: 145679 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Aunque Visual Basic incluye las funciones SaveSetting y GetSetting para guardar y recuperar información del registro, estas funciones sólo funcionan en una sección específica del registro, el Visual Basic and VBA Program Settings de la clave de raíz HKEY_CURRENT_USER.

En este artículo se describe el uso de funciones de API de Windows de 32 bits, que puede utilizarse para establecer y recuperar valores desde cualquier lugar en el registro. Los temas y referencias de función en este artículo pueden ser generalizadas en registro de programa de 16 bits.

Las funciones de 32 bits de la API también incluyen compatibilidad para seguridad, aunque es una introducción a la seguridad de fuera del ámbito de este artículo.

Nota: Las funciones SaveSetting y GetSetting no forman parte de la biblioteca de función VBA. Sin embargo, el código de ejemplo siguiente todavía se aplica a las aplicaciones de 32 bits que implementan VBA.

Más información

Información general de registro

El registro se utiliza por las aplicaciones y Windows para almacenar datos de configuración. Es un sustituto de los números de grandes de archivos INI que proliferado en equipos de Windows 3.x y también se utilizan mucho por OLE.

El registro está organizado mediante una serie de claves y valores a un árbol jerárquica. Cada clave, comenzando por una de las seis claves raíz predefinidas, puede tener subclaves y valores asociados con él. Las claves son unidades organizativas y nombres y aparecen en los editores del registro de Windows como archivo de carpetas. Los valores son entradas de datos y aparecen como entradas de texto en el panel derecho de la ventana Editor del registro. Las claves no necesitan tener los valores asociados, pero pueden tener muchos. Cada valor tiene un tipo de datos asociado. Los dos tipos de datos de registro más utilizadas son REG_SZ, una cadena terminada en null; y REG_DWORD, número de 32 bits.

El proceso básico que se utiliza para escribir o leer desde una ubicación en el registro es el mismo. Para hacer referencia a cualquier clave determinada o un valor, debe tener un identificador a la clave. Una vez obtenido este identificador, valores y subclaves de la clave que hace referencia este identificador se pueden leer, establecer o aparece (enumeradas).

Dada una ubicación en el registro, para obtener un identificador para esa clave, debe comenzar con una de las seis claves predefinidas (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG y HKEY_DYN_DATA) y recorrer el árbol del registro hasta que alcanza la tecla deseada. Programas de usuario más a menudo lectura y escritura de HKEY_CURRENT_USER y HKEY_LOCAL_MACHINE. Si las claves se recorren ya existen, puede utilizar una serie de llamadas a las funciones RegOpenKey o RegOpenKeyEx. Si las claves deben crearse, las funciones RegCreateKey y RegCreateKeyEx hacer el trabajo.

Con el identificador a la clave deseada, se pueden llamar las funciones de lista, conjunto y recuperar información. En todos los casos, las funciones con el sufijo ex funcionará sólo en plataformas de 32 bits. Funciones sin el sufijo pueden funcionar en las versiones de 16 bits y 32 bits de Windows. Tenga en cuenta que no todas las funciones del registro falta el sufijo 'Ex' son funciones que proporciona compatibilidad de 16 bits. Sólo se agregó el sufijo ex cuando se expanden las capacidades de las funciones de 16 bits. Funciones que están totalmente nueva y específicos para plataformas de 32 bits no poseen una extensión de Exchange.

Las funciones RegSetValue y RegSetValueEx permiten la configuración de un valor para modificarse mientras RegQueryValue y RegQueryValueEx recuperan la configuración actual de un valor. Las limitaciones de la Exchange-no, las versiones de 16 bits de estas API son muy evidentes aquí. Cuando se utiliza la función de RegSetValue de 16 bits no hay ninguna forma de denominar un valor y, a causa de esto, RegSetValue no se utiliza para asociar más de un valor a cada clave. Además, todos los valores escritos con RegSetValue tener un tipo de datos de REG_SZ. Estas limitaciones son inherentes a con el registro de 16 bits. RegSetValueEx permite la creación de un número de valores múltiples con cualquier tipo de datos disponibles.

Cómo escribir en una ubicación de registro específico

Después de determinar qué funciones tendrá que utilizar para el proyecto, copia el correspondiente se declara desde el código al final de este artículo a un módulo básico. Los dos Visual Basic procedimientos incluidos (SetValueEx y QueryValueEx) son contenedores para las funciones RegSetValueEx y API RegQueryValueEx y simplifican enormemente su uso. Las notas de hacer uso de estas funciones de Visual Basic; sin embargo, es libres para realizar llamadas directamente a la API si lo desea.

Crear o modificar claves y valores:

Con las declaraciones y procedimientos disponibles, puede crear y abrir las claves y agregar, modificar y leer valores. Las tres secciones siguientes explica cómo crear una clave, establecer o modificar un valor y consultar un valor.

Crear una clave nueva:

Creando una nueva clave es tan sencillo como mediante el procedimiento siguiente. CreateNewKey toma el nombre de la clave para crear y la constante que representa la clave predefinida para crear la clave en. La llamada al RegCreateKeyEx no aprovechar los mecanismos de seguridad permitidos, pero podría modificarse para hacerlo. Una explicación de la seguridad del registro queda fuera del ámbito de este artículo.
   Private Sub CreateNewKey (sNewKeyName As String, lPredefinedKey As Long)
       Dim hNewKey As Long         'handle to the new key
       Dim lRetVal As Long         'result of the RegCreateKeyEx function

       lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, _
                 vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, _
                 0&, hNewKey, lRetVal)
       RegCloseKey (hNewKey)
   End Sub
				

Con este procedimiento una llamada de:
   CreateNewKey "TestKey", HKEY_LOCAL_MACHINE
				

creará una clave denominada TestKey inmediatamente debajo de HKEY_LOCAL_MACHINE.

Llamada CreateNewKey así:
      CreateNewKey "TestKey\SubKey1\SubKey2", HKEY_LOCAL_MACHINE
				

creará anidados tres claves comienzan con TestKey inmediatamente bajo HKEY_CURRENT_USER, SubKey1 subordinados a TestKey y SubKey3 en SubKey2.

Un valor de configuración o modificar:

Crear y establecer un valor de una clave especificada pueden realizarse con el siguiente procedimiento corto. SetKeyValue toma la clave que el valor se asociará con el nombre del valor, la configuración del valor y el tipo del valor (el SetValueEx función sólo admite REG_SZ y REG_DWORD, pero esto puede modificarse si es necesario). Especifique un nuevo valor para un sValueName existente se modifique la configuración actual de dicho valor.
   Private Sub SetKeyValue (sKeyName As String, sValueName As String, _
   vValueSetting As Variant, lValueType As Long)
       Dim lRetVal As Long         'result of the SetValueEx function
       Dim hKey As Long         'handle of open key

       'open the specified key
       lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
                                 KEY_SET_VALUE, hKey)
       lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)
       RegCloseKey (hKey)
   End Sub
				

Una llamada de:
   SetKeyValue "TestKey\SubKey1", "StringValue", "Hello", REG_SZ
				

creará un valor de tipo REG_SZ denominada "ValorString" con el valor de "Hello". Este valor se asociará con la clave SubKey1 de "TestKey."

En este caso, "TestKey" es una subclave de HKEY_CURRENT_USER, pero esto se puede modificar cambiando la llamada a RegOpenKeyEx. Esta llamada fallará si no existe "TestKey\SubKey1". Para evitar este problema, utilice una llamada a RegCreateKeyEx en lugar de una llamada a RegOpenKeyEx. RegCreateKeyEx abrirá una clave especificada, si ya existe.

Consultar un valor:

El siguiente procedimiento puede utilizarse para determinar el valor de un valor existente. QueryValue toma el nombre de la clave y el nombre de un valor asociado a esa clave y muestra un cuadro de mensaje con el valor correspondiente. Utiliza una llamada a la función de contenedor de QueryValueEx definida a continuación, sólo admite tipos REG_SZ y REG_DWORD.
   Private Sub QueryValue (sKeyName As String, sValueName As String)
       Dim lRetVal As Long         'result of the API functions
       Dim hKey As Long         'handle of opened key
       Dim vValue As Variant      'setting of queried value

       lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
   KEY_QUERY_VALUE, hKey)
       lRetVal = QueryValueEx(hKey, sValueName, vValue)
       MsgBox vValue
       RegCloseKey (hKey)
   End Sub
				

Con este procedimiento, una llamada de:
   QueryValue "TestKey\SubKey1", "StringValue"
				

se mostrará un cuadro de mensaje con la configuración actual del valor "ValorString" y se supone que "ValorString" existe en la clave "TestKey\SubKey1".

Si no existe el valor que consulta QueryValue devuelve un código de error de 2 - 'ERROR_BADKEY'.

Notas adicionales:

Los ejemplos anteriores utiliza exclusivamente las versiones de 32 bits extendidas de las funciones del registro. Estas funciones permiten más de un valor para asociarse a cada clave. Como se explicó anteriormente, el RegSetValue de 16 bits y RegQueryValue actúan en un único valor asociado con la clave actual (que es siempre de tipo REG_SZ). Estas funciones aparecen en el Editor del registro de 32 bits con un nombre de < NO NAME >. Para establecer, modificar o consultar este valor especial asociado, uno debe utilizar las funciones de registro de 16 bits. Lectura y escritura del registro en un entorno de 16 bits son mucho más sencillo que en un entorno de 32 bits. Se sigue el mismo procedimiento básico: abrir una clave y obtener un identificador y, a continuación, llamar a su función de modificación con ese identificador, pero no necesita consideración realizarse para varios valores asociados o para tipos de datos de valor diferente. Una aplicación de 16 bits puede crear y modificar claves y valores con las declaraciones de las funciones RegCreateKey, RegOpenKey, RegQueryValue, RegSetValue y RegCloseKey.

En algunos casos, no es necesario para los valores de asociarse con una clave. Es posible que una aplicación sólo necesita saber si existe una clave o valor y no preocuparse de la naturaleza de los valores de la clave. En una situación como ésta, las funciones RegEnumKey, RegEnumKeyEx y RegEnumValue pueden utilizarse para determinar si existe una clave o valor. Para obtener más información sobre estas funciones consulte la referencia de API Visor de texto y API de Windows.

Función de API y declaraciones de constantes

   Option Explicit

   Public Const REG_SZ As Long = 1
   Public Const REG_DWORD As Long = 4

   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 ERROR_NONE = 0
   Public Const ERROR_BADDB = 1
   Public Const ERROR_BADKEY = 2
   Public Const ERROR_CANTOPEN = 3
   Public Const ERROR_CANTREAD = 4
   Public Const ERROR_CANTWRITE = 5
   Public Const ERROR_OUTOFMEMORY = 6
   Public Const ERROR_ARENA_TRASHED = 7
   Public Const ERROR_ACCESS_DENIED = 8
   Public Const ERROR_INVALID_PARAMETERS = 87
   Public Const ERROR_NO_MORE_ITEMS = 259

   Public Const KEY_QUERY_VALUE = &H1
   Public Const KEY_SET_VALUE = &H2
   Public Const KEY_ALL_ACCESS = &H3F

   Public Const REG_OPTION_NON_VOLATILE = 0

   Declare Function RegCloseKey Lib "advapi32.dll" _
   (ByVal hKey As Long) As Long
   Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias _
   "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
   ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions _
   As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes _
   As Long, phkResult As Long, lpdwDisposition As Long) As Long
   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
   Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
   As String, lpcbData As Long) As Long
   Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, lpData As _
   Long, lpcbData As Long) As Long
   Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
   As Long, lpcbData As Long) As Long
   Declare Function RegSetValueExString Lib "advapi32.dll" Alias _
   "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
   ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As _
   String, ByVal cbData As Long) As Long
   Declare Function RegSetValueExLong Lib "advapi32.dll" Alias _
   "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
   ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, _
   ByVal cbData As Long) As Long
				

SetValueEx y funciones de QueryValueEx contenedor:
   Public Function SetValueEx(ByVal hKey As Long, sValueName As String, _
   lType As Long, vValue As Variant) As Long
       Dim lValue As Long
       Dim sValue As String
       Select Case lType
           Case REG_SZ
               sValue = vValue & Chr$(0)
               SetValueEx = RegSetValueExString(hKey, sValueName, 0&, _
                                              lType, sValue, Len(sValue))
           Case REG_DWORD
               lValue = vValue
               SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, _
   lType, lValue, 4)
           End Select
   End Function

   Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As _
   String, vValue As Variant) As Long
       Dim cch As Long
       Dim lrc As Long
       Dim lType As Long
       Dim lValue As Long
       Dim sValue As String

       On Error GoTo QueryValueExError

       ' Determine the size and type of data to be read
       lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
       If lrc <> ERROR_NONE Then Error 5

       Select Case lType
           ' For strings
           Case REG_SZ:
               sValue = String(cch, 0)

   lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, _
   sValue, cch)
               If lrc = ERROR_NONE Then
                   vValue = Left$(sValue, cch-1)
               Else
                   vValue = Empty
               End If
           ' For DWORDS
           Case REG_DWORD:
   lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, _
   lValue, cch)
               If lrc = ERROR_NONE Then vValue = lValue
           Case Else
               'all other data types not supported
               lrc = -1
       End Select

   QueryValueExExit:
       QueryValueEx = lrc
       Exit Function

   QueryValueExError:
       Resume QueryValueExExit
   End Function
				

Referencias

Programación de la Windows 95 interfaz de usuario, capítulo 10 - "Utilizar el registro"

Para las referencias de función: cualquier guía al Win16 o API Win32.

Propiedades

Id. de artículo: 145679 - Última revisión: jueves, 15 de julio de 2004 - Versión: 1.2
La información de este artículo se refiere a:
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 16-bit Enterprise Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
  • Microsoft Visual Basic for Applications 5.0
  • Microsoft Visual Basic for Applications 6.0
Palabras clave: 
kbmt kbcode kbhowto kbtophit KB145679 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 145679

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com