Använda registret från VB del 1
Förord
Efter förfrågningar i forumet så bestämde jag mig för att skriva den här kursen om hur man använder registret från VB. Om du har några frågor så är du välkommen att kontakta mig via e-mail på erik@alfafish.com.Innehåll
»»
»
»
»
Vad är registret?
Jag tänkte att innan man börjar att arbeta med registret så kan det vara bra att veta lite om hur det är uppbyggt. Här följer därför en liten introduktion.Till att börja med så ska du starta Regedit (Start - Kör - 'regedit' - enter) så att du lättare kan hänga med när jag förklarar. Registret är som du ser i Regedit uppbyggt av ett litet antal huvudnycklar (HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE m m). Under huvudnycklarna fins det ett mycket större antal vanliga nycklar (eng. keys). Under nycklarna finns det i sin tur värden (eng. values) som kan vara av tre typer. Den antagligen vanligaste nyckeltypen är sträng. Den kan precis som vanliga strängar i VB hålla text. Nästa nyckeltyp är DWORD som kan hålla ett heltal upp till ca 2.5 miljarder. Den sista typen är binärdata som kan innehålla t ex ett standarddokument eller någon annan form av binär information.
Det finns två sätt att komma åt registret från VB. De inbyggda funktionerna GetSetting och SaveSetting som jag inte kommer att gå igenom här eftersom de är så inflexibla. Den andra metoden, API metoden, är den som jag ska gå igenom. API metoden är lite mer avancerad men den är mycket mer flexibel.
Öppna nycklar
Innan man kan t ex läsa information från ett värde så måste man öppna nyckeln som värdet ligger i och få ett handtag (eng. handle) till den. Det kan man göra med två API funktioner, RegOpenKeyEx och RegCreateKeyEx. Skilnaden är att RegCreateKeyEx skapar nyckeln om den inte finns, det gör inte RegOpenKeyEx. Vilken funktion man vill använda beror till stor del på vad man ska göra.
RegOpenKeyEx
Så här ser deklarationen av RegOpenKeyEx ut:
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
Den första parametern, hKey, är ett standardhandtag till en av huvudnycklarna. hKey kan ha något av följande värden:
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 HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Nästa parameter, lpSubkey, är namnet på den nyckel som du vill öppna. T ex "Software\Låtsasföretaget\Skojprogrammet\Inställningar"
ulOptions har ingen funktion och ska vara satt till 0.
samDesired anger vilka läs och skriv rättigheter man ska ha på nyckeln. samDesired kan ha något av följande värden:
Public Const KEY_ALL_ACCESS = &HF003F
Public Const KEY_CREATE_LINK = &H20
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_EXECUTE = &H20019
Public Const KEY_NOTIFY = &H10
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_READ = &H20019
Public Const KEY_SET_VALUE = &H2
Public Const KEY_WRITE = &H20006
phkResult fylls med handtaget till den öppnade nyckeln.
Funktionen retunerar 0 om den lyckades.
Denna kod skulle kunna användas för att öppna nyckeln HKEY_CURRENT_USER\Software\Hej\På\Dig med full access och spara handtaget i hRegKey:
Dim hRegKey As Long
Dim r As Long
r = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Hej\På\Dig", 0, KEY_ALL_ACCESS, hRegKey)
If r <> 0 Then
MsgBox "Fel!!!"
End
End If
RegCreateKeyEx
Nu ska vi ta en titt på deklarationen RegCreateKeyEx.
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
Det mesta ser lika dant ut som vid RegOpenKeyEx. hKey, lpSubKey och samDesired är precis lika som förut. Nu ska vi ta och titta lite närmare på de andra parametrarna.
Reserved är reserverad för framtida bruk men ska alltid sättas till 0.
lpClass är ett klassnamn för nyckeln, fungerar bra med en tom sträng.
dwOptions skall du normalt sätta till 0, sätter du den till 1 så försvinner nyckeln när Windows startas om.
lpSecurityAttributes är av typen SECURITY_ATTRIBUTES, så först måste vi deklarera den.
Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
lpSecurityAttributes fungerar bara på WinNT och eftersom jag bara har 98 så har jag alldrig satt mig in i hur den fungerar. I vilket fall så ska man sätta nLegth till storleken på variabeln, lpSecurityDescriptor till 0 och bInheritHandle till True.
Den sista parametern, lpdwDisposition, får värdet 1 om en ny nyckel skapades och 2 om en gammal öppnades.
På samma sätt som RegOpenKeyEx så returnerar funktionen 0 om den lyckades.
Koden för att öppna HKEY_CURRENT_USER\Software\Hej\På\Dig med full access och spara handtaget i hRegKey med RegCreateKeyEx skulle kunna se ut så här:
Dim hRegKey As Long
Dim r As Long
Dim SecAttrib As SECURITY_ATTRIBUTES
Dim NyEllerGammal As Long
With SecAttrib .nLength = Len(SecAttrib)
.lpSecurityDescriptor = 0
.bInheritHandle = True
End With
r = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\Hej\På\Dig", 0, "", 0, KEY_ALL_ACCESS, SecAttrib, hRegKey, NyEllerGammal)
If r <> 0 Then
MsgBox "Fel!!!"
End
Else
If NyEllerGammal = 1 Then
MsgBox "Ny nyckel"
ElseIf NyEllerGammal = 2 Then
MsgBox "Gammal nyckel"
End If
End If
Stänga nycklar
Efter att man har använt nyckeln som man har öppnat så ska man stänga den. Stänga en nyckel gör man med RegCloseKey.
Declare Function RegCloseKey Lib "advapi32.dll" ( _
ByVal hKey As Long) _
As Long
Som du ser så är deklarationen av RegCloseKey väldigt enkel, bara en parameter. För att stänga en nyckel så sätter man helt enkelt hKey till ett nyckelhandtag som man fick när man öppnade nyckeln. Om funktionen returnerade 0 så lyckades den.
På nästa lektion så ska jag lära er att läsa och skriva värden och ta bort såväl nycklar som värden.
0 Kommentarer