★★★敬请留意★★★:和微软一模一样的记事本的源代码(5)

    技术2022-05-11  118

    Type Formstate    Deleted As Integer    Dirty As Integer    Color As LongEnd TypePublic Fstate As FormstatePublic Fstring As StringPublic Gstring As StringPublic Sstring As String

    Public StartPos As IntegerPublic EndPos As IntegerPublic Tchange As BooleanType FILETIME    lLowDateTime    As Long    lHighDateTime   As LongEnd Type 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 LongDeclare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As LongDeclare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As LongDeclare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As LongDeclare Function RegQueryValueEx 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 LongDeclare Function RegQueryValueExA Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByRef lpData As Long, lpcbData As Long) As LongDeclare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As LongDeclare Function RegSetValueExA Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByRef lpData As Long, ByVal cbData As Long) As LongDeclare Function RegSetValueExB Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByRef lpData As Byte, ByVal cbData As Long) As Long

    Const ERROR_SUCCESS = 0&Const ERROR_BADDB = 1009&Const ERROR_BADKEY = 1010&Const ERROR_CANTOPEN = 1011&Const ERROR_CANTREAD = 1012&Const ERROR_CANTWRITE = 1013&Const ERROR_OUTOFMEMORY = 14&Const ERROR_INVALID_PARAMETER = 87&Const ERROR_ACCESS_DENIED = 5&Const ERROR_NO_MORE_ITEMS = 259&Const ERROR_MORE_DATA = 234&

    Const REG_NONE = 0&Const REG_SZ = 1&Const REG_EXPAND_SZ = 2&Const REG_BINARY = 3&Const REG_DWORD = 4&Const REG_DWORD_LITTLE_ENDIAN = 4&Const REG_DWORD_BIG_ENDIAN = 5&Const REG_LINK = 6&Const REG_MULTI_SZ = 7&Const REG_RESOURCE_LIST = 8&Const REG_FULL_RESOURCE_DESCRIPTOR = 9&Const REG_RESOURCE_REQUIREMENTS_LIST = 10&

    Const KEY_QUERY_VALUE = &H1&Const KEY_SET_VALUE = &H2&Const KEY_CREATE_SUB_KEY = &H4&Const KEY_ENUMERATE_SUB_KEYS = &H8&Const KEY_NOTIFY = &H10&Const KEY_CREATE_LINK = &H20&Const READ_CONTROL = &H20000Const WRITE_DAC = &H40000Const WRITE_OWNER = &H80000Const SYNCHRONIZE = &H100000Const STANDARD_RIGHTS_REQUIRED = &HF0000Const STANDARD_RIGHTS_READ = READ_CONTROLConst STANDARD_RIGHTS_WRITE = READ_CONTROLConst STANDARD_RIGHTS_EXECUTE = READ_CONTROLConst KEY_READ = STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFYConst KEY_WRITE = STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEYConst KEY_EXECUTE = KEY_READ

    Dim hKey As Long, MainKeyHandle As LongDim rtn As Long, lBuffer As Long, sBuffer As StringDim lBufferSize As LongDim lDataSize As LongDim ByteArray() As Byte

    'This constant determins wether or not to display error messages to the'user. I have set the default value to False as an error message can and'does become irritating after a while. Turn this value to true if you want'to debug your programming code when reading and writing to your system'registry, as any errors will be displayed in a message box.

    Const DisplayErrorMsg = False

    Function SetDWORDValue(SubKey As String, Entry As String, Value As Long)

    Call ParseKey(SubKey, MainKeyHandle)

    If MainKeyHandle Then   rtn = RegOpenKeyEx(MainKeyHandle, SubKey, 0, KEY_WRITE, hKey) 'open the key   If rtn = ERROR_SUCCESS Then 'if the key was open successfully then      rtn = RegSetValueExA(hKey, Entry, 0, REG_DWORD, Value, 4) 'write the value      If Not rtn = ERROR_SUCCESS Then   'if there was an error writting the value         If DisplayErrorMsg = True Then 'if the user want errors displayed            MsgBox ErrorMsg(rtn)        'display the error         End If      End If      rtn = RegCloseKey(hKey) 'close the key   Else 'if there was an error opening the key      If DisplayErrorMsg = True Then 'if the user want errors displayed         MsgBox ErrorMsg(rtn) 'display the error      End If   End IfEnd If

    End FunctionFunction GetDWORDValue(SubKey As String, Entry As String)

    Call ParseKey(SubKey, MainKeyHandle)

    If MainKeyHandle Then   rtn = RegOpenKeyEx(MainKeyHandle, SubKey, 0, KEY_READ, hKey) 'open the key   If rtn = ERROR_SUCCESS Then 'if the key could be opened then      rtn = RegQueryValueExA(hKey, Entry, 0, REG_DWORD, lBuffer, 4) 'get the value from the registry      If rtn = ERROR_SUCCESS Then 'if the value could be retreived then         rtn = RegCloseKey(hKey)  'close the key         GetDWORDValue = lBuffer  'return the value      Else                        'otherwise, if the value couldnt be retreived         GetDWORDValue = "Error"  'return Error to the user         If DisplayErrorMsg = True Then 'if the user wants errors displayed            MsgBox ErrorMsg(rtn)        'tell the user what was wrong         End If      End If   Else 'otherwise, if the key couldnt be opened      GetDWORDValue = "Error"        'return Error to the user      If DisplayErrorMsg = True Then 'if the user wants errors displayed         MsgBox ErrorMsg(rtn)        'tell the user what was wrong      End If   End IfEnd If

    End FunctionFunction SetBinaryValue(SubKey As String, Entry As String, Value As String)

    Call ParseKey(SubKey, MainKeyHandle)

    If MainKeyHandle Then   rtn = RegOpenKeyEx(MainKeyHandle, SubKey, 0, KEY_WRITE, hKey) 'open the key   If rtn = ERROR_SUCCESS Then 'if the key was open successfully then      lDataSize = Len(Value)      ReDim ByteArray(lDataSize)      For i = 1 To lDataSize      ByteArray(i) = Asc(Mid$(Value, i, 1))      Next      rtn = RegSetValueExB(hKey, Entry, 0, REG_BINARY, ByteArray(1), lDataSize) 'write the value      If Not rtn = ERROR_SUCCESS Then   'if the was an error writting the value         If DisplayErrorMsg = True Then 'if the user want errors displayed            MsgBox ErrorMsg(rtn)        'display the error         End If      End If      rtn = RegCloseKey(hKey) 'close the key   Else 'if there was an error opening the key      If DisplayErrorMsg = True Then 'if the user wants errors displayed         MsgBox ErrorMsg(rtn) 'display the error      End If   End IfEnd If

    End Function

    Function GetBinaryValue(SubKey As String, Entry As String)

    Call ParseKey(SubKey, MainKeyHandle)

    If MainKeyHandle Then   rtn = RegOpenKeyEx(MainKeyHandle, SubKey, 0, KEY_READ, hKey) 'open the key   If rtn = ERROR_SUCCESS Then 'if the key could be opened      lBufferSize = 1      rtn = RegQueryValueEx(hKey, Entry, 0, REG_BINARY, 0, lBufferSize) 'get the value from the registry      sBuffer = Space(lBufferSize)      rtn = RegQueryValueEx(hKey, Entry, 0, REG_BINARY, sBuffer, lBufferSize) 'get the value from the registry      If rtn = ERROR_SUCCESS Then 'if the value could be retreived then         rtn = RegCloseKey(hKey)  'close the key         GetBinaryValue = sBuffer 'return the value to the user      Else                        'otherwise, if the value couldnt be retreived         GetBinaryValue = "Error" 'return Error to the user         If DisplayErrorMsg = True Then 'if the user wants to errors displayed            MsgBox ErrorMsg(rtn)  'display the error to the user         End If      End If   Else 'otherwise, if the key couldnt be opened      GetBinaryValue = "Error" 'return Error to the user      If DisplayErrorMsg = True Then 'if the user wants to errors displayed         MsgBox ErrorMsg(rtn)  'display the error to the user      End If   End IfEnd If

    End FunctionFunction DeleteKey(Keyname As String)

    Call ParseKey(Keyname, MainKeyHandle)

    If MainKeyHandle Then   rtn = RegOpenKeyEx(MainKeyHandle, Keyname, 0, KEY_WRITE, hKey) 'open the key   If rtn = ERROR_SUCCESS Then 'if the key could be opened then      rtn = RegDeleteKey(hKey, Keyname) 'delete the key      rtn = RegCloseKey(hKey)  'close the key   End IfEnd If

    End Function

    Function GetMainKeyHandle(MainKeyName As String) As Long

    Const HKEY_CLASSES_ROOT = &H80000000Const HKEY_CURRENT_USER = &H80000001Const HKEY_LOCAL_MACHINE = &H80000002Const HKEY_USERS = &H80000003Const HKEY_PERFORMANCE_DATA = &H80000004Const HKEY_CURRENT_CONFIG = &H80000005Const HKEY_DYN_DATA = &H80000006   Select Case MainKeyName       Case "HKEY_CLASSES_ROOT"            GetMainKeyHandle = HKEY_CLASSES_ROOT       Case "HKEY_CURRENT_USER"            GetMainKeyHandle = HKEY_CURRENT_USER       Case "HKEY_LOCAL_MACHINE"            GetMainKeyHandle = HKEY_LOCAL_MACHINE       Case "HKEY_USERS"            GetMainKeyHandle = HKEY_USERS       Case "HKEY_PERFORMANCE_DATA"            GetMainKeyHandle = HKEY_PERFORMANCE_DATA       Case "HKEY_CURRENT_CONFIG"            GetMainKeyHandle = HKEY_CURRENT_CONFIG       Case "HKEY_DYN_DATA"            GetMainKeyHandle = HKEY_DYN_DATAEnd Select

    End Function

    Function ErrorMsg(lErrorCode As Long) As String    'If an error does accurr, and the user wants error messages displayed, then'display one of the following error messages

    Select Case lErrorCode       Case 1009, 1015            GetErrorMsg = "The Registry Database is corrupt!"       Case 2, 1010            GetErrorMsg = "Bad Key Name"       Case 1011            GetErrorMsg = "Can't Open Key"       Case 4, 1012            GetErrorMsg = "Can't Read Key"       Case 5            GetErrorMsg = "Access to this key is denied"       Case 1013            GetErrorMsg = "Can't Write Key"       Case 8, 14            GetErrorMsg = "Out of memory"       Case 87            GetErrorMsg = "Invalid Parameter"       Case 234            GetErrorMsg = "There is more data than the buffer has been allocated to hold."       Case Else            GetErrorMsg = "Undefined Error Code:  " & Str$(lErrorCode)End Select

    End Function

     

    Function GetStringValue(SubKey As String, Entry As String)

    Call ParseKey(SubKey, MainKeyHandle)

    If MainKeyHandle Then   rtn = RegOpenKeyEx(MainKeyHandle, SubKey, 0, KEY_READ, hKey) 'open the key   If rtn = ERROR_SUCCESS Then 'if the key could be opened then      sBuffer = Space(255)     'make a buffer      lBufferSize = Len(sBuffer)      rtn = RegQueryValueEx(hKey, Entry, 0, REG_SZ, sBuffer, lBufferSize) 'get the value from the registry      If rtn = ERROR_SUCCESS Then 'if the value could be retreived then         rtn = RegCloseKey(hKey)  'close the key         sBuffer = Trim(sBuffer)         GetStringValue = Left(sBuffer, Len(sBuffer) - 1) 'return the value to the user      Else                        'otherwise, if the value couldnt be retreived         GetStringValue = "Error" 'return Error to the user         If DisplayErrorMsg = True Then 'if the user wants errors displayed then            MsgBox ErrorMsg(rtn)  'tell the user what was wrong         End If      End If   Else 'otherwise, if the key couldnt be opened      GetStringValue = "Error"       'return Error to the user      If DisplayErrorMsg = True Then 'if the user wants errors displayed then         MsgBox ErrorMsg(rtn)        'tell the user what was wrong      End If   End IfEnd If

    End Function

    Private Sub ParseKey(Keyname As String, Keyhandle As Long)    rtn = InStr(Keyname, "/") 'return if "/" is contained in the Keyname

    If Left(Keyname, 5) <> "HKEY_" Or Right(Keyname, 1) = "/" Then 'if the is a "/" at the end of the Keyname then   MsgBox "Incorrect Format:" + Chr(10) + Chr(10) + Keyname 'display error to the user   Exit Sub 'exit the procedureElseIf rtn = 0 Then 'if the Keyname contains no "/"   Keyhandle = GetMainKeyHandle(Keyname)   Keyname = "" 'leave Keyname blankElse 'otherwise, Keyname contains "/"   Keyhandle = GetMainKeyHandle(Left(Keyname, rtn - 1)) 'seperate the Keyname   Keyname = Right(Keyname, Len(Keyname) - rtn)End If

    End SubFunction CreateKey(SubKey As String)

    Call ParseKey(SubKey, MainKeyHandle)

    If MainKeyHandle Then   rtn = RegCreateKey(MainKeyHandle, SubKey, hKey) 'create the key   If rtn = ERROR_SUCCESS Then 'if the key was created then      rtn = RegCloseKey(hKey)  'close the key   End IfEnd If

    End FunctionFunction SetStringValue(SubKey As String, Entry As String, Value As String)

    Call ParseKey(SubKey, MainKeyHandle)

    If MainKeyHandle Then   rtn = RegOpenKeyEx(MainKeyHandle, SubKey, 0, KEY_WRITE, hKey) 'open the key   If rtn = ERROR_SUCCESS Then 'if the key was open successfully then      rtn = RegSetValueEx(hKey, Entry, 0, REG_SZ, ByVal Value, Len(Value)) 'write the value      If Not rtn = ERROR_SUCCESS Then   'if there was an error writting the value         If DisplayErrorMsg = True Then 'if the user wants errors displayed            MsgBox ErrorMsg(rtn)        'display the error         End If      End If      rtn = RegCloseKey(hKey) 'close the key   Else 'if there was an error opening the key      If DisplayErrorMsg = True Then 'if the user wants errors displayed         MsgBox ErrorMsg(rtn)        'display the error      End If   End IfEnd If

    End Function

     

     

     


    最新回复(0)