Skriv och läs från ini-filer samt registret
Förord
Denna kurs visar hur du kan skriva och läsa av värden i Ini-filer och Windowsregistret. Tillvägagångssätten att arbeta med ini-filer och registret är i stort sett likvärdiga.Innehåll
»»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
Introduktion
När man vill lagra värden så kan man med fördel använda sig av Windowsregistret eller s k ini-filer. En ini-fil är egentligen en vanlig textfil men där man kan lagra värden hierarkiskt med hjälp av Windows API. Precis som i registret struktureras informationen med en toppnyckel och under denna en eller flera undernycklar. I den lägsta nivån kan man sedan lagra sitt önskade värde. Till de kodexempel som jag kommer att demonstrera finns det en modul (.bas-fil) att ladda ned där alla funktioner som anropas ligger. Exempelfil (4kb)
Register och Ini-filers API som används
De API-anrop som registret använder sig av ligger i Advapi.dll och Ini-fil API;erna ligger i Kernel32.dll. Både dessa systemfiler finns i systemmappen på din dator. I tabellen nedan listas de API;er som används.
Registret Ini-filer
RegCloseKey GetPrivateProfileInt
RegCreateKeyEx GetPrivateProfileSection
RegDeleteKey GetPrivateProfileString
RegDeleteValue WritePrivateProfileString
RegEnumValue
RegOpenKeyEx
RegQueryValueEx
RegSetValueEx
Beskrivning av funktionerna
I den bifogade modulen finns det funktioner för att skriva värden och läsa av värden både från registret och en ini-fil. Alla funktioner returnerar noll om de lyckas, i annat fall ett icke-nollvärde. De exempel i denna artikel returnerar dock ett värde. Här beskrivs de funktioner som används.
Funktionsnamn Beskrivning
fReadValue Läser ett string, binary eller integer-värde från registret eller ett string-värde från en ini-fil. fWriteValue Skriver ett string, binary eller integer-värde till registret eller ett string-värde till en ini-fil. Om inte sökvägen i registret eller ini-filen existerar så skapas den.
fEnumValue Räknar upp alla string, dword och binary-värden i en undernyckel i registret eller alla värden i aktuell sektion i ini-filen.
fEnumKey Räknar upp alla undernycklar under aktuell huvudnyckel.
fDeleteKey Raderar en undernyckel i registret. Nyckeln kan inte ha några ytterligare undernycklar.
fDeleteValue Raderar ett värde från registret eller en ini-fil.
fReadIniFuzzy Raderar ett string-värde från en ini-fil där bara en del av sektionsnamnet är känt.
Gemensamma parametrar
För att kunna demonstrera ett exempel så har jag valt att döpa de olika parametrarna enligt följande. sTopKeyOrIniFile
Kan vara en av de strängvärden som representerar huvudnyckeln i registret.
I tabellen nedan listas förkortningarna av toppnivåerna av registernycklarna.
Förkortning Toppnivånyckel
HKCU HKey Current User
HKLM HKey Local Machine
HKU HKey User
HKDD HKey Dynamic Data
HKCC HKey Current Configuartion
HKCR HKey Classic Root
När det gäller ini-filer så representeras sTopKeyOrIniFile av den fullständiga sökvägen till ini-filen, t ex C:\Windows\MinFil.ini.
sSubKeyOrSection
Kan vara något av följande strängvärden:
En undernyckel i registret
Ett sektionsnamn i ini-filen
sValueName
Kan vara något av följande strängvärden:
Ett värdenamn i registret
Ett värdenamn i ini-filen
sValueType
Kan vara något av följande strängvärden:
S för ett strängvärde i register eller inifils-operationer
B för ett 16-bitars binärt värde
D för ett 32-bitars talvärde (dword)
vDefault
Ett standardvärde som returneras om inget annat värde finns angivet.
vValue
Ett strängvärde, talvärde eller binärt värde.
Exempel på registerhierarki
Så här ser registerhierarkin ut som vi kör som en demonstration i denna artikel. HKey_Current_User
\Software
\Företag1
\Produktnamn
\AppNamn
\Setting1 = "String1"
\Setting2 = "String2"
\Setting3 = True
\Setting3 = 12345
\AppVersion
\(default) = "String1"
\Företag2
\Företag3
Exempel på en ini-fil
Upplägget i ini-filen som vi skall arbeta med ser ut så här. Sökvägen till ini-filen är C:\Windows\MinFil.ini [Section1]
Setting1=String1
Setting2=String2
Setting3=5
[Section Name]
Setting4=String4
Setting5=String5
Setting6=6
Hämta ett enstaka värde från registret
För att kunna hämta ett enstaka värde från registret så anropas funktionen fReadValue i .bas-filen. Syntaxen för denna ser ut så här.
Function fReadValue(ByVal sTopKeyOrFile As String, _
ByVal sSubKeyOrSection As String, ByVal sValueName As String, _
ByVal sValueType As String, ByVal vDefault As Variant, _
vValue As Variant) As Long
Exemplet nedan hämtas ett strängvärde från Setting1 och lagrar det i variabeln sSetting. Finns det inget värde så returneras standardvärdet som i detta exempel är "No Name".
Call fReadValue("HKCU", "Software\Företag1\ProductName\AppName", _
"Setting1", "S", "No Name", sSetting)
Hämta ett enstaka värde från en ini-fil
För att utföra samma operation från en ini-fil kan syntaxen se ut så här.
Call fReadValue("C:\Windows\Minfil.ini", "Section1", "Setting1", "S", _
"No Name", sSetting)
Hämta ett binärt värde från registret
Exemplet hämtar ett binärt värde (True|False) i Setting3 från vår registerhierarki.
Call fReadValue("HKCU", "Software\Företag1\ProductName\AppName", _
"Setting3", "B", False, bSetting)
Hämta ett binärt värde från en ini-fil
Exemplet hämtar ett dword-värde från Setting4 i vår ini-fil.Standardvärdet är 100.
lResult = fReadValue("C:\Windows\Myfile.ini", "Section1", "Setting3", "D", _
"0", iSetting)
Hämta ett talvärde från en ini-fil
Exemplet hämtar ett tal-värde från vår ini-fil och kontrollerar returvärdet.
lResult = fReadValue("C:\Windows\Myfile.ini", "Section1", "Setting3", "B", _
"0", iSetting)
if lResult <> 0 then...
Skriva ett enstaka värde
För att skriva in värden till registret eller en ini-fil måste funktionen fWriteValue anropas. Precis som för fReadValue så ligger även denna i den bifogade bas-filen. Syntaxen för fWriteValue ser ut så här.
Function fWriteValue(ByVal sTopKeyOrFile As String, _
ByVal sSubKeyOrSection As String, ByVal sValueName As String, _
ByVal sValueType As String, ByVal vValue As Variant) As Long
Skriva ett strängvärde till registret
Nedanstående exempel skriver strängen String1 till Setting1 i vårt register.
Call fWriteValue("HKCU", "Software\Företag1\ProductName\AppName",_
"Setting1", "S", "String1")
Skriva ett strängvärde till en ini-fil
Nedanstående exempel skriver strängen String2 till Setting2 till vår ini-fil.
lResult = fWriteValue("C:\Windows\MinFil.ini", "Section1", "Setting2", _
"S", "String2")
Skriva ett binärt värde till registret
Nedanstående exempel skriver ett binärt värde (True|False) till Setting3 till vår ini-fil.
bValue = True
Call fWriteValue("HKCU", "Software\CompanyName\ProductName\AppName",_
"Setting3", "B", bValue)
Notera att funktionen fWriteValue skapar en registernyckel om en sådan inte finns.
Notera också att fWriteValue för ini-filer bara klarar av att skriva strängvärden.
Exempel på att räkna upp värden
Hittills har vi kört exempel för att hämta eller skriva enstaka värden till register och ini-filer. Ibland kan behovet finnas att räknas upp alla värden som finns i t ex en registernyckel eller en sektion i en ini-fil. Funktionen som anropas för detta ändamål heter fEnumValue och finns också som en del i den bifogade bas-filen.
Public Function fEnumValue(ByVal sTopKeyOrIniFile As String, _
ByVal sSubKeyOrSection As String, sValues As String) As Long
Hämta alla värden under en registernyckel
Detta exempel hämtar alla värden som finns i registernyckeln AppName i vårt exempelregister.
Call fEnumValue("HKCU","Software\CompanyName\ProductName\AppName", _
sValues)
Variabeln sValues kommer att innehålla alla värden avgränsade med tecknet "|", enligt följande.
"Setting1=String1|Setting2=String2|Setting3=True||"
Hämta alla värden under en sektion
Detta exempel hämtar alla värden som finns under [Sektion1] i vår ini-fil..
Call fEnumValue("C:\Windows\Minfil.ini", "Section1", sValues)
Variabeln sValues innehåller samma värden som i exemplet för registret.
Räkna upp alla registernycklar
Detta exempel räknar upp alla undernycklar som finns under HKCU\Software.
Call fEnumKey("HKLM", "Software", sValues)
Variabeln sValues kommer att innehålla "Företag1|Företag2|Företag3||"
Radera registernycklar
Det finns också funktioner för att radera registernycklar. Funktionen som anropas heter fDeleteKey och syntaxen för denna funktion ser ut så här.
Public Function fDeleteKey(ByVal sTopKey As String, _
ByVal sSubKey As String, ByVal sKeyName As String) As Long
De parametrar som används i denna funktion är...
sSubKey - som innehåller sökvägen till den registernyckel som skall raderas.
sKeyName - som är namnet på den registernyckel som skall raderas.
Följande exempel raderar registernyckeln Appname.
Call fDeleteKey("HKCU","Software\CompanyName\ProductName\AppName", _
"AppName")
Observera att toppnyckeln (HKCU,..) under inga omständigheter kan raderas. Registernycklar som raderas kan inte heller ha några undernycklar utan dessa måste i så fall tas bort först.
Radera värden
Det är säkert viktigare att kunna ta bort värden än att ta bort en undernyckel i registret och naturligtvis finns det API-funktioner även för detta. Funktionen heter fDeleteValue och dess syntax ser ut så här.
Public Function fDeleteValue(ByVal sTopKeyOrFile As String, _
ByVal sSubKeyOrSection As String, ByVal sValueName As String) _
As Long
Radera ett värde i registret
Följande rad raderar värdet under Setting3 i vårt register.
Call fDeleteValue("HKCU","Software\CompanyName\ProductName\AppName",_
"Setting3")
Radera ett värde i en ini-fil
Följande rad raderar värdet under Setting3 i MinFil.ini.
Call fDeleteValue("C:\Windows\Myfile.ini", "Section1", "Setting3")
Hämta värden där del av sektion är känd
Som vi var inne på i början av denna artikel finns det även en funktion för att ta bort värden ur en ini-fil där endast en del av sektionsnamnet är känt. Funktionen heter fReadIniFuzzy och syntaxen för denna ser ut som följer.
Public Function fReadIniFuzzy(ByVal sIniFile As String, sSection As String, _
ByVal sIniEntry As String, ByVal sDefault As String, _
sValue As String) As Long
De parametrar som används i denna funktion är...
sIniFile - som innehåller sökvägen till ini-filen.
sSection - är namnet på sektionen i ini-filen som skall letas upp. Notera att det bara kan vara hela namn t ex Section eller Name i [Section Name]. Inte bara Sect eller ame.
sIniEntry - Namnet på inställningen som representerar värdet.
sDefault - Ett standardvärde som kan returneras.
SValue - Det strängvärde som hämtasom sDefault misslyckas.
Hämta värden från en sektion där bara en del av namnet på sektionen är angiven
Exemplet nedan hämtar värdet från Setting4 från [Section Name].
lResult = fReadIniFuzzy("C:\Windows\Myfile.ini", "Name", Setting4, sValue)
Resultatet av detta blir...
lResult = 0
lSection = "Section Name"
SValue = "String4"
0 Kommentarer