Kirjoittaja: Antti
Kirjoitettu: 19.01.2003 – 19.01.2003
Tagit: koodi näytille, vinkki
Kyseessä on keskustelupalstalla mainittu rekisteristä luku ja rekisteriin kirjoittaminen.
VB:n sisäinen SaveSetting ja GetSetting lukee ja tallentaa arvot vain HKEY_CURRENT_USER avaimen alle, joka saataa käyttäjän vaihtuessa olla lukemattomissa.
Alla oleva listaus mahdollistaa avaimen lukemisen ja kirjoittamisen mihin tahansa avaimeen.
Luo moduli tai luokkakirjasto(ActiveX.dll) kopioi koodi ja käännä.
' Paluu arvo
Dim vValue As Variant
' Rekisteriavaimen tietotyyppi
Private Const REG_SZ As Long = 1
Private Const REG_DWORD As Long = 4
' Avainpuun juuren konstantit
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const HKEY_CURRENT_USER = &H80000001
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_USERS = &H80000003
' Virhe konstantit - vain muutama käytössä.
Private Const ERROR_NONE = 0
Private Const ERROR_BADDB = 1
Private Const ERROR_BADKEY = 2
Private Const ERROR_CANTOPEN = 3
Private Const ERROR_CANTREAD = 4
Private Const ERROR_CANTWRITE = 5
Private Const ERROR_OUTOFMEMORY = 6
Private Const ERROR_ARENA_TRASHED = 7
Private Const ERROR_ACCESS_DENIED = 8
Private Const ERROR_INVALID_PARAMETERS = 87
Private Const ERROR_NO_MORE_ITEMS = 259
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Private Const KEY_ALL_ACCESS = &H3F
Private Const REG_OPTION_NON_VOLATILE = 0
' Sulkee avatun rekisteriavaimen
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
' Luo uuden rekisteriavaimen
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, ByVal lpSecurityAttributes _
As Long, phkResult As Long, lpdwDisposition As Long) As Long
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias _
"RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubkey As String, _
phkResult As Long) As Long
' Avaa olemassaolevan rekisteriavaimen
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
' Lukee string-tyyppisen arvon avaimesta
Private 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
' Lukee long-tyyppisen arvon avaimesta
Private 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
' Käytetään tutkimaan onko arvo luettavan tyyppinen
Private 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
' Kirjoittaa string-tyyppisen arvon avaimeen
Private 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
' Kirjoittaa long-tyyppisen arvon avaimeen
Private 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
'***********************************************************************************
' Metodi: SetKeyValue
' Tarkoitus: Julkinen rajapinta-funktio rekisteriarvon kirjoittamiselle / päivittämiselle
' Kuvaus: Luo uuden rekisteriavaimen/Päivittää rekisteriavaimen arvon
' Käyttö: strKeyValue=QueryValue("MySoftware/MySubKey","MyKey","MyValue")
' Paluuarvo: String
'***********************************************************************************
Public Function SetKeyValue(sKeyName As String, sValueName As String, vValueSetting As Variant, lValueType As Long) As Boolean
Dim lRetVal As Long ' Tulos SetValueEx-funktiosta.
Dim hKey As Long ' Hanska avattavalle avaimelle.
Dim keyExists As Boolean ' Onko avain olemassa vai pitääkö se luoda?
On Error GoTo ErrHandler:
' Lisätty "pakote" avaimen lukemisesta tiettystä hakemistosta.
' Voidaan kommentoida pois tarvittaessa
sKeyName = "Software\" & sKeyName
'CheckForKey palauttaa true jos polku löytyy
keyExists = CheckForKey(sKeyName)
' Jos avainta ei löydy...
If keyExists = False Then
'...luodaan uusi avain
CreateNewKey sKeyName
End If
'Avain löytyy - siispä avataan se
lRetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, sKeyName, 0, KEY_SET_VALUE, hKey)
' Kirjoitetaan arvo
lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)
' Suljetaan avain
RegCloseKey (hKey)
' Palautetaan true onnistumisen merkiksi
SetKeyValue = True
Exit Function
ErrHandler:
' Palautetaan false, koska jotain meni pieleen
SetKeyValue = False
End Function
'***************************************************************************************
' Metodi: QueryValue
' Tarkoitus: Julkinen rajapinta-funktio rekisteriarvon lukemiselle
' Kuvaus: Lukee rekisteristä parametrinä
' annetun rekisteriavaimen arvon
' Käyttö: strKeyValue=QueryValue("MySoftware/MySubKey","MyKey")
' Parametrit: sKeyName - Avaimen hakemistopolku muotoa:"AvainHakemisto
' /AvainAliHakemisto/AvainAliHakemisto"
' sValueName - Avaimen nimi muotoa:"OmaAvain"
' Paluuarvo: String
' Huomioitavaa: Käsittelee avaimia vain HKEY_LOCAL_MACHINE - pääavaimen alla.
' Jos halutaan muutettavaksi muualle käytetaan seuraavia konstantteja:
' HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS
'***************************************************************************************
Public Function QueryValue(sKeyName As String, sValueName As String) As String
Dim lRetVal As Long ' API-funktion paluuarvo
Dim hKey As Long ' Avattavan avaimen hanska
Dim vValue As Variant ' Luettu paluuarvo
On Error GoTo ErrHandler
' Lisätty "pakote" avaimen sijoittamiseksi tiettyyn hakemistoon.
' Voidaan kommentoida pois tarvittaessa
sKeyName = "Software\" & sKeyName
' Avataan rekisteriavain
lRetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, sKeyName, 0, KEY_QUERY_VALUE, hKey)
' Luetaan arvo
lRetVal = QueryValueEx(hKey, sValueName, vValue)
' Suljetaan avain
RegCloseKey (hKey)
' Asetetaan paluuarvo
QueryValue = vValue
Exit Function
ErrHandler:
' Palautetaan null koska arvoa ei voitu lukea
' Tähän muun tyyppinen virheen käsittely tarvittaessa
QueryValue = vbNullString
End Function
'***************************************************************************************
' Metodi: SetValueEx
' Tarkoitus: Sisäinen funktio rekisteriarvon kirjoittamiseksi tyyppikohtaisesti
' Kuvaus: Tutkii kirjoitettavan arvon tyypin ja kutsuu sen
' perusteella tyyppiä vastaavaa API-kutsua.
'***************************************************************************************
Private 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
' Kirjoita string
Case REG_SZ
sValue = vValue & Chr$(0)
SetValueEx = RegSetValueExString(hKey, sValueName, 0&, _
lType, sValue, Len(sValue))
' Kirjoita Long
Case REG_DWORD
lValue = vValue
SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, _
lType, lValue, 4)
End Select
End Function
'***************************************************************************************
' Metodi: QueryValueEx
' Tarkoitus: Sisäinen funktio rekisteriarvon lukemiseksi tyyppikohtaisesti
' Kuvaus: Tutkii luettavan arvon tyypin ja palauttaa sen variantissa.
'***************************************************************************************
Private 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
'Päättele luettavan datan tyyppi
lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
' Jos virheitä syntyy - poistu
If lrc <> ERROR_NONE Then Error 5
' Lue tyypin perusteella rekisteriarvo
Select Case lType
'String
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
'DWORDS - eli long
Case REG_DWORD:
lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, _
lValue, cch)
If lrc = ERROR_NONE Then
vValue = lValue
End If
Case Else
'Muita datatyyppejä ei tueta!
lrc = -1
End Select
QueryValueExExit:
QueryValueEx = lrc
Exit Function
QueryValueExError:
Resume QueryValueExExit
End Function
'***************************************************************************************
' Metodi: CreateNewKey
' Tarkoitus: Sisäinen funktio rekisteriavaimen luomiseksi
'***************************************************************************************
Private Function CreateNewKey(sNewKeyName As String) As Boolean
Dim hNewKey As Long ' Hanska uuteen avaimeen
Dim lRetVal As Long ' RegCreateKeyEx funktion tulos
' Kutsu API-funktiota
lRetVal = RegCreateKeyEx(HKEY_LOCAL_MACHINE, sNewKeyName, 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0&, hNewKey, lRetVal)
' Sulje luotu avain - se avataan uudelleen myöhemmin
RegCloseKey (hNewKey)
End Function
'***************************************************************************************
' Metodi: CheckForKey
' Tarkoitus: Sisäinen funktio rekisteriavaimen olemassaolon tutkimiseksi
'***************************************************************************************
Private Function CheckForKey(strKey As String) As Boolean
Dim iRet As Long
' Yritä avata avain
iRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strKey, 0, KEY_QUERY_VALUE, hKey)
' Tutkitaan onnistuiko avaaminen
If iRet = 0 Then
' Onnistui
CheckForKey = True
' Suljetaan avain
RegCloseKey (hKey)
Else
' Epäonnistui
CheckForKey = False
End If
End FunctionSultahan pitkiä koodeja tulee :D
Jälleen vinkki sarjassa erittäin mojovat!!
Mihin toi rekisterinavain oikee menee ja millä nimellä? Saattaa olla, etten jotenki saanu vaa toimii sitä tai sitte en tiiä mihin toi tekee sen avaimen...
valitse suorita ja kirjoita siihen regedit.
lisää tohon vielä rekisteristä poisto.
Kun tuossa on tuo uuden rekisterin luonti, niin missä kohtaa siinä valitaan se minne se menee ja minkä arvon se antaa sille? Mieluusti selvä!
*** Lisäys edelliseen ***
Esim. miten saan luotua rekisteriin
HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\
sellaisen rekisteri avaimen, joka on merkkijono ja sisältää arvon "tiedosto.exe" ja sen nimi on vaikkapa tiedostoStartti
lainaus:
*** Lisäys edelliseen ***
Esim. miten saan luotua rekisteriin
HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\
CurrentVersion\Run\ sellaisen rekisteri avaimen, joka on merkkijono ja sisältää arvon "tiedosto.exe" ja sen nimi on vaikkapa tiedostoStartti
Tuosta koodista pitäisi onnistua seuraavasti:
1.) Kopioi koodi ohjelmaasi
2.) Muuta funktion SetKeyValue kohtaa, jossa lukee
'Avain löytyy - siispä avataan se lRetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, sKeyName, 0, KEY_SET_VALUE, hKey)
siten, että se näyttää seuraavalta:
'Avain löytyy - siispä avataan se lRetVal = RegOpenKeyEx(HKEY_USERS, sKeyName, 0, KEY_SET_VALUE, hKey)
3.)Kutsu funktiota esimerkiksi seuraavasti
SetKeyValue(".DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run", "tiedostoStartti", "tiedosto.exe", 1)Esimerkki asettaa tiedostoStartti- nimisen avaimen arvoksi "tiedosto.exe" ja tämä tiedosto suoritetaan kun windows käynnistyy. Todellisuudessa "tiedosto.exe" ei kuitenkaan sellaisenaan kelpaa, vaan arvon on oltava esimerkiksi "C:\Tiedosto.exe"