# VBForums UtilityBank > UtilityBank - Tutorials >  Working with Windows Registry using Visual Basic 6 - A complete Tutorial

## Siddharth Rout

*Brief description*: There are plenty of threads scattered in vbforums which tell you how to interact with the registry but none of them are commented thoroughly so that a new user could understand them... I have tried to summarize here with snapshots all that you can do with the Windows registry... BTW I have tried this with Windows XP SP3 and VB 6.0

*Caution*: Before you begin with this tutorial, The very first step that you should learn is how to back up windows registry. Please see the section "Backing up the Windows Registry" below.

*Topics*
1. Backing up the Windows Registry
2. Writing to The Windows Registry
3. Reading from The Windows Registry
4. Deleting entries in The Windows Registry
5. GetAllSettings
6. Checking if a key created by SaveSetting exists using vb 6.0 code 
7. Writing to any portion of the registry for which you have permissions <_A bit more advanced_>
8. Find keys in the Windows Registry... with an Project Example 
9. Other API References
10. Summary

----------


## Siddharth Rout

Backing up the Windows Registry is very easy, and results in the generation of a text file. You can save the file to your hard drive or to any removable drive (except a floppy drive  :Smilie: ). To backup the Registry, click on the Windows Start Button, then click on Run. Type regedit into the textbox, and click on the OK button as shown in the picture below


The Windows Registry Editor will appear as shown below...


Click on the menu File -> Export as shown in the picture. A dialog box will appear asking you to specify the name for the Registry Backup file.



Give a suitable name for the backupfile. Make sure that the Export Range of 'All' is selected. The extension .reg will automatically be added to the file. Select the path where you want to save the registry backup file. Now click on the Save button, and a backup of the Registry will be saved for you.

----------


## Siddharth Rout

To write to the registry we will use the *SaveSetting* command. SaveSetting Saves or creates an application entry in the application's entry in the Windows Registry. _Visual Basic, by default using GetSetting and SaveSetting allows reading and writing only to the VB and VBA Programs key under HKEY_Current_User\Software._

*Syntax*

*SaveSetting appname, section, key, setting*

The SaveSetting statement syntax has these named arguments:

*Part Description* 
appname _Required_	String expression containing the name of the application orproject to which the setting applies. 
section _Required_	String expression containing the name of the section where the key setting is being saved. 
key _Required_	String expression containing the name of the key setting being saved. 
setting _Required_	Expression containing the value that key is being set to. 

Lets understand the syntax...
You can compare the registry to a database which has fields and records in it...
The first three arguments of the SaveSetting statement can be compared to fields in a record. The field names just happen to be appname, section, key and setting and we need to simply supply values to this via SaveSetting.

The best thing about the SaveSetting statement is that you can specify any values you want for appname, section and key. However please ensure that you pick something meaningful. The last field "setting" holds the value that we are really interested in. Lets try it with an example which uses the SaveSetting statement to make entries in the Windows registry for the MyApp application.


vb Code:
'~~> Place some settings in the registry.SaveSetting appname := "MyApp", section := "Startup", key := "Top", setting := 75'OrSaveSetting "MyApp","Startup", "Top", 75

What this code does is that it saves the .Top value of your startup form in the Windows Registry.

Once this line of code executes, a 'record' is written to the Windows Registry with these four 'field' values. If you want to check this out for yourself, you can start the Registry Editor again, and search for the value by selecting Edit-Find from the Registry Editor's Menu Bar.

----------


## Siddharth Rout

Now that we have the MyApp's startup form's *.Top* value saved in the Windows Registry, we need to access the value whenever our program starts up. We'll use the Visual Basic GetSetting function to read this value from the Windows Registry, and a good place to execute that function is in the Load Event Procedure of the form. Before I show you that code, let me show you the format for the GetSetting function.

*Syntax*

*GetSetting(appname, section, key[, default])*

