请问,我在使用API操作注册表的时候,为什么函数返回的错误信息老是等于87呢?比如:
    Public Function SetKeyValue(KeyRoot As KeyRoot, KeyName As String, Optional ValueName As String, Optional Value As Variant = "", Optional ValueType As ValueType = REG_SZ) As Boolean
    Dim lpAttr As SECURITY_ATTRIBUTES                   ' 注册表安全类型
    lpAttr.nLength = 50                                 ' 设置安全属性为缺省值...
    lpAttr.lpSecurityDescriptor = 0                     ' ...
    lpAttr.bInheritHandle = True                        ' ...
    
    ' 新建注册表关键字...
    Success = RegCreateKeyEx(KeyRoot, KeyName, 0, ValueType, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpAttr, hKey, 0)
    If Success <> ERROR_SUCCESS Then SetKeyValue = False: RegCloseKey hKey: Exit Function
    
    ' 设置注册表关键字的值...
    If IsMissing(ValueName) = False Then
        Select Case ValueType
            Case REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ
                Success = RegSetValueEx(hKey, ValueName, 0, ValueType, ByVal CStr(Value), LenB(StrConv(Value, vbFromUnicode)) + 1)
            Case REG_DWORD
                If CDbl(Value) <= 4294967295# And CDbl(Value) >= 0 Then
                    Dim sValue As String
                    sValue = DoubleToHex(Value)
                    Dim dValue(3) As Byte
                    dValue(0) = Format("&h" & Mid(sValue, 7, 2))
                    dValue(1) = Format("&h" & Mid(sValue, 5, 2))
                    dValue(2) = Format("&h" & Mid(sValue, 3, 2))
                    dValue(3) = Format("&h" & Mid(sValue, 1, 2))
                    Success = RegSetValueEx(hKey, ValueName, 0, ValueType, dValue(0), 4)
                Else
                    Success = ERROR_BADKEY
                End If
            Case REG_BINARY
                On Error Resume Next
                Success = 1                             ' 假设调用API不成功(成功返回0)
                ReDim tmpValue(UBound(Value)) As Byte
                For i = 0 To UBound(tmpValue)
                    tmpValue(i) = Value(i)
                Next i
                Success = RegSetValueEx(hKey, ValueName, 0, ValueType, tmpValue(0), UBound(Value) + 1)
        End Select
    End If
    If Success <> ERROR_SUCCESS Then SetKeyValue = False: RegCloseKey hKey: Exit Function
    
    ' 关闭注册表关键字...
    RegCloseKey hKey
    SetKeyValue = True                                       ' 返回函数值
End Function在这里:success得到的值就是87.这是为什么呢?
Success = RegCreateKeyEx(KeyRoot, KeyName, 0, ValueType, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpAttr, hKey, 0)

解决方案 »

  1.   


    使用"GetNamedSecurityInfo"这个API函数改变注册表权限的时候,也是返回87的错误号..Public Sub setPopedom()  Dim result As Long
      Dim pSecDesc As Long
      Dim ea As EXPLICIT_ACCESS
      Dim pNewDACL As Long
      Dim pOldDACL As Long
      result = GetNamedSecurityInfo(FOLDER_PATH, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, 0&, 0&, pOldDACL, 0&, pSecDesc)  If result = ERROR_SUCCESS Then
        
        Call BuildExplicitAccessWithName(ea, "EVERYONE", KEY_ALL_ACCESS, SET_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
      
        result = SetEntriesInAcl(1, ea, pOldDACL, pNewDACL)
        
        If result = ERROR_SUCCESS Then
            MsgBox "SetEntriesInAcl succeeded"
            
            result = SetNamedSecurityInfo(FOLDER_PATH, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, 0&, 0&, pNewDACL, 0&)
            If result = ERROR_SUCCESS Then
              MsgBox "SetNamedSecurityInfo succeeded"
            Else
              MsgBox "SetNamedSecurityInfo failed with error code : " & result
            End If
            
            LocalFree pNewDACL
        Else
            MsgBox "SetEntriesInAcl failed with error code : " & result
        End If
        
        LocalFree pSecDesc
      Else
        MsgBox "GetNamedSecurityInfo failed with error code : " & result
      End If
    End Sub