Como utilizar o API de registo para guardar e obter definição

Traduções de Artigos Traduções de Artigos
Artigo: 145679 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Apesar de Visual Basic inclui as funções SaveSetting e ObterDefinição para guardar e obter informações a partir do registo, estas funções só funcionam numa secção específica do registo, o Visual Basic e definições de programas VBA da chave raiz HKEY_CURRENT_USER.

Este artigo descreve a utilização de funções de API do Windows de 32 bits, que pode ser utilizado para definir e obter valores a partir de qualquer parte no registo. Os tópicos e função indicado neste artigo pode ser generalizados registo do programa de 16 bits.

As funções de API de 32 bits incluem suporte para segurança, embora seja uma descrição geral de segurança fora do âmbito deste artigo.

NOTA: As funções SaveSetting e ObterDefinição não fazem parte da biblioteca de funções VBA. No entanto, o código de exemplo abaixo ainda se aplica a aplicações de 32 bits que implementam o VBA.

Mais Informação

Informações de registo geral

O registo é utilizado por aplicações e Windows para armazenar dados de configuração. Este é um substituto grandes quantidades de ficheiros INI proliferated nos computadores do Windows 3.x e também é muito utilizados por OLE.

O registo está organizado utilizando um conjunto de chaves e valores que se uma árvore hierárquico. Cada chave, começando uma das seis chaves de raiz predefinido, pode ter em subchaves e valores associados. As chaves são unidades organizacionais e atribuição de nomes e aparecem no Editor de registo Windows como pastas de ficheiros. Os valores são entradas de dados e aparecem como entradas de texto no painel da direita da janela do Editor de registo. Chaves não necessitam de ter quaisquer valores associados, mas podem ter muitos. Cada valor tem um tipo de dados associada. Os dois tipos de dados de registo utilizadas com mais frequência são REG_SZ, uma cadeia terminada com nulo; e REG_DWORD, um número de 32 bits.

O processo básico utilizado para escrever ou ler a partir de uma localização no registo é o mesmo. Para fazer referência a qualquer determinada chave ou valor, tem de ter um identificador para a chave. Assim que este identificador é obtido, valores e em subchaves da chave que se refere este identificador podem ser ler, definir ou listados (enumerados).

Atribuído uma localização do registo, para obter um identificador a essa chave, tem de começar com uma das seis chaves predefinidas (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG e HKEY_DYN_DATA) e atravessar a árvore de registo até é atingida tecla desejada. Utilizador programas mais frequentemente leitura e escrita de HKEY_CURRENT_USER e HKEY_LOCAL_MACHINE. Se as chaves a ser partilhadas já existirem, pode utilizar uma série de chamadas para as funções RegOpenKey ou RegOpenKeyEx. Se as teclas de necessitar de ser criado, as funções RegCreateKey e RegCreateKeyEx efectue a tarefa.

Com o identificador para a chave pretendida, podem ser chamadas as funções utilizadas para lista, definir e obter informações. Em todos os casos, as funções com o sufixo ex funcionará apenas em plataformas de 32 bits. Funções sem o sufixo poderão funcionar nas versões de 16 bits e 32 bits do Windows. Tenha em atenção que nem todas as funções de registo sem o sufixo 'Ex' são funções fornecidas para compatibilidade de 16 bits. O sufixo ex apenas foi adicionado quando as capacidades das funções de 16 bits foram expandidas. Funções que estão totalmente novas e específicas para plataformas de 32 bits não possui uma extensão de ex.

As funções RegSetValue e RegSetValueEx permitem que as definições de um valor para ser modificado, enquanto RegQueryValue e RegQueryValueEx obter a definição actual de um valor. As limitações do utilizador não ex, versões de 16 bits destas APIs estão muito evidentes aqui. Quando utilizar a função de RegSetValue de 16 bits não é possível atribuir nome a um valor e, deste modo, RegSetValue não pode ser utilizado para associar mais do que um valor de cada chave. Além disso, todos os valores escritos com RegSetValue têm um tipo de dados de REG_SZ. Estas limitações são inerentes com o registo de 16 bits. RegSetValueEx permite a criação de um número de valores múltiplos com qualquer tipo de dados disponíveis.

Como escrever para uma localização de registo específico

Depois de determinar que funções precisará de utilizar para o projecto, a respectiva cópia declara contra o código no fim deste artigo a um módulo básico. Os dois do Visual Basic procedimentos incluídos (SetValueEx e QueryValueEx) são wrappers para as funções RegSetValueEx e RegQueryValueEx API e bastante simplificam a respectiva utilização. As notas abaixo criar utilizar uma destas funções do Visual Basic; no entanto, que está disponível efectuar chamadas directamente para a API se assim o desejar.

Criação de alterar chaves e valores:

Com as declarações e procedimentos disponíveis, pode criar e abrir chaves e adicionar, modificar e ler valores. As três secções seguintes explicam como criar uma chave, definir ou modificar um valor e consultar um valor.

