我如何使用RegReplaceKey()?

时间:2011-11-25 17:19:45

标签: delphi winapi registry

我正在尝试使用RegReplaceKey()替换注册表配置单元文件(新文件是使用RegSaveKey() API创建的),但它返回“文件已存在”错误。如果我首先尝试删除原始配置单元文件,则会因“文件正在使用”错误而失败。

我已分配了适当的权限(SeBackupPrivilegeSeRestorePrivilege),用户是管理员,但没有运气。

有没有人知道可能出现什么问题?这是代码:

...

// 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;

2 个答案:

答案 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设置窗口以在重新启动窗口时使用支持注册表的文件。 你打电话给它并提供一个文件。 重启后它会使用它。 所以我怀疑这不是你想要的。