The GetSetting function syntax has thesenamed arguments:

*Part Description* 
appname _Required_	String expression containing the name of the application or project whose key setting is requested. 
section _Required_	String expression containing the name of the section where the key setting is found. 
key  _Required_	String expression containing the name of the key setting to return. 
default _Optional_	Expression containing the value to return if no value is set in the key setting. If omitted, default is assumed to be a zero-length string (""). 

As you can see, the first three arguments of the GetSetting function are identical to the SaveSetting statement. The difference lies in the fourth argument. With the SaveSetting Statement, the fourth argument was the value to be written to the Registry. For the GetSetting function, the fourth argument is an optional argument used to specify a default value to be returned in the event that the entry specified cannot be located in the Windows Registry.

Here's the code to place in the Load Event Procedure of the Startup Form. I have inserted 2 message box in the code below so that you can understand how it works...


vb Code:
Private Sub Form_Load()    '~~> Check what is the current top value    MsgBox Form1.Top    '~~> Get value from registry    Form1.Top = GetSetting("MyApp", "Startup", "Top", 25)    '~~> Check the new top value    MsgBox Form1.TopEnd Sub

----------


## Siddharth Rout

To delete the entry that you made in the registry, you need to use *DeleteSetting* statement

*Syntax*

_DeleteSetting appname, section[, key]_

The DeleteSetting statement syntax has these named arguments:

*Part Description* 
appname _Required_	String expression containing the name of the application or project to which the section or key setting applies. 
section _Required_	String expression containing the name of the section where the key setting is being deleted. If only appname and section are provided, the specified section is deleted along with all related key settings. 
key _Optional_	String expression containing the name of the key setting being deleted. 

You can use it to delete the appname, section and key entry, similar to the way you created the entry to begin with. For example


vb Code:
DeleteSetting "MyApp", "Startup", "Top

After deleting the key, try searching the registry again and you will see that the key has been deleted.

----------


## Siddharth Rout

Visual Basic provides us a function called *GetAllSettings* which can be used to return the Registry entries for a particular Appname and Setting. Here's the format for the GetAllSettings function. This is used for example in case we loose track of the entries we have made in the windows registry.

*Syntax*

*GetAllSettings(appname, section)*

The GetAllSettings function syntax has these named arguments:

*Part Description* 
appname _Required_	String expression containing the name of the application orproject whose key settings are requested. 
section _Required_	String expression containing the name of the section whose key settings are requested. GetAllSettings returns aVariant whose contents is a two-dimensional array of strings containing all the key settings in the specified section and their corresponding values. 

Once GetAllSettings executes and returns a two dimensional array, we can use the Lbound and Ubound functions, in conjunction with a For-Next Loop to move through the elements of the Array and display them as shown in the code below


vb Code:
Private Sub Command2_Click()    Dim MyAppSettings As Variant, i As Long        MyAppSettings = GetAllSettings("MyApp", "Startup")        '~~> Loop through the array    For i = LBound(MyAppSettings, 1) To UBound(MyAppSettings, 1)        '~~> Display the values in the array        MsgBox MyAppSettings(i, 0), MyAppSettings(i, 1)    Next iEnd Sub

----------


## Siddharth Rout

Assuming that you haven't deleted the key that we created above, lets now try to find the key we created.

Like I mentioned above, Visual Basic, by default using GetSetting and SaveSetting allows reading and writing only to the VB and VBA Programs key under HKEY_Current_User\Software.

Create a form and place a Text Box and a Command Button in it. Place the code in the general declaration of the form.


