可能是没分配好空间具体代码!
VB操作注册表:
http://www.sqreg.com/file/vb/reg_01.htm
http://www.sqreg.com/file/vb/reg_02.htm
http://www.sqreg.com/file/vb/reg_03.htm
http://www.sqreg.com/file/vb/reg_04.htm
http://www.sqreg.com/file/vb/reg_05.htm
http://www.sqreg.com/file/vb/reg_06.htm
http://www.sqreg.com/file/vb/reg_07.htm

解决方案 »

  1.   

    我写的
    '=== API =======================================
    '-=- Reg -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    Public 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
    Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey 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 RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
    Public Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As Long, ByVal lpFile As String, ByVal lpSecurityAttributes As Long) As Long'--- Const -------------------------------------
    Public Const KEY_CREATE_LINK = &H20
    Public Const KEY_CREATE_SUB_KEY = &H4
    Public Const KEY_ENUMERATE_SUB_KEYS = &H8
    Public Const KEY_NOTIFY = &H10
    Public Const KEY_QUERY_VALUE = &H1
    Public Const KEY_SET_VALUE = &H2
    'Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
    'Public Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
    'Public Const KEY_EXECUTE = (KEY_READ)
    Public Const STANDARD_RIGHTS_ALL = &H1F0000
    Public Const SYNCHRONIZE = &H100000
    Public Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))Public Const REG_SZ = 1'-=- Other -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    Public Declare Function ShellAbout Lib "shell32.dll" Alias "ShellAboutA" (ByVal hwnd As Long, ByVal szApp As String, ByVal szOtherStuff As String, ByVal hIcon As Long) As Long
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long'--- Const--------------------------------------
    Public Const LB_SETHORIZONTALEXTENT = &H194
    '###############################################Public Function RegGetStr(MainKey As Long, SubKey As String, KeyName As String, OutData As String) As Long
        Dim hKey As Long
        Dim TempStr As String
        Dim StrLen As Long
        Dim KeyType As Long
        Dim Rc As Long
        
        StrLen = 260
        TempStr = String$(StrLen, Chr$(0))
        
        Rc = RegOpenKeyEx(MainKey, SubKey, 0, KEY_ALL_ACCESS, hKey)
        
        'Debug.Print "Load1:" & Rc
        If Rc = 0 Then
            Rc = RegQueryValueEx(hKey, KeyName, 0, KeyType, ByVal TempStr, StrLen)
            
            If KeyType <> REG_SZ Then
                RegGetStr = -1
                Exit Function
                
            End If
            
            'Debug.Print "Load2: " & Rc
            If Rc = 0 Then
                OutData = Left$(TempStr, StrLen)
                
            Else
                RegGetStr = Rc
                
            End If
            
            RegCloseKey hKey
            
        Else
            RegGetStr = Rc
            
        End If
        
    End FunctionPublic Function RegSetStr(MainKey As Long, SubKey As String, KeyName As String, SetData As String) As Long
        Dim hKey As Long
        Dim Rc As Long
        
        Rc = RegOpenKeyEx(MainKey, SubKey, 0, KEY_ALL_ACCESS, hKey)
        
        If Rc = 0 Then
            Rc = RegSetValueEx(hKey, KeyName, 0, REG_SZ, ByVal SetData, Len(SetData))
            
            If Rc = 0 Then
                
            Else
                RegSetStr = Rc
                
            End If
            RegCloseKey hKey
            
        Else
            RegSetStr = Rc
            
        End If
        
    End Function
      

  2.   

    我写的
    '=== API =======================================
    '-=- Reg -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    Public 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
    Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey 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 RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
    Public Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As Long, ByVal lpFile As String, ByVal lpSecurityAttributes As Long) As Long'--- Const -------------------------------------
    Public Const KEY_CREATE_LINK = &H20
    Public Const KEY_CREATE_SUB_KEY = &H4
    Public Const KEY_ENUMERATE_SUB_KEYS = &H8
    Public Const KEY_NOTIFY = &H10
    Public Const KEY_QUERY_VALUE = &H1
    Public Const KEY_SET_VALUE = &H2
    'Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
    'Public Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
    'Public Const KEY_EXECUTE = (KEY_READ)
    Public Const STANDARD_RIGHTS_ALL = &H1F0000
    Public Const SYNCHRONIZE = &H100000
    Public Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))Public Const REG_SZ = 1'-=- Other -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    Public Declare Function ShellAbout Lib "shell32.dll" Alias "ShellAboutA" (ByVal hwnd As Long, ByVal szApp As String, ByVal szOtherStuff As String, ByVal hIcon As Long) As Long
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long'--- Const--------------------------------------
    Public Const LB_SETHORIZONTALEXTENT = &H194
    '###############################################Public Function RegGetStr(MainKey As Long, SubKey As String, KeyName As String, OutData As String) As Long
        Dim hKey As Long
        Dim TempStr As String
        Dim StrLen As Long
        Dim KeyType As Long
        Dim Rc As Long
        
        StrLen = 260
        TempStr = String$(StrLen, Chr$(0))
        
        Rc = RegOpenKeyEx(MainKey, SubKey, 0, KEY_ALL_ACCESS, hKey)
        
        'Debug.Print "Load1:" & Rc
        If Rc = 0 Then
            Rc = RegQueryValueEx(hKey, KeyName, 0, KeyType, ByVal TempStr, StrLen)
            
            If KeyType <> REG_SZ Then
                RegGetStr = -1
                Exit Function
                
            End If
            
            'Debug.Print "Load2: " & Rc
            If Rc = 0 Then
                OutData = Left$(TempStr, StrLen)
                
            Else
                RegGetStr = Rc
                
            End If
            
            RegCloseKey hKey
            
        Else
            RegGetStr = Rc
            
        End If
        
    End FunctionPublic Function RegSetStr(MainKey As Long, SubKey As String, KeyName As String, SetData As String) As Long
        Dim hKey As Long
        Dim Rc As Long
        
        Rc = RegOpenKeyEx(MainKey, SubKey, 0, KEY_ALL_ACCESS, hKey)
        
        If Rc = 0 Then
            Rc = RegSetValueEx(hKey, KeyName, 0, REG_SZ, ByVal SetData, Len(SetData))
            
            If Rc = 0 Then
                
            Else
                RegSetStr = Rc
                
            End If
            RegCloseKey hKey
            
        Else
            RegSetStr = Rc
            
        End If
        
    End Function
      

  3.   


    引用楼上地址:
    Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long 
    hKey:Key Handle
    lpSubKey:Subkey名称或路径
    dwType:数据类型,但在这里只能接受REG_SZ[字符串类型]
    lpData:所设置的字符串
    cbData:lpData字符串的长度,这一长度包括chr(0)字符。
    关于dwType的可能取值
    Enum ValueType 
    REG_NONE = 0 
    REG_SZ = 1 
    REG_EXPAND_SZ = 2 
    REG_BINARY = 3 
    REG_DWORD = 4 
    REG_DWORD_BIG_ENDIAN = 5 
    REG_MULTI_SZ = 7 
    End Enum 
    其具体含义我们在以后再讲。函数调用实例:
    '自编函数SetDefaultValue
    '写入Default Value 
    '比较值得注意的事情是, 当我们想写入某一个 Subkey 的 Default Value 时,若此一 Subkey 不存在, 则 Windows 会自动建立此一 Subkey, 然后才写入 Default Value, 假设"HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry" Subkey 并不存在, 则以下敘述:
    'ret = SetDefaultValue(HKEY_LOCAL_MACHINE, "SOFTWARE\kj\Registry", "kj Registry Master")
    '会先建立以下两个 Subkey:(HKEY_LOCAL_MACHINE\SOFTWARE 为已存在的 Subkey) 'HKEY_LOCAL_MACHINE\SOFTWARE\kj 'HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry
    '然后才写入 "kj Registry Master" 到 "HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry" Subkey 的 Default Value。 Function SetDefaultValue(ByVal hKey As Long, ByVal Subkey As String, ByVal Value As String) As Boolean 
    Dim ret As Long, lenS As Long, S As String 
    ret = RegSetValue(hKey, Subkey, REG_SZ, Value, LenB(StrConv(Value, vbFromUnicode)) + 1) SetDefaultValue = (ret = 0) 
    End Function 下面我举的一个完整的例子就是我在这篇文章开头提到的程序,只给出如何设置扫雷程序为开机自运行程序的例子,自销毁程序的设计比较复杂一些,暂不提供.模块文件registry.basDeclare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long 
    Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long 
    Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue As Long) As Long 
    Enum RootKey 
    HKEY_CLASSES_ROOT = &H80000000 
    HKEY_CURRENT_USER = &H80000001 
    HKEY_LOCAL_MACHINE = &H80000002 
    HKEY_USERS = &H80000003 
    HKEY_PERFORMANCE_DATA = &H80000004 
    HKEY_CURRENT_CONFIG = &H80000005 
    HKEY_DYN_DATA = &H80000006 
    End Enum 
    Enum ErrorCode 
    ERROR_SUCCESS = 0& 
    ERROR_MORE_DATA = 234& 
    End Enum Enum ValueType 
    REG_NONE = 0 
    REG_SZ = 1 
    REG_EXPAND_SZ = 2 
    REG_BINARY = 3 
    REG_DWORD = 4 
    REG_DWORD_BIG_ENDIAN = 5 
    REG_MULTI_SZ = 7 
    End Enum Function SetDefaultValue(ByVal hKey As Long, ByVal Subkey As String, ByVal Value As String) As Boolean 
    Dim ret As Long, lenS As Long, S As String ret = RegSetValue(hKey, Subkey, REG_SZ, Value, @1:LenB(StrConv(Value, vbFromUnicode)) + 1) SetDefaultValue = (ret = 0) 
    End Function 
    Function GetDefaultValue(ByVal hKey As Long, ByVal Subkey As String, Value As String) As Boolean 
    Dim ret As Long, lenS As Long, S As String 
    '读取default value的字符串长度
    ret = RegQueryValue(hKey, Subkey, "", lenS) 
    If ret <> 0 And ret <> ERROR_MORE_DATA 
    Then GetDefaultValue = False 
    Exit Function 
    End If 
    S = String(lenS, Chr(0)) '再根据上一个RegQueryValue返回的lenS值来配置字符串。
    ret = RegQueryValue(hKey, Subkey, S, lenS) 
    If ret <> 0 Then 
    GetDefaultValue = False 
    Exit Function 
    End If 
    Value = Left(S, lenS - 1) 
    GetDefaultValue = True 
    End Function 然后在form中放置两个命令按钮command1和command2.
    'command1_click要做的事就是设置扫雷程序为开机自启动程序。若操作成功,显示success对话框。
    Private Sub Command1_Click() 
    Dim ret As Boolean 
    Dim disp As String 
    ret = SetDefaultValue(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run", "c:\windows\winmine.exe") 
    If ret Then 
    disp = "Sucess!" 
    Else disp = "Fail" 
    End If 
    MsgBox disp, , "结果" 
    End Sub 
    'command2_click要做的事情就是读入HKEY_CLASSES_ROOT\.txt这个SubKey的Default Value。
    @1:
    字符长度就在这里,lenb()求单字节长度,用len()在NT上就容易出现丢失字符现象。