如何使用RegReplaceKey()?
我尝试使用 RegReplaceKey()
替换注册表配置单元文件(新文件是使用 RegSaveKey()
API 创建的),但它返回时显示 “文件已存在存在” 错误。如果我尝试先删除原始配置单元文件,则会失败并显示错误“文件正在使用”。
我已经分配了适当的权限(SeBackupPrivilege
和 SeRestorePrivilege
),用户是管理员,但没有运气。
有谁知道可能出了什么问题吗?这是代码:
...
// Setting privileges here, everything goes okay
nret := RegOpenKey(HKEY_LOCAL_MACHINE, 'system', hk);
if nret = 0 then
begin
RegFlushKey(hk);
if FileExists('C:\WINDOWS\system32\config\testhive') then
DeleteFile('C:\WINDOWS\system32\config\testhive');
nret := RegSaveKey(hk, 'C:\WINDOWS\system32\config\testhive', nil);
if nret <> 0 then
MessageBox(0, pchar(SysErrorMessage(nret)), '', 0);
// no errors so far, new file is created
SeqNr := StartRestore('Before Registry Optimization');
if FileExists('C:\WINDOWS\system32\config\system') then
begin
FileSetAttr('C:\WINDOWS\system32\config\system', 0);
if not DeleteFile('C:\WINDOWS\system32\config\system') then
MessageBox(0, pchar(SysErrorMessage(GetLastError)), '', 0);
// error: file is in use
end;
nret := RegReplaceKey(hk, nil, 'C:\WINDOWS\system32\config\testhive', 'C:\WINDOWS\system32\config\system');
if nret <> 0 then
MessageBox(0, pchar(SysErrorMessage(nret)), '', 0);
// error: file already exists
if SeqNr <> 0 then
EndRestore(SeqNr);
RegCloseKey(hk);
end;
I'm trying to replace registry hive file by using RegReplaceKey()
(new file is created with RegSaveKey()
API), but it returns with "file already exists" error. If I try to delete original hive file first, it fails with an error "file is in use".
I've assigned proper privileges (SeBackupPrivilege
and SeRestorePrivilege
), user is an administrator, but no luck.
Does anyone have an idea what could be wrong? Here's the code:
...
// Setting privileges here, everything goes okay
nret := RegOpenKey(HKEY_LOCAL_MACHINE, 'system', hk);
if nret = 0 then
begin
RegFlushKey(hk);
if FileExists('C:\WINDOWS\system32\config\testhive') then
DeleteFile('C:\WINDOWS\system32\config\testhive');
nret := RegSaveKey(hk, 'C:\WINDOWS\system32\config\testhive', nil);
if nret <> 0 then
MessageBox(0, pchar(SysErrorMessage(nret)), '', 0);
// no errors so far, new file is created
SeqNr := StartRestore('Before Registry Optimization');
if FileExists('C:\WINDOWS\system32\config\system') then
begin
FileSetAttr('C:\WINDOWS\system32\config\system', 0);
if not DeleteFile('C:\WINDOWS\system32\config\system') then
MessageBox(0, pchar(SysErrorMessage(GetLastError)), '', 0);
// error: file is in use
end;
nret := RegReplaceKey(hk, nil, 'C:\WINDOWS\system32\config\testhive', 'C:\WINDOWS\system32\config\system');
if nret <> 0 then
MessageBox(0, pchar(SysErrorMessage(nret)), '', 0);
// error: file already exists
if SeqNr <> 0 then
EndRestore(SeqNr);
RegCloseKey(hk);
end;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果有人有类似的问题,我会回答我自己的问题。
错误出现在最后一个
RegReplaceKey()
参数中:它不应该指向实际和当前的配置单元注册表文件,而应该指向另一个临时文件:因此,在这一行之前,我们不需要删除 hive 文件本身,而是删除第二个临时文件(以确保它不存在):
如果这样做,一切正常,Windows 会替换由
hk
确定的密钥,这是从收到的RegOpenKey()
。In case someone has similar problem, I'll answer my own question.
The mistake was in last
RegReplaceKey()
parameter: it shouldn't point to actual and current hive registry file, but to another temp file:Consequently, prior to this line, we don't need to delete hive file itself, but the second temp file (to ensure it doesn't exist):
If done this way, everything works ok, and Windows replaces key determined by
hk
, which was received fromRegOpenKey()
.RegReplaceKey 将 Windows 设置为在重新启动 Windows 时使用支持注册表的文件。
您调用它并提供一个文件。
重新启动时它将使用它。
所以我怀疑这不是你想要的。
RegReplaceKey sets up windows to use the file backing the registry on restarting windows.
You call it and provide a file.
On restart it will use it.
So I suspect it's not what you want.