vb Code:
Private 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 Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As _Long Const KEY_READ = &H20019Const HKEY_CURRENT_USER = &H80000001 '~~> Return True if a Registry key existsFunction CheckRegistryKey(ByVal hKey As Long, ByVal KeyName As String) As Boolean    Dim handle As Long    '~~> Try to open the key    If RegOpenKeyEx(hKey, KeyName, 0, KEY_READ, handle) = 0 Then        '~~> The key exists        CheckRegistryKey = True        '~~> Close it before exiting        RegCloseKey handle    End IfEnd Function Private Sub Command1_Click()'~~> Visual Basic, by default using GetSetting and SaveSetting allows reading and'~~> writing only to the VB and VBA Programs key under HKEY_Current_User\Software.    Dim strSubKey As String    strSubKey = Trim(Text1.Text)    '~~> will return True if it exists    MsgBox CheckRegistryKey(HKEY_CURRENT_USER, strSubKey)End Sub

Run the Form and type *"Software\VB and VBA Program Settings\MyApp"* in the Text Box. Once done, click the Command Button. you will get the message "True" if the key exists or "False" if it doesn't.

----------


## Siddharth Rout

I have mentioned the constants for the hives in the Windows Registry so that you can experiment if you want to...


vb Code:
'~~> Constants for the Registry Hive in case you want to experimentConst HKEY_CLASSES_ROOT = &H80000000Const HKEY_CURRENT_USER = &H80000001Const HKEY_LOCAL_MACHINE = &H80000002Const HKEY_USERS = &H80000003 '~~> Other Constants for RegCreateKeyExConst REG_OPTION_BACKUP_RESTORE = 4   '<~~ open for backup or restoreConst REG_OPTION_VOLATILE = 1         '<~~ Key isn't preserved if system is rebootedConst REG_OPTION_NON_VOLATILE = 0     '<~~ Key is preserved if system is rebootedConst STANDARD_RIGHTS_ALL = &H1F0000Const SYNCHRONIZE = &H100000Const READ_CONTROL = &H20000Const STANDARD_RIGHTS_READ = (READ_CONTROL)Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)Const KEY_CREATE_LINK = &H20Const KEY_CREATE_SUB_KEY = &H4Const KEY_ENUMERATE_SUB_KEYS = &H8Const KEY_NOTIFY = &H10Const KEY_QUERY_VALUE = &H1Const KEY_SET_VALUE = &H2Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or _KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or _KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))Const KEY_EXECUTE = (KEY_READ)Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or _KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or _KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE)) '~~> The RegCloseKey function releases the handle of the specified key.Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long '~~> The RegDeleteKey function deletes the specified keyPrivate Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _(ByVal hKey As Long, ByVal lpSubKey As String) As Long '~~> The RegCreateKeyEx function creates the specified key. If the key already exists'in the registry, the function opens it.Private 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, _lpSecurityAttributes As Any, phkResult As Long, lpdwDisposition As Long) As Long '~~> The RegOpenKeyEx function opens the specified key.Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _(ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal _samDesired As Long, phkResult As Long) As Long Private Sub Command1_Click()    '~~> Code adapted from APIGuide <~~'    Dim Result As Long        '~~> Check if the specified key "koolsid" exists under HKEY_CLASSES_ROOT    RegOpenKeyEx HKEY_CLASSES_ROOT, "koolsid", 0, KEY_ALL_ACCESS, Result        '~~> If the key doesn't exist, we create it    If Result = 0 Then        '~~> Create a new key under HKEY_CLASSES_ROOT        RegCreateKeyEx HKEY_CLASSES_ROOT, "koolsid", 0, "REG_DWORD", _        REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, ByVal 0&, Result, ret                If Result = 0 Then            MsgBox "Error while creating the Key!!"            Exit Sub        End If        '~~> Inform user that the key has been created        MsgBox "Key Created..."    End If        '~~> Inform user before deleting the key    MsgBox "Deleting the Key..."        '~~> Delete the key    RegDeleteKey Result, ""        '~~> Close the handle    RegCloseKey ResultEnd Sub

----------


## Siddharth Rout

Based on Article by Microsoft.Com....

Using API functions to programmatically find keys in the system registry. The sample demonstrates searches of root subkeys for specified text strings. An option to perform case-sensitive text search is also available.

