VB4all - 100 sampli, 50 tipsow, OCX, forum i wiele innych atrakcji

Zabawa z rejestrem

Kiedy£ opisywa│em, jak mo┐na za pomoc╣ wbudowanych funkcji w VB bawiµ siΩ rejestrem. Jednak wbudowane funkcje VB s╣ ograniczonem, tj. mo┐emy operowaµ tylko ograniczon╣ czΩ£ci╣ rejestru i nie mo┐emy robiµ super zag│Ωbionych kluczy. Jesli piszemyy ma│╣ aplikacyjkΩ, to wystarcz╣ nam wbudowane funkcje, ale pisz╣c wiΩksz╣ aplikacjΩ trzeba bΩdzie uciec siΩ do API. Pe│na kontrola nad rejestrem ma wiele zalet : ja np. napisa│em programik kt≤ry umo┐liwia skonfigurowaµ Internet Explorer, ale ten program operuje na takich opcjach, kt≤re nie s╣ dostΩpne z przegl╣darki (np. mo┐liwo£µ zmiany tyu│u programu). Jak taki program napisa│em ??? Najpierw musia│em grzebaµ w rejestrze. Po tym napisa│em pro£ciutki program. Pewnie te┐ masz zamiar napisaµ taki program ??? po przeczytaniu tego textu nie bΩdziesz mia│ z tym problem≤w !!! Wszystkie materia│y zaczerpno│em z VBFAQ

Tutaj mo┐esz £ci╣gn╣µ program, kt≤ry u│atwi Ci zrozumienie tego textu.

1. Deklaracja funkcji API
Zanim zaczniemy siΩ bawiµ rejestrem musimy zadeklarowaµ odpowiednie funkcje API. Oto kod kt≤ry nale┐y wpisaµ (nalepiej w nowym) module.

Option Explicit

Public Const HKEY_CURRENT_USER = &H80000001
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_CREATE_LINK = &H20
Public Const STANDARD_RIGHTS_ALL = &H1F0000
Public Const SYNCHRONIZE = &H100000
Public 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))

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 REG_OPTION_NON_VOLATILE = 0

Public Const ERROR_SUCCESS As Long = 0
Public Const ERROR_MORE_DATA As Long = 234

Public Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type

Public Declare Function RegCloseKey Lib "advapi32.dll" _
(ByVal hKey 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 String, _
ByVal dwOptions As Long, ByVal samDesired As Long, _
lpSecurityAttributes As SECURITY_ATTRIBUTES, 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 RegDeleteValue Lib "advapi32.dll" Alias _
"RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As _
String) 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
' Je£li parametr lpData bΩdzie typu String, to musi byµ przekazany
' ByVal
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

TrochΩ tego jest ;-)

2 Deklaracje c.d.
W ka┐dej prodedurze, w kt≤rej chcemy co£ zrobiµ z rejestrem, musimy napisaµ te oto deklaracje :
Dim hKey As Long, strKey As String
Dim lRet As Long, lDisp As Long
Dim sa As SECURITY_ATTRIBUTES, lValue As Long
Dim lSize As Long, lType As Long
Dim strValue As String, btValue(2) As Byte
Dim strOut As String, i As Long
Dim hTemp As Long

3. Dodanie klucza
Tej funkcji u┐ywa siΩ do utworzenia/otwarcia klucza. Je£li jednak dany klucz nie istnieje, to zostanie utworzony.
lRet = RegCreateKeyEx(HKEY_CURRENT_USER, "!!!_NOWY_KLUCZ_!!!", 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, sa, hKey, lDisp)
Ta funkcja utworzy w kluczu HKEY CURRENT USER klucz !!!_NOWY_KLUCZ_!!! Da│em tak╣ g│upi╣ nazwΩ, aby mo┐na by│o │atwo zorientowaµ siΩ ┐e to £mieµ.
Je£li chcemy w tym kluczu utworzyµ jak╣£ warto£µ, podklucz lub odczytaµ dan╣ warto£c, to musimy do tego klucza przej£µ (otworzyµ go). Powy┐ej jest ten kod. Je£li nie bΩdziesz otwiera│ danego klucza w kt≤rym chcesz utworzyµ warto£µ, to albo program siΩ zawiesi, albo dana warto£µ zostanie utworzona w nie tym kluczu co trzeba.

