我正在尝试使用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;
答案 0 :(得分:1)
如果有人有类似的问题,我会回答我自己的问题。
错误出现在最后RegReplaceKey()
参数中:它不应指向实际和当前的配置单元注册表文件,而应指向另一个临时文件:
nret := RegReplaceKey(hk, nil, 'C:\WINDOWS\system32\config\testhive',
'C:\WINDOWS\system32\config\testhive1');
因此,在此行之前,我们不需要删除hive文件本身,而是删除第二个临时文件(以确保它不存在):
if FileExists('C:\WINDOWS\system32\config\testhive1') then
begin
if not DeleteFile('C:\WINDOWS\system32\config\testhive1') then
MessageBox(0, pchar(SysErrorMessage(GetLastError)), '', 0);
end;
如果以这种方式完成,一切正常,Windows替换了hk
确定的密钥,该密钥是从RegOpenKey()
收到的。
答案 1 :(得分:0)
RegReplaceKey设置窗口以在重新启动窗口时使用支持注册表的文件。 你打电话给它并提供一个文件。 重启后它会使用它。 所以我怀疑这不是你想要的。