The example uses the RegEnumKeyEx API function to enumerate subkeys of a specified open registry key. The function retrieves information about one subkey each time it is called.

----------


## Siddharth Rout

Please note that all these API's have been extensively covered in http://allapi.mentalis.org/agnet/apiguide.shtml and hence I will not cover them here. However if you have any questions then refer to Summary in the next post...

*RegCloseKey*
The RegCloseKey function releases the handle of the specified key.

*RegCreateKey*
The RegCreateKey function creates the specified key. If the key already exists in the registry, the function opens it. This function is provided for compatibility with Windows version 3.1. Win32-based applications should use the RegCreateKeyEx function.

*RegCreateKeyEx*
The RegCreateKeyEx function creates the specified key. If the key already exists in the registry, the function opens it.

*RegDeleteKey*
Windows 95: The RegDeleteKey function deletes a key and all its descendents.
Windows NT: The RegDeleteKey function deletes the specified key. This function cannot delete a key that has subkeys.

*RegDeleteValue*
The RegDeleteValue function removes a named value from the specified registry key.

*RegEnumKeyEx*
The RegEnumKeyEx function enumerates subkeys of the specified open registry key. The function retrieves information about one subkey each time it is called.

*RegEnumValue*
The RegEnumValue function enumerates the values for the specified open registry key. The function copies one indexed value name and data block for the key each time it is called.

*Edit: 18/06/2010*

*RegCreateKey*, *RegCloseKey* and *RegDeleteKey* covered in this thread...

http://www.vbforums.com/showthread.php?t=618594

----------


## Siddharth Rout

Interacting with the registry is way too simple then what the grapevine says about it  :Alien Frog: 

However you need to be careful while working with the registry. Always ensure that you backup the registry before you write to it and you will be fine  :Smilie: 

If you have something useful to add to this thread then please be my guest *but please do not use this thread to ask questions*. Create a thread in the vb6 forum and send me a pm. I will definitely help, if I can. 

*Hope you enjoy this tutorial as much as I did creating it.*

----------


## Spoo

Kool

Registry stuff is all greek to me, so I read your *Caution* in
post #1 and took it to heart. 

I like the fact that you begin with *Backing up the Registry*
in post #2 ... nicely sprinkled with screen shots.

But, here's my beef.. there does not seem to be a *Restoring
the Registry* post.

For a newbie like me, it would be reassuring to see that
subject discussed.  I might then have more confidence
to proceed onward and upward.

Spoo

----------


## Siddharth Rout

Could you explain a little more on "Restoring the Registry" and I will update that here as well  :Smilie:

----------


## Spoo

Kool

Sure.  It may be covered in the Writing to Registry section, but ..
Let's say, per your *BackUp* section, I created *MyBackup101.reg*I then do some stuff to registryHow would I *Restore* the registry using *MyBackup101.reg?*

It must be a simple process, but, like I said, I'm a newbie regarding
this stuff. A few words about that specific task would be helpful.

Spoo

----------


## Siddharth Rout

In the 3rd picture in post 2 where you click on "Export", right above it is the Import Button. Simply click that and select you file "MyBackup101.reg" and click 'Ok'. That's it  :Smilie:

----------


## Spoo

Kool

D'oh!!
Like I said, it must be a simple process!  Who knew?
Thanks

Spoo

----------


## xavierjohn22

Why is this one returning stripped out handle in X64 OS?
Thanks.

http://www.vbforums.com/showthread.p...04#post3859104

----------


## Tobiasgar

Not sure about the answer.. but i know that  Visual Basic 6 is great programming language!! coolest one)) i'm learning it for a month..hope will be successful :Eek Boom:

----------


## dexjel140503

just one question, in what exact part of the registry is the created one goes? i tried this code and it actually works however i'm searching my registry and i think it does not see the created one.

----------

