Come utilizzare l'API del Registro di sistema per salvare e recuperare un'impostazione

Traduzione articoli Traduzione articoli
Identificativo articolo: 145679 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Sebbene Visual Basic include le funzioni SaveSetting e GetSetting Per salvare e recuperare informazioni dal Registro di sistema, queste funzioni solo operare su una sezione specifica del Registro di sistema di Visual Basic e VBA Impostazioni del programma della chiave principale HKEY_CURRENT_USER.

In questo articolo viene descritto l'utilizzo di funzioni API Windows a 32 bit, che pu˛ essere Consente di impostare e recuperare valori da un punto qualsiasi nel Registro di sistema. Gli argomenti e i riferimenti alle funzioni in questo articolo pu˛ essere generalizzate al programma di Registro di sistema a 16 bit.

Le funzioni dell'API a 32 bit inoltre includono il supporto per la protezione, anche se un Cenni preliminari sulla protezione esula dall'ambito del presente articolo.

Nota: Le funzioni SaveSetting e GetSetting non fanno parte di VBA libreria di funzioni. Tuttavia, il codice di esempio seguente rimane comunque applicabile a 32 bit applicazioni che implementano VBA.

Informazioni

Informazioni del Registro di sistema generali

Il Registro di sistema viene utilizzato da Windows e applicazioni per memorizzare la configurazione dati. ╚ che un sostituto di un numero elevato di file INI file l'impiego di Windows 3. x macchine e viene inoltre utilizzato pesantemente da OLE.

╚ organizzato con una serie gerarchica di chiavi e valori simile a una struttura ad albero. Ogni chiave, a partire da uno dei sei radice predefiniti chiavi, pu˛ avere sottochiavi e valori associati. Le chiavi sono unitÓ organizzativa e dei nomi e visualizzato nell'editor del Registro di sistema di Windows come cartelle di file. I valori sono le voci di dati e vengono visualizzati come voci di testo nel riquadro destro della finestra dell'Editor del Registro di sistema. Non sarÓ necessario creare i relativi tasti i valori, ma molte sono. Ogni valore Ŕ un tipo di dati associato. I due tipi di dati del Registro di sistema pi¨ diffusi sono REG_SZ, con terminazione null stringa; e REG_DWORD, un numero a 32 bit.

╚ il processo di base utilizzato per scrivere o leggere da un percorso nel Registro di sistema lo stesso. Per fare riferimento per ogni valore o la chiave specificata, Ŕ necessario disporre di un handle per la chiave. Dopo aver ottenuto l'handle, i valori e le sottochiavi della chiave che Questo handle fa riferimento a possono essere letti, impostare o elencati (enumerato).

Presenza di una posizione nel Registro di sistema per ottenere un handle alla chiave, Ŕ necessario iniziare con uno dei sei chiavi predefinite (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG, e HKEY_DYN_DATA) e attraversare la struttura del Registro di sistema, fino a quando non Ŕ il tasto desiderato raggiunto. Programmi utente pi¨ spesso di leggere e scrivere da HKEY_CURRENT_USER e HKEY_LOCAL_MACHINE. Se le chiavi attraversate esistono giÓ, Ŕ possibile utilizzare una serie di chiamate alle funzioni RegOpenKey o RegOpenKeyEx. Se le chiavi devono essere create, le funzioni RegCreateKey e RegCreateKeyEx questo compito.

Con l'handle per la chiave desiderata, le funzioni utilizzate per visualizzare, impostare, e recuperare informazioni possono essere chiamati. In tutti i casi, le funzioni con l'Ex suffisso funziona solo su piattaforme a 32 bit. Funzioni senza il suffisso pu˛ lavorare su versioni a 16 bit e a 32 bit di Windows. Tenere presente che tutte le funzioni del Registro di sistema se ne manca il suffisso "Ex" sono funzioni previste compatibilitÓ a 16 bit. Il suffisso Ex Ŕ stato aggiunto solo quando le funzionalitÓ del funzioni a 16 bit sono stati espansi. Funzioni che sono completamente nuovo e specifico per piattaforme a 32 bit non possiedono un'estensione Ex.

Le funzioni RegSetValue e RegSetValueEx consentono le impostazioni di un valore per essere modificato, mentre RegQueryValue e RegQueryValueEx recuperare il impostazione corrente di un valore. Le limitazioni delle versioni non-Ex, a 16 bit di queste API sono molto evidente. Quando si utilizza il RegSetValue 16-bit funzione non vi Ŕ alcun modo al nome di un valore e grazie a questo, RegSetValue non pu˛ essere utilizzato per associare pi¨ di un valore a ciascuna chiave. Inoltre, tutti i valori scritti con RegSetValue sono un tipo di dati REG_SZ. Questi limitazioni riguardano il Registro di sistema a 16 bit. RegSetValueEx consente il creazione di un numero multiplo di valori con qualsiasi tipo di dati disponibili.

Come scrivere in un percorso del Registro di sistema

Dopo aver stabilito quali sono le funzioni si dovranno utilizzare per il progetto Copia la corrispondente viene dichiarato dal codice alla fine di questo articolo per un modulo di base. Le due procedure di Visual Basic incluse (SetValueEx e QueryValueEx) sono wrapper per le API RegQueryValueEx RegSetValueEx le funzioni e semplificano notevolmente l'utilizzo. Le note sotto marca utilizzare questi Funzioni di Visual Basic. Tuttavia, ha la possibilitÓ di effettuare chiamate direttamente al API se lo si desidera.

Creazione, modifica di chiavi e valori:

Con le dichiarazioni e le procedure disponibili, Ŕ possibile creare e aprire chiavi e aggiungere, modificare e leggere i valori. Le seguenti tre sezioni viene illustrato come creare una chiave, impostare o modificare un valore e un valore di query.