4. Dodanie warto£ci liczbowej
Za│≤┐my, ┐e ju┐ utworzyli£my klucz. Dodajmy now╣ warto£µ lcizbow╣, aby£my mogli zapisaµ w rejestrze np. liczbe uruchomie± programu :
'Przej£cie do klucza w kt≤rym chcemy dan╣ warto£µ utorzyµ
lRet = RegCreateKeyEx(HKEY_CURRENT_USER, "!!!_NOWY_KLUCZ_!!!", 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, sa, hKey, lDisp)

lValue = 24 ' nasza warto£µ
lRet = RegSetValueEx(hKey, "Nazwa_wartosci_liczbowej", 0&, REG_DWORD, lValue, Len(lValue))
PamiΩtaj o deklaracjach !!!

5. Dodanie warto£ci textowej
Utworzenie warto£ci textowej nie jest wcale takie trudne :
'Przej£cie do klucza w kt≤rym chcemy dan╣ warto£µ utorzyµ
lRet = RegCreateKeyEx(HKEY_CURRENT_USER, "!!!_NOWY_KLUCZ_!!!", 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, sa, hKey, lDisp)

strValue = "Kocham JolkΩ !!!"
lRet = RegSetValueEx(hKey, "Warto£µ_textowa", 0&, REG_SZ, ByVal strValue, Len(strValue))
strValue to zmienna kt≤ra zawiera warto£µ textow╣ a Watro£µ_textowa to nazwa nowej warto£ci textowej

6. Odczyt warto£ci liczbowej
Pasowa│o by tak odczytaµ jak╣£ warto£µ liczbow╣. Ten kawa│ek kodu to robi :
'Przej£cie do klucza w kt≤rym chcemy dan╣ warto£µ odczytaµ
lRet = RegCreateKeyEx(HKEY_CURRENT_USER, "!!!_NOWY_KLUCZ_!!!", 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, sa, hKey, lDisp)

lValue = 0
lSize = 4
lRet = RegQueryValueEx(hKey, "Nazwa_wartosci_liczbowej", 0&, lType, lValue, lSize)
MsgBox "Wartosc liczbowa wynosi :" & lValue
Je£li podawan warto£µ textowa nie istnieje, to funkcja zwr≤ci 0

7. Odczyt warto£ci textowej
Sprawdƒmy, czy w rejestrze utorzona warto£µ textowa nie zmieni│a siΩ :
'Przej£cie do klucza w kt≤rym chcemy dan╣ warto£µ odczytaµ
lRet = RegCreateKeyEx(HKEY_CURRENT_USER, "!!!_NOWY_KLUCZ_!!!", 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, sa, hKey, lDisp)

strValue = ""
lSize = Len(strValue)
lRet = RegQueryValueEx(hKey, "Warto£µ_textowa", 0&, lType, lValue, lSize)
If lRet = ERROR_MORE_DATA Then
strValue = Space$(lSize)
lRet = RegQueryValueEx(hKey, "Warto£µ_textowa", 0&, lType, ByVal strValue, _
lSize)
If lRet <> ERROR_SUCCESS Then Exit Sub
ElseIf lRet <> ERROR_SUCCESS Then
Exit Sub
End If
MsgBox "Warto£µ ""HKCU\Test\Warto£µ_textowa"" : " & Left$(strValue, _
Len(strValue) - 1)

8. UsuniΩcie warto£ci textowej i liczbowej
Skoro na£miecili£my w rejestrze, pasowa│o by tak zrobiµ porz╣dek. Na szczΩ£cie usuniΩcie warto£ci (dowolnej) to najprostrza instrukcja !!! Oto ona :
'Przej£cie do klucza w kt≤rym chcemy dan╣ warto£µ odczytaµ
lRet = RegCreateKeyEx(HKEY_CURRENT_USER, "!!!_NOWY_KLUCZ_!!!", 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, sa, hKey, lDisp)