Criar uma nova chave:

Criar uma nova chave é tão simples como utilizando o seguinte procedimento. CreateNewKey obtém o nome de chave para criar e a constante que representa a chave predefinida para criar a chave em. A chamada para RegCreateKeyEx não tirar partido de mecanismos de segurança permitidos, mas poderia ser modificada para o fazer. Uma discussão sobre segurança do registo está fora do âmbito deste artigo.
   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
				

Este procedimento uma chamada de:
   CreateNewKey "TestKey", HKEY_LOCAL_MACHINE
				

irá criar uma chave denominada TestKey imediatamente em HKEY_LOCAL_MACHINE.

Chamar CreateNewKey assim:
      CreateNewKey "TestKey\SubKey1\SubKey2", HKEY_LOCAL_MACHINE
				

irá criar aninhados três chaves começando TestKey imediatamente em HKEY_CURRENT_USER, SubKey1 subordinados TestKey e SubKey3 em SubKey2.

Definição/modificar um valor:

Criar e definir um valor de uma chave especificada podem ser efectuadas com o seguinte procedimento curto. SetKeyValue demora a chave que o valor será associado com o nome do valor, a definição do valor e o tipo do valor (o SetValueEx função apenas suporta REG_SZ e REG_DWORD, mas esta pode ser modificada se necessário). Especificar um novo valor para um sValueName existente irá modificar a definição actual desse 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
				

Uma chamada de:
   SetKeyValue "TestKey\SubKey1", "StringValue", "Hello", REG_SZ
				

cria um valor de tipo REG_SZ, chamado "ValorCadeia" com a definição de "Olá". Este valor será associado à chave SubKey1 de "TestKey."

Neste caso, "TestKey" é uma subchave de HKEY_CURRENT_USER, mas esta pode ser modificada alterando a chamada de RegOpenKeyEx. Esta chamada falhará se "TestKey\SubKey1" não existe. Para evitar este problema, utilize uma chamada para RegCreateKeyEx em vez de uma chamada para RegOpenKeyEx. Se já existir, RegCreateKeyEx abrirá uma chave especificada.

Consultar um valor:

O procedimento seguinte pode ser utilizado para determinar a definição de um valor existente. QueryValue tem o nome da chave e o nome de um valor associado a essa chave e apresenta uma caixa de mensagem com o valor correspondente. Utiliza uma chamada para a função de wrapper do QueryValueEx definida abaixo, só suporta tipos de REG_SZ e 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
				

Este procedimento, uma chamada de:
   QueryValue "TestKey\SubKey1", "StringValue"
				

Apresenta uma caixa de mensagem com a definição actual do valor "ValorCadeia" e parte do princípio que existe "ValorCadeia" na chave "TestKey\SubKey1".

Se o valor que consultar não existe QueryValue devolverá um código de erro de 2 - 'ERROR_BADKEY'.

Notas adicionais:

Os exemplos acima utilizam exclusivamente as versões de 32 bits expandidas das funções de registo. Estas funções permitem mais do que um valor para ser associada a cada chave. Tal como discutido acima, de 16 bits RegSetValue e RegQueryValue actuam sobre um valor único associado à chave actual (que é sempre do tipo REG_SZ). Estas funções são apresentados no Editor de registo de 32 bits com um nome de < NOME NO >. Para definir, modificar ou consultar este valor associado especial, um tem de utilizar as funções de registo de 16 bits. Ler e escrever do registo num ambiente de 16 bits são muito mais simples do que num ambiente de 32 bits. O mesmo procedimento básico é seguido: Abra uma chave e obter um identificador e, em seguida, chamar a função de modificação com desse identificador, mas não tem de considerar ser criados para múltiplos valores associados ou para tipos de dados do valor diferente. Uma aplicação de 16 bits pode criar e modificar chaves e valores com as declarações de funções RegCreateKey RegOpenKey, RegQueryValue, RegSetValue e RegCloseKey.

Em alguns casos, não é necessário para quaisquer valores associados uma chave. Uma aplicação só necessitar de saber se uma determinada chave ou valor existe e não interessa a natureza dos valores da chave. Numa situação semelhante, as funções RegEnumKey RegEnumKeyEx e RegEnumValue podem ser utilizadas para determinar se uma determinada chave ou valor existe. Para mais informações sobre estas funções Consulte a referência da API Text Viewer e/ou API do Windows.

Função da API e declarações constante

   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
				

Funções de Wrapper QueryValueEx e SetValueEx:
   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
				

Referências

Programar o Windows 95 User Interface, capítulo 10 - "Utilizar o registo"

Para referências de função: qualquer guia para Win16 de API do Win32.

Propriedades

Artigo: 145679 - Última revisão: 15 de julho de 2004 - Revisão: 1.2
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbmt kbcode kbhowto kbtophit KB145679 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 145679

Submeter comentários

 

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