Creazione di una nuova chiave:

Creazione di una nuova chiave Ŕ semplice come utilizzare la procedura seguente. CreateNewKey accetta il nome della chiave per la creazione e la costante oggetto che rappresenta la chiave per creare la chiave predefinita. La chiamata a RegCreateKeyEx non sfruttare i meccanismi di protezione consentite, ma potrebbe essere modificato per farlo. Una trattazione della protezione del Registro di sistema all'esterno dell'ambito di questo articolo.
   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 questa procedura una chiamata di:
   CreateNewKey "TestKey", HKEY_LOCAL_MACHINE
				

verrÓ creata una chiave denominata TestKey immediatamente sotto HKEY_LOCAL_MACHINE.

Chiamata di CreateNewKey come segue:
      CreateNewKey "TestKey\SubKey1\SubKey2", HKEY_LOCAL_MACHINE
				

creerÓ nidificati tre chiavi a partire da TestKey immediatamente di sotto HKEY_CURRENT_USER, SubKey1 subordinati a TestKey e SubKey3 in SubKey2.

Impostazione/modifica di un valore:

Creando e impostando un valore di una chiave specificata pu˛ essere effettuate con la seguente procedura breve. SetKeyValue utilizza la chiave che il valore verrÓ associato il nome del valore, l'impostazione del valore, e il tipo del valore (la funzione SetValueEx supporta solo REG_SZ e REG_DWORD, ma questo pu˛ essere modificato se necessario). Specificare un nuovo valore per un sValueName esistente verrÓ modificato l'impostazione corrente di tale valore.
   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 chiamata di:
   SetKeyValue "TestKey\SubKey1", "StringValue", "Hello", REG_SZ
				

verrÓ creato un valore di tipo che REG_SZ denominata "StringValue" con l'impostazione "Hello". Questo valore Ŕ associato alla chiave SubKey1 di "TestKey."

In questo caso, "TestKey" Ŕ una sottochiave di HKEY_CURRENT_USER, ma pu˛ essere modificato cambiando la chiamata a RegOpenKeyEx. Questa chiamata avrÓ esito negativo se "TestKey\SubKey1" non esiste. Per evitare questo problema, utilizzare una chiamata a RegCreateKeyEx invece di una chiamata a RegOpenKeyEx. VerrÓ aperto RegCreateKeyEx una chiave specificata, se esiste giÓ.

Query su un valore:

La procedura successiva consente di verificare l'impostazione di un oggetto esistente valore. QueryValue accetta il nome della chiave e il nome di un valore associato a tale chiave e visualizza una finestra di messaggio con il corrispondente valore. Utilizza una chiamata alla funzione di wrapper QueryValueEx definita di seguito, che supporta solo tipi 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
				

Con questa procedura, una chiamata di:
   QueryValue "TestKey\SubKey1", "StringValue"
				

verrÓ visualizzata una finestra di messaggio con l'impostazione corrente di "StringValue" il valore e presuppone l'esistenza di "StringValue" nella chiave "TestKey\SubKey1".

Se il valore Ŕ una query non esiste quindi QueryValue restituirÓ un codice di errore di 2 - 'ERROR_BADKEY'.

Note aggiuntive:

Gli esempi sopra riportati utilizzano le versioni a 32 bit estese del Registro di sistema funziona in modo esclusivo. Queste funzioni consentono pi¨ di un valore da associato a ciascuna chiave. Come indicato in precedenza, il RegSetValue a 16 bit e RegQueryValue atto a un singolo valore associato alla chiave corrente (che Ŕ sempre di tipo REG_SZ). Queste funzioni vengono visualizzate in 32 bit Editor del Registro di sistema con il nome di <NO name="">. Per impostare, modificare o eseguire questa query valore associato speciale, uno deve utilizzare le funzioni del Registro di sistema a 16 bit. Lettura e scrittura nel Registro di sistema in un ambiente a 16 bit Ŕ molto pi¨ semplice in un ambiente a 32 bit. Viene seguita la stessa procedura di base: Aprire una chiave e ottenere un handle e quindi chiamare la funzione di modifica con tale handle, ma senza considerazione deve prevedere pi¨ associati i valori o per tipi di dati di valore diverso. Possibile creare un'applicazione a 16 bit e modificare chiavi e valori con le dichiarazioni di RegCreateKey, RegOpenKey, RegQueryValue, RegSetValue e RegCloseKey funzioni. </NO>

In alcuni casi, non Ŕ necessario per tutti i valori da associare a una chiave. Un'applicazione potrebbe essere sufficiente sapere se esiste una determinata chiave o valore, e attenzione sulla natura dei valori della chiave. In una situazione di questo tipo, possono essere utilizzate per le funzioni RegEnumKey, RegEnumKeyEx e RegEnumValue determinare l'esistenza di una determinata chiave o valore. Per ulteriori informazioni su Queste funzioni fanno riferimento al riferimento API Visualizzatore di testo e/o API di Windows.

La funzione API e le dichiarazioni di costanti

   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 e funzioni Wrapper QueryValueEx:
   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
				

Riferimenti

Programmazione dell'interfaccia utente in Windows 95, capitolo 10-"utilizzando il Registro di sistema"

Per i riferimenti alle funzioni: qualsiasi Guida Win16 e Win32 API.

ProprietÓ

Identificativo articolo: 145679 - Ultima modifica: sabato 25 maggio 2013 - Revisione: 2.0
Le informazioni in questo articolo si applicano 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 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic for Applications 6.0
Chiavi:á
kbcode kbhowto kbtophit kbmt KB145679 KbMtit
Traduzione automatica articoli
IMPORTANTE: il presente articolo Ŕ stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l?obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre Ŕ perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilitÓ per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualitÓ della traduzione.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 145679
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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