VBA und Registry

Liebe ExpertInnen,

aus einer Access-Anwendung heraus schreibe ich in die Registry und stelle fest, dass die Schlüssel unter dem Key „Software\VB and VBA Program Settings“ landen. Ich würde gerne Schlüssel unter „Software\MeineSoftware“ anlegen, finde aber nichts dazu in der Beschreibung von SaveSetting (übrigens auch nicht zu „VB and VBA Program Settings“). Wer weiß was?

Gruß Ralf

Hallo Ralf,

Wer weiß was?

ich weiß nur, wo ich abschreiben würde, versucht habe ich es nocht nicht, habe ich noch nicht gebraucht.

http://www.activevb.de/tipps/vb6tipps/tipp0107.html

Gruß Rainer

aus einer Access-Anwendung heraus schreibe ich in die Registry
und stelle fest, dass die Schlüssel unter dem Key „Software\VB
and VBA Program Settings“ landen. Ich würde gerne Schlüssel
unter „Software\MeineSoftware“ anlegen, finde aber nichts dazu
in der Beschreibung von SaveSetting (übrigens auch nicht zu
„VB and VBA Program Settings“). Wer weiß was?

Hallo Ralf,

Rainer hat ja einen Klasse Link gebracht, wenn der in Access-Vba läuft ist doch alles okay.

Wenn nicht, muß es denn die Registry sein?

In Excel könnte ich mir mittels CustomDocumentProperties in der personl.xls beliebig viele Einträge anlegen und die dann in jeder beliebigen Exceldatei auswerten/verändern.

Du könntest auch irgendwelche Werte in eine Txtdatei schreiben und auf die dann zugreifen.

Ob dir das was für Access bringt, weiß ich nicht.

Gruß
Reinhard

Hallo Ralf, Rainer, Reinhard

wie ich immer mitbekomme haben viele Probleme beim Lesen / Schreiben der Registry. Ich poste mal anbei ein Modul. Kopiere dies einfach in dein Project und schon hast du alle nötigen Prozeduren zur Verfügung!

Es ist unter VB getestet, sollte aber unter VBA auch ihren Dienst machen :smile:

@ Rainer: Vielleicht ist das etwas für die FAQ?

'Aufruf von folgendenden Subs / Functionen sind möglich

 DeleteAutoRun 'Löscht AutoRun Eintrag
 DeleteAutoRunOnce 'Löscht AutoRunOnce Eintrag
 DeleteKey 'Löscht einen Schluessel
 SetAutoRun 'Setzt einen AutoRun Eintrag
 SetAutoRunOnce 'Setzt einen AutoRunOnce Eintrag
 SetValue 'Setzt einen Wert, wobei ueber Typ die Form des Eintrages gesetzt werden kann ( REG\_SZ ,REG\_BINARY ,REG\_DWORD)
 WerteLoeschen 'Löscht einen Wert
 WertLesen 'Liest einen Wert

So nun das Modul :smile:

Option Explicit

Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) 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
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
Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long

Public Enum RegistryData
 zBYTE = 1
 zDWORD = 2
 zSTRING = 3
End Enum

Public Const HKEY\_CURRENT\_USER = &H80000001
Public Const REG\_SZ = 1
Public Const REG\_BINARY = 3
Public Const REG\_DWORD = 4

Public Function SetValue(Key As String, Field As String, vdata As Variant, Typ As RegistryData) As Boolean
On Error GoTo ErrHandler
 Dim tmp As String
 Dim tmp1 As Byte
 Dim tmp2 As Long
 Select Case Typ
 Case 1 'Byte
 tmp1 = CByte(vdata)
 SetValue = StringSpeichernByte(HKEY\_CURRENT\_USER, Key, Field, CStr(tmp1))
 Case 2 'DWORD
 tmp2 = CLng(vdata)
 SetValue = StringSpeichernLong(HKEY\_CURRENT\_USER, Key, Field, tmp2)
 Case 3 'STRING
 tmp = CStr(vdata)
 SetValue = StringSpeichern(HKEY\_CURRENT\_USER, Key, Field, tmp)
 End Select
