Как я могу использовать RegReplaceKey ()? - PullRequest
0 голосов
/ 25 ноября 2011

Я пытаюсь заменить файл куста реестра с помощью 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;

Ответы [ 2 ]

1 голос
/ 27 ноября 2011

В случае, если у кого-то возникнет аналогичная проблема, я отвечу на свой вопрос.

Ошибка была в последнем параметре RegReplaceKey(): он должен указывать не на текущий и текущий файл реестра куста, а на другой временный файл :

  nret := RegReplaceKey(hk, nil, 'C:\WINDOWS\system32\config\testhive',
            'C:\WINDOWS\system32\config\testhive1');

Следовательно, перед этой строкой нам не нужно удалять сам файл куста, а только второй временный файл (чтобы убедиться, что он не существует):

  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().

0 голосов
/ 26 ноября 2011

RegReplaceKey настраивает окна для использования файла, поддерживающего реестр, при перезапуске окон. Вы называете это и предоставляете файл. При перезапуске он будет использовать его. Поэтому я подозреваю, что это не то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...