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 Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As _ Long Private 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 Const KEY_WRITE = &H20006 '((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or ' KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE)) Const REG_SZ = 1 Const REG_BINARY = 3 Const REG_DWORD = 4 ' Write or Create a Registry value ' returns True if successful ' ' Use KeyName = "" for the default value ' ' Value can be an integer value (REG_DWORD), a string (REG_SZ) ' or an array of binary (REG_BINARY). Raises an error otherwise. Function SetRegistryValue(ByVal hKey As Long, ByVal KeyName As String, _ ByVal ValueName As String, value As Variant) As Boolean Dim handle As Long Dim lngValue As Long Dim strValue As String Dim binValue() As Byte Dim length As Long Dim retVal As Long ' Open the key, exit if not found If RegOpenKeyEx(hKey, KeyName, 0, KEY_WRITE, handle) Then Exit Function End If ' three cases, according to the data type in Value Select Case VarType(value) Case vbInteger, vbLong lngValue = value retVal = RegSetValueEx(handle, ValueName, 0, REG_DWORD, lngValue, 4) Case vbString strValue = value retVal = RegSetValueEx(handle, ValueName, 0, REG_SZ, ByVal strValue, _ Len(strValue)) Case vbArray + vbByte binValue = value length = UBound(binValue) - LBound(binValue) + 1 retVal = RegSetValueEx(handle, ValueName, 0, REG_BINARY, _ binValue(LBound(binValue)), length) Case Else RegCloseKey handle Err.Raise 1001, , "Unsupported value type" End Select ' Close the key and signal success RegCloseKey handle ' signal success if the value was written correctly SetRegistryValue = (retVal = 0) End Function |