lRet = RegDeleteValue(hKey, "Warto£µ_textowa")
lRet = RegDeleteValue(hKey, "Nazwa_wartosci_liczbowej")
Instrukcja ta jest o tyle prosta, ┐e nie patrzy siΩ ona jakiego typu jest dana warto£c, tylko od razu j╣ bez gadania usuwa.

9. Edycja warto£ci liczbowej i textowej
Aby zmieniµ warto£µ warto£ci textowej lub liczbowej, nie musimy siΩ za wiele namΩczyµ. Po prostu robimy to tak samo jak, tworzy siΩ warto£µ liczbow╣, lub textow╣. Nie ma tutaj jakiej£ specjalnej instrukcji do edycji.

10. Inne funkcje
To co tutaj opisa│em, to zaledwie czΩ£µ mo┐liwo£ci. Sam nauczy│em siΩ bawiµ rejestrem, czytaj╣c VBFAQ. By│a tam od razu do│╣czona procedura, kt≤ra bawi│a siΩ rejestrem. Toi z tej procedury siΩ wiele nauczy│em. Poni┐ej publikujΩ t╣ procedurΩ (s╣ tam rzeczy nieopisywane np. tworzenie warto£ci banarnych) :
Private Sub Reg_Test_API()
Dim hKey As Long, strKey As String
Dim lRet As Long, lDisp As Long
Dim sa As SECURITY_ATTRIBUTES, lValue As Long
Dim lSize As Long, lType As Long
Dim strValue As String, btValue(2) As Byte
Dim strOut As String, i As Long
Dim hTemp As Long

'1. utworzenie klucza
lRet = RegCreateKeyEx(HKEY_CURRENT_USER, "Test", 0&, vbNullString, _
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, sa, hKey, lDisp)
If lRet <> ERROR_SUCCESS Then Exit Sub
If lDisp = REG_CREATED_NEW_KEY Then
Debug.Print "Klucz ""HKCU\Test"" nie istnia│."
Else
Debug.Print "Otwarto istniej╣cy klucz ""HKCU\Test""."
End If

'2. utworzenie podklucza
lRet = RegCreateKeyEx(hKey, "PodTest", 0&, vbNullString, _
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, sa, hTemp, lDisp)
If lRet <> ERROR_SUCCESS Then Exit Sub
If lDisp = REG_CREATED_NEW_KEY Then
Debug.Print "Klucz ""HKCU\Test\PodTest"" nie istnia│."
Else
Debug.Print "Otwarto istniej╣cy klucz ""HKCU\Test\PodTest""."
End If

'3. dodanie domy£lnej warto£ci do podklucza
strValue = "xyz"
lRet = RegSetValueEx(hTemp, "", 0&, REG_SZ, ByVal strValue, Len(strValue))
If lRet <> ERROR_SUCCESS Then Exit Sub

'4. utworzenie warto£ci numerycznej
lValue = 24
lRet = RegSetValueEx(hKey, "Test Value 1", 0&, REG_DWORD, lValue, Len(lValue))
If lRet <> ERROR_SUCCESS Then Exit Sub

'5. utworzenie warto£ci napisowej
strValue = "sample value"
lRet = RegSetValueEx(hKey, "Test Value 2", 0&, REG_SZ, ByVal strValue, _
Len(strValue))
If lRet <> ERROR_SUCCESS Then Exit Sub

'6. utworzenie warto£ci binarnej
btValue(0) = 40
btValue(1) = 15
btValue(2) = 255
lRet = RegSetValueEx(hKey, "Test Value 3", 0&, REG_BINARY, btValue(0), _
UBound(btValue) - LBound(btValue) + 1)
If lRet <> ERROR_SUCCESS Then Exit Sub

'7. oczyt warto£ci numerycznej
lValue = 0
lSize = 4
lRet = RegQueryValueEx(hKey, "Test Value 1", 0&, lType, lValue, lSize)
If lRet <> ERROR_SUCCESS Then Exit Sub
Debug.Print "Wartosc ""HKCU\Test\Test Value 1"" : " & lValue

