Delphi 如何使用RegReplaceKey()?

Delphi 如何使用RegReplaceKey()?,delphi,winapi,registry,Delphi,Winapi,Registry,我试图使用RegReplaceKey()(新文件是使用RegSaveKey()API创建的)替换注册表配置单元文件,但返回时出现“文件已存在”错误。如果我先尝试删除原始配置单元文件,它将失败,并出现错误“文件正在使用” 我已经分配了适当的权限(SeBackupPrivilege和SeRestorePrivilege),用户是管理员,但运气不好 有没有人知道会出什么问题?代码如下: ... // Setting privileges here, everything goes okay nre

我试图使用
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;
。。。
//在这里设置权限,一切正常
nret:=RegOpenKey(HKEY_LOCAL_MACHINE,'system',hk);
如果nret=0,则
开始
雷福斯基(香港),;
如果文件存在('C:\WINDOWS\system32\config\testhive'),则
删除文件('C:\WINDOWS\system32\config\testhive');
nret:=RegSaveKey(hk,'C:\WINDOWS\system32\config\testhive',nil);
如果nret为0,则
MessageBox(0,pchar(SysErrorMessage(nret)),“”,0);
//到目前为止没有错误,已创建新文件
SeqNr:=StartRestore(“在注册表优化之前”);
如果文件存在('C:\WINDOWS\system32\config\system'),则
开始
filesetr('C:\WINDOWS\system32\config\system',0);
如果不删除文件('C:\WINDOWS\system32\config\system'),则
MessageBox(0,pchar(SysErrorMessage(GetLastError)),“”,0);
//错误:文件正在使用中
结束;
nret:=重新放置密钥(hk,nil,'C:\WINDOWS\system32\config\testhive','C:\WINDOWS\system32\config\system');
如果nret为0,则
MessageBox(0,pchar(SysErrorMessage(nret)),“”,0);
//错误:文件已存在
如果SeqNr为0,则
EndRestore(SeqNr);
雷杰基(香港),;
结束;

RegReplaceKey将windows设置为在重新启动windows时使用支持注册表的文件。 你调用它并提供一个文件。 重新启动时,它将使用它。
所以我怀疑这不是你想要的。

如果有人有类似的问题,我会回答我自己的问题

错误出现在最后一个
RegReplaceKey()
参数中:它不应该指向实际和当前的配置单元注册表文件,而是指向另一个临时文件

  nret := RegReplaceKey(hk, nil, 'C:\WINDOWS\system32\config\testhive',
            'C:\WINDOWS\system32\config\testhive1');
因此,在这一行之前,我们不需要删除配置单元文件本身,而是删除第二个临时文件(以确保它不存在):


如果这样做,一切正常,Windows将替换从
RegOpenKey()

收到的由
hk
确定的密钥。谢谢您的回答。重新启动后更换会很好,但它不起作用。正如我上面所说的,调用失败,出现“文件已经存在”错误,重新启动后它什么也不做。
  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;