ErrHandler:
End Function

Private Function StringSpeichern(hKey As Long, sPath As String, sValue As String, iData As String) As Boolean
On Error GoTo ErrHandler
Dim vRet As Variant
 RegCreateKey hKey, sPath, vRet
 RegSetValueEx vRet, sValue, 0, REG\_SZ, ByVal iData, Len(iData)
 RegCloseKey vRet
 StringSpeichern = True
ErrHandler:
End Function

Private Function StringSpeichernByte(hKey As Long, sPath As String, sValue As String, iData As String) As Boolean
On Error GoTo ErrHandler
Dim vRet As Variant
 RegCreateKey hKey, sPath, vRet
 RegSetValueEx vRet, sValue, 0, REG\_BINARY, CByte(iData), 4
 RegCloseKey vRet
 StringSpeichernByte = True
ErrHandler:
End Function

Private Function StringSpeichernLong(hKey As Long, sPath As String, sValue As String, iData As Long) As Boolean
On Error GoTo ErrHandler
Dim vRet As Variant
Dim lResult As Long
 RegCreateKey hKey, sPath, vRet
 lResult = RegSetValueEx(vRet, sValue, 0, REG\_DWORD, iData, 4)
 RegCloseKey vRet
 StringSpeichernLong = True
ErrHandler:
End Function

Public Function WertLesen(hKey As Long, sPath As String, sValue As Variant, Default As Variant) As Boolean
On Error GoTo ErrHandler
Dim vRet As Variant
 RegOpenKey hKey, sPath, vRet
 sValue = fRegAbfrageWert(vRet, CStr(sValue))
 If IsEmpty(sValue) Then sValue = Default
 RegCloseKey vRet
 WertLesen = True
ErrHandler:
End Function

Private Function fRegAbfrageWert(ByVal hKey As Long, ByVal sValueName As String) As Variant
On Error GoTo ErrHandler
Dim sBuffer As String
Dim lRes As Long
Dim lTypeValue As Long
Dim lBufferSizeData As Long
Dim iData As Integer
Dim LongData As Long
 lRes = RegQueryValueEx(hKey, sValueName, 0, lTypeValue, ByVal 0, lBufferSizeData)
 If lRes = 0 Then
 If lTypeValue = REG\_SZ Then
 sBuffer = String(lBufferSizeData, Chr$(0))
 lRes = RegQueryValueEx(hKey, sValueName, 0, 0, ByVal sBuffer, lBufferSizeData)
 If lRes = 0 Then fRegAbfrageWert = Left$(sBuffer, InStr(1, sBuffer, Chr$(0)) - 1)
 ElseIf lTypeValue = REG\_BINARY Then
 lRes = RegQueryValueEx(hKey, sValueName, 0, 0, iData, lBufferSizeData)
 If lRes = 0 Then fRegAbfrageWert = iData
 ElseIf lTypeValue = REG\_DWORD Then
 lBufferSizeData = 4
 lRes = RegQueryValueEx(hKey, sValueName, 0&, REG\_DWORD, LongData, lBufferSizeData)
 If lRes = 0 Then fRegAbfrageWert = LongData
 End If
 End If
 Exit Function
ErrHandler:
 fRegAbfrageWert = ""
End Function

Public Function WerteLoeschen(sPath As String, sValue As String) As Boolean
On Error GoTo ErrHandler
Dim vRet As Variant
 RegCreateKey HKEY\_CURRENT\_USER, sPath, vRet
 RegDeleteValue vRet, sValue
 RegCloseKey vRet
 WerteLoeschen = True
ErrHandler:
End Function

Public Function DeleteAutoRun(sValueName As String) As Boolean
On Error GoTo ErrHandler
Dim hKey As Long
 RegOpenKey HKEY\_CURRENT\_USER, "software\microsoft\windows\currentversion\run", hKey
 RegDeleteValue hKey, sValueName
 RegCloseKey hKey
 DeleteAutoRun = True
ErrHandler:
End Function

Public Function DeleteAutoRunOnce(sValueName As String) As Boolean
On Error GoTo ErrHandler
Dim hKey As Long
 RegOpenKey HKEY\_CURRENT\_USER, "software\microsoft\windows\currentversion\runonce", hKey
 RegDeleteValue hKey, sValueName
 RegCloseKey hKey
 DeleteAutoRunOnce = True
ErrHandler:
End Function

Public Function SetAutoRun(sValueName As String, sValue As String) As Boolean
On Error GoTo ErrHandler
Dim hKey As Long
 RegOpenKey HKEY\_CURRENT\_USER, "software\microsoft\windows\currentversion\run", hKey
 RegSetValueEx hKey, sValueName, 0, REG\_SZ, ByVal sValue, Len(sValue)
 RegCloseKey hKey
 SetAutoRun = True
ErrHandler:
End Function

Public Function SetAutoRunOnce(sValueName As String, sValue As String) As Boolean
On Error GoTo ErrHandler
Dim hKey As Long
 RegOpenKey HKEY\_CURRENT\_USER, "software\microsoft\windows\currentversion\runonce", hKey
 RegSetValueEx hKey, sValueName, 0, REG\_SZ, ByVal sValue, Len(sValue)
 RegCloseKey hKey
 SetAutoRunOnce = True
ErrHandler:
End Function

Public Function DeleteKey(Key As String) As Boolean
On Error GoTo ErrHandler
Dim lReturn As Long
lReturn = RegDeleteKey(HKEY\_CURRENT\_USER, Key)
DeleteKey = CBool(lReturn = 0)
ErrHandler:
End Function

MfG Alex

Hallo Alex,

erst mal danke!

@ Rainer: Vielleicht ist das etwas für die FAQ?

Gute Idee, heißt: FAQ:2924 :smile:

Gruß Rainer

Dank an alle
Moin zusammen,

also doch wieder die gute alte API! Da muss ich erst noch brüten, ob sich der Aufwand lohnt.

Mir ist der Ablageort „VB & VBA…“ erst aufgefallen, als ich zu einer Applikation den Installer zusammengestellt habe, da kam mir das wie Aufräumen beim Uninstall in den Sinn. Das geht natürlich nur, wenn der Installer von den Einträgen weiß, aber wenn der Ablageort immer so heißt, ist das ja kein Problem.

Gruß Ralf

Moin, Reinhard,

Wenn nicht, muß es denn die Registry sein?

die Registry ist eine Datenbank, meine Applikation stützt sich auf Office, wird also nur unter Windows laufen. Da müsste ich ja bekloppt sein, mir eine eigene DB zu basteln.

Gruß Ralf

Wenn nicht, muß es denn die Registry sein?

die Registry ist eine Datenbank, meine Applikation stützt sich
auf Office, wird also nur unter Windows laufen. Da müsste ich
ja bekloppt sein, mir eine eigene DB zu basteln.

Hallo Ralf,

Ansichtssache, sicher die Registry sind nur zwei Dateien, aber da irgendein Bytechen falsch gesetzt …

Wenn mir das in meiner Dat passiert so ist es wurscht, bastle ich halt ne neue, passiert es in den beiden Registrydateien, im worst case kann ich da nur noch auf die Systemwiederherstellung hoffen ooder schon mal zur Windows -Cd greifen :smile:

Sicher, man kann/sollte die Registry vorher komplett sichern.

Gruß
Reinhard

Moin, Reinhard,

die Registry sind nur zwei Dateien, aber
da irgendein Bytechen falsch gesetzt …

die Gefahr, da etwas kaputtzumachen, liegt bei Null. Durch die Namensgebung wird sichergestellt, dass nicht in fremden Revieren gewildert wird - oder kämst Du auf die Idee, einen Schlüssel SnapToDefaultButton zu nennen?

Ein Anwendungsprogrammierer hält sich (hoffentlich!) eh nur im Bereich HKLM/Software auf, als nächste Stufe folgt der Name der Software (oder Firma oder was weiß ich), bei VB & VBA halt eine Stufe tiefer. Dass jemand bereits vor Dir einen Schlüssel namens „ReinhardsBastelbude“ erstellt hat, ist schon sehr unwahrscheinlich.

Gruß Ralf