Registry-Keys in VBA auf Windows 7 auslesen
Mittwoch, 27.5.2015, 09:18 > daMaxSeufz. Mit Windows 7 gibt es auf 64-bittigen Maschinen echte Probleme wenn man versucht, Registry-Keys per VBA auszulesen.
Dieses VB-Script:
Dim objWShell
Dim RegPath: RegPath = "HKEY_LOCAL_MACHINE\SOFTWARE\pfad\zum\regkey"
Dim RegKey
Set objWShell = CreateObject("Wscript.shell")
RegKey = objWShell.RegRead(RegPath)
msgbox(regkey)
funktioniert blendend. Wenn man exakt diesen Code jedoch nach VBA stopft und rennen lässt, reagiert Windows 7 (64-bit) so:
Hat was mit 64-Bit Architektur und hastennichgesehn zu tun. Ein erster sehr cleverer Ansatz funktioniert nicht die Bohne, weil er, statt den tatsächlichen RegKey auszulesen, einen neuen unter HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\pfad\zum
erzeugt und dort einen Schlüssel namens regkey
anlegt. Meh.
Die Lösung lautet wie folgt:
' Reads a REG_SZ value from the local computer's registry using WMI.
' Parameters:
' RootKey - The registry hive as String
' Key - The key that contains the desired value.
' Value - The value that you want to get.
' RegType - The registry bitness: 32 or 64.
'
Function ReadRegStr(RootKey As String, Key, Value, RegType)
TheKey = -99
Select Case UCase(RootKey)
Case "HKEY_CLASSES_ROOT": TheKey = &H80000000
Case "HKEY_CURRENT_USER": TheKey = &H80000001
Case "HKEY_LOCAL_MACHINE": TheKey = &H80000002
Case "HKEY_USERS": TheKey = &H80000003
Case "HKEY_CURRENT_CONFIG": TheKey = &H80000004
Case "HKEY_DYN_DATA": TheKey = &H80000005
End Select
If TheKey = -99 Then
Exit Function
End If
Dim oCtx, oLocator, oReg, oInParams, oOutParams
Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
oCtx.Add "__ProviderArchitecture", RegType
Set oLocator = CreateObject("Wbemscripting.SWbemLocator")
Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv")
Set oInParams = oReg.Methods_("GetStringValue").InParameters
oInParams.hDefKey = TheKey
oInParams.sSubKeyName = Key
oInParams.sValueName = Value
Set oOutParams = oReg.ExecMethod_("GetStringValue", oInParams, , oCtx)
ReadRegStr = oOutParams.sValue
End Function
und wird auf einem 64-bittigen Windows7 so verwendet:
RegKey = ReadRegStr("HKEY_LOCAL_MACHINE", "SOFTWARE\pfad\zum", "regkey", 64)
Danke, stackoverflow!
Wenns nur der Reg Key ist, den du auslesen willst, brauchst du da kein VB geraffel. Die Konsole reicht da locker:
REG QUERY HKLM\Software\pfad\den\man\lesen\will
unter "REG QUERY /?" gibts hilfe dazu
@Fuzzy: ich bin aber nicht in einer Konsole sondern in einer krätzigen VBA Anwendung. Job und so, severstehn?
hihi klassenorientierte Sprachen....passt doch genau zur Industrie & dem Marketing