使用API函数RegSaveKey怎么还不行啊??真急死了

VBeginner 2003-05-29 09:30:31
下面是我写的代码
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_USERS = &H80000003
Private Const ERROR_SUCCESS = 0&
Private Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As Long, ByVal lpFile _
As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Sub Command1_Click()
Dim lrc As Long
Dim ss As SECURITY_ATTRIBUTES
ss.lpSecurityDescriptor = 0
lrc = RegSaveKey(HKEY_LOCAL_MACHINE, "D:\regmhn.dat", ss)
lrc = RegSaveKey(HKEY_USERS, "D:\reguser.dat", ss)
If lrc = ERROR_SUCCESS Then
MsgBox "注册表备份成功!"
End If
End Sub
还是不行,在D盘能出现.dat的两个文件,可是都是0字节。而且没有"注册表备份成功!"的提示信息。
帮我找找原因在哪?谢谢。急!要保存成什么格式的?
...全文
111 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
VBeginner 2003-05-30
  • 打赏
  • 举报
回复
rainstormmaster(rainstormmaster) ,我在Win98试过了,可以,但是在XP下就没反映了
WHY?
lihonggen0 2003-05-30
  • 打赏
  • 举报
回复
'example by Scott Watters (scottw@racewaves.com)

' No rhyme or reason for making some private and some public. Use your own discretion...
Const HKEY_CURRENT_USER = &H80000001
Const TOKEN_QUERY As Long = &H8&
Const TOKEN_ADJUST_PRIVILEGES As Long = &H20&
Const SE_PRIVILEGE_ENABLED As Long = &H2
Const SE_RESTORE_NAME = "SeRestorePrivilege" 'Important for what we're trying to accomplish
Const SE_BACKUP_NAME = "SeBackupPrivilege"
Const REG_FORCE_RESTORE As Long = 8& ' Almost as import, will allow you to restore over a key while it's open!
Const READ_CONTROL = &H20000
Const SYNCHRONIZE = &H100000
Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Const STANDARD_RIGHTS_ALL = &H1F0000
Const SPECIFIC_RIGHTS_ALL = &HFFFF
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 KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
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))
Private Type LUID
lowpart As Long
highpart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges As LUID_AND_ATTRIBUTES
End Type
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long ' Always close your keys when you're done with them!
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 ' Need to open the key to be able to restore to it.
Private Declare Function RegRestoreKey Lib "advapi32.dll" Alias "RegRestoreKeyA" (ByVal hKey As Long, ByVal lpFile As String, ByVal dwFlags As Long) As Long ' Main function
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPriv As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long 'Used to adjust your program's security privileges, can't restore without it!
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As Any, ByVal lpName As String, lpLuid As LUID) As Long 'Returns a valid LUID which is important when making security changes in NT.
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As Long, ByVal lpFile As String, lpSecurityAttributes As Any) As Long
Function EnablePrivilege(seName As String) As Boolean
Dim p_lngRtn As Long
Dim p_lngToken As Long
Dim p_lngBufferLen As Long
Dim p_typLUID As LUID
Dim p_typTokenPriv As TOKEN_PRIVILEGES
Dim p_typPrevTokenPriv As TOKEN_PRIVILEGES
p_lngRtn = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, p_lngToken)
If p_lngRtn = 0 Then
Exit Function ' Failed
ElseIf Err.LastDllError <> 0 Then
Exit Function ' Failed
End If
p_lngRtn = LookupPrivilegeValue(0&, seName, p_typLUID) 'Used to look up privileges LUID.
If p_lngRtn = 0 Then
Exit Function ' Failed
End If
' Set it up to adjust the program's security privilege.
p_typTokenPriv.PrivilegeCount = 1
p_typTokenPriv.Privileges.Attributes = SE_PRIVILEGE_ENABLED
p_typTokenPriv.Privileges.pLuid = p_typLUID
EnablePrivilege = (AdjustTokenPrivileges(p_lngToken, False, p_typTokenPriv, Len(p_typPrevTokenPriv), p_typPrevTokenPriv, p_lngBufferLen) <> 0)
End Function
Public Function RestoreKey(ByVal sKeyName As String, ByVal sFileName As String, lPredefinedKey As Long) As Boolean
If EnablePrivilege(SE_RESTORE_NAME) = False Then Exit Function
Dim hKey As Long, lRetVal As Long
Call RegOpenKeyEx(lPredefinedKey, sKeyName, 0&, KEY_ALL_ACCESS, hKey) ' Must open key to restore it
'The file it's restoring from was created using the RegSaveKey function
Call RegRestoreKey(hKey, sFileName, REG_FORCE_RESTORE)
RegCloseKey hKey ' Don't want to keep the key ope. It causes problems.
End Function
Public Function SaveKey(ByVal sKeyName As String, ByVal sFileName As String, lPredefinedKey As Long) As Boolean
If EnablePrivilege(SE_BACKUP_NAME) = False Then Exit Function
Dim hKey As Long, lRetVal As Long
Call RegOpenKeyEx(lPredefinedKey, sKeyName, 0&, KEY_ALL_ACCESS, hKey) ' Must open key to save it
'Don't forget to "KILL" any existing files before trying to save the registry key!
If Dir(sFileName) <> "" Then Kill sFileName
Call RegSaveKey(hKey, sFileName, ByVal 0&)
RegCloseKey hKey ' Don't want to keep the key ope. It causes problems.
End Function
Private Sub Form_Load()
Const sFile = "c:\test.reg"
SaveKey "SOFTWARE\KPD-Team\API-Guide", sFile, HKEY_CURRENT_USER
RestoreKey "SOFTWARE\KPD-Team\API-Guide", sFile, HKEY_CURRENT_USER
End Sub
reayi 2003-05-30
  • 打赏
  • 举报
回复
要有调试权限才能调用regsavekey,而默认情况下是禁止的,参考 上面lihonggen0 给出的代码吧,他回答了这个问题到底怎么激活调试权限
rainstormmaster 2003-05-29
  • 打赏
  • 举报
回复
Option Explicit
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_USERS = &H80000003
Private Const ERROR_SUCCESS = 0&
Private Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As Long, ByVal lpFile _
As String, ByVal lpSecurityAttributes As Long) As Long
Private Sub Command1_Click()
Dim lrc As Long,mrc as long
lrc = RegSaveKey(HKEY_LOCAL_MACHINE, "D:\myregmhn.dat", 0&)
mrc = RegSaveKey(HKEY_USERS, "D:\myreguser.dat", 0&)
If lrc = ERROR_SUCCESS Then
MsgBox "注册表HKEY_LOCAL_MACHINE备份成功!"
End If
If mrc = ERROR_SUCCESS Then
MsgBox "注册表HKEY_USERS备份成功!"
End If
End Sub
试试看吧,你的代码在我这没有问题,另外注意,由于HKEY_LOCAL_MACHINE的内容较多,可能要等一些时间
rainstormmaster 2003-05-29
  • 打赏
  • 举报
回复
【VB声明】
Private Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As Long, ByVal lpFile As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long

【别名】
RegSaveKeyA

【说明】
将一个项以及它的所有子项都保存到一个磁盘文件

【返回值】
Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码

【参数表】
hKey ----------- Long,一个已打开项的句柄,或指定一个标准项名

lpFile --------- String,要在其中保存注册表信息的一个磁盘文件的名字

lpSecurityAttributes - SECURITY_ATTRIBUTES,为保存的信息提供的安全信息。可设为NULL,表示采用默认的安全信息(变成ByVal
As Long,并传递零值)

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