'8. odczyt warto£ci napisowej
strValue = ""
lSize = Len(strValue)
lRet = RegQueryValueEx(hKey, "Test Value 2", 0&, lType, lValue, lSize)
If lRet = ERROR_MORE_DATA Then
strValue = Space$(lSize)
lRet = RegQueryValueEx(hKey, "Test Value 2", 0&, lType, ByVal strValue, _
lSize)
If lRet <> ERROR_SUCCESS Then Exit Sub
ElseIf lRet <> ERROR_SUCCESS Then
Exit Sub
End If
Debug.Print "Warto£µ ""HKCU\Test\Test Value 2"" : " & Left$(strValue, _
Len(strValue) - 1)

'9. odczyt warto£ci binarnej
btValue(0) = 0: btValue(1) = 0: btValue(2) = 0
lSize = UBound(btValue) - LBound(btValue) + 1
lRet = RegQueryValueEx(hKey, "Test Value 3", 0&, lType, btValue(0), lSize)
If lRet <> ERROR_SUCCESS Then
Exit Sub
End If
For i = LBound(btValue) To UBound(btValue)
strOut = strOut & Format(Hex$(btValue(i)), "@@") & " "
Next i
Debug.Print "Warto£µ ""HKCU\Test\Test Value 3"" : " & strOut

'10. odczyt domy£lnej warto£ci (napisowej)
strValue = ""
lSize = Len(strValue)
lRet = RegQueryValueEx(hTemp, "", 0&, lType, lValue, lSize)
If lRet = ERROR_SUCCESS Then
Debug.Print """HKCU\Test\PodTest"" nie ma ustawionej warto£ci domy£lnej."
ElseIf lRet = ERROR_MORE_DATA Then
strValue = Space$(lSize)
lRet = RegQueryValueEx(hTemp, "", 0&, lType, ByVal strValue, lSize)
If lRet <> ERROR_SUCCESS Then Exit Sub
Else
Exit Sub
End If
Debug.Print "Domy£lna warto£µ ""HKCU\Test\PodTest"" : " & strValue

'11. zamkniΩcie podklucza
lRet = RegCloseKey(hTemp)

'12. usuniΩcie warto£ci
' nie jest to konieczne do usuniΩcia klucza
lRet = RegDeleteValue(hKey, "Test Value 1")
If lRet <> ERROR_SUCCESS Then Exit Sub
lRet = RegDeleteValue(hKey, "Test Value 2")
If lRet <> ERROR_SUCCESS Then Exit Sub
lRet = RegDeleteValue(hKey, "Test Value 3")
If lRet <> ERROR_SUCCESS Then Exit Sub

'13. usuniΩcie klucza
' pod Win9x RegDeleteKey usuwa klucz wraz z warto£ciami i podkluczami.
' pod WinNT RegDeleteKey usuwa klucz z warto£ciami, ale nie je£li
' klucz ma podklucze; trzeba je wszystkie usun╣µ "rΩcznie"
lRet = RegDeleteKey(hKey, "")
If lRet <> ERROR_SUCCESS Then
Debug.Print "Klucz ""HKCU\Test"" nie m≤g│ zostaµ usuniΩty."
lRet = RegDeleteKey(HKEY_CURRENT_USER, "Test\PodTest")
If lRet <> ERROR_SUCCESS Then
Debug.Print "Klucz ""HKCU\Test\PodTest"" nie m≤g│ zostaµ usuniΩty."
Else
Debug.Print "Klucz ""HKCU\Test\PodTest"" usuniΩty."
lRet = RegDeleteKey(hKey, "")
If lRet = ERROR_SUCCESS Then
Debug.Print "Klucz ""HKCU\Test"" usuniΩty."
Else
Debug.Print "Klucz ""HKCU\Test"" nie m≤g│ zostaµ usuniΩty."
End If
End If
Else
Debug.Print "Klucz ""HKCU\Test"" usuniΩty."
End If
End Sub

Jelcyn & VBFAQ