Напишите значение dword в Реестре с Delphi

В моей программе есть TWebBrowser, где пользователь может открывать все виды локальных документов. Чтобы избежать, например, того, что документ Word открывается в Word, а не в TWebBrowser (то есть в Internet Explorer), я успешно использую исправление в реестре, выполнив файл.reg с этой инструкцией:

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Word.Document.12] "BrowserFlags" = dword: 80000024

Я пытаюсь ввести эту инструкцию в самой программе Delphi, с помощью этого кода:

procedure RegOpenExplorer;
var
  reg: TRegistry;
begin
  reg:= TRegistry.Create;
  try
    reg.RootKey:=HKEY_LOCAL_MACHINE;
    reg.OpenKey('SOFTWARE\Classes\Word.Document.12\', true);
    reg.WriteInteger('BrowserFlags',80000024);
    reg.CloseKey;
  finally
    reg.Free;
  end;
end;

Это не работает, на самом деле эффект отменяет исправление.

При успешном обращении с файлом.reg (или вручную) ключ реестра выглядит следующим образом:

хороший ключ

Но с моим неудачным кодом Delphi ключ становится следующим:

плохой ключ

Разница заключается в числе в скобках, но это то, что Реестр вводит автоматически самостоятельно.

1 ответ

Решение

Числовое значение в .reg Файл закодирован как шестнадцатеричный. Поскольку вы передаете целочисленный литерал в WriteInteger(), вы должны префикс его с $ чтобы компилятор интерпретировал его как hex:

reg.WriteInteger('BrowserFlags', $80000024);

При этом обратите внимание, что вы пишете HKEY_LOCAL_MACHINEи, что более важно, вы открываете ключ с KEY_ALL_ACCESS права доступа (права доступа по умолчанию, которые TRegistry использует). Это потребует от вас запуска приложения с повышенными правами администратора, если это еще не сделано. Вы должны установить TRegistry.Access собственность на KEY_SET_VALUE вместо этого, и, возможно, даже писать HKEY_CURRENT_USER вместо.

procedure RegOpenExplorer;
var
  reg: TRegistry;
begin
  reg := TRegistry.Create(KEY_SET_VALUE);
  try
    reg.RootKey := HKEY_LOCAL_MACHINE; // or HKEY_CURRENT_USER
    if reg.OpenKey('SOFTWARE\Classes\Word.Document.12\', true) then
    try
      reg.WriteInteger('BrowserFlags', $80000024);
    finally
      reg.CloseKey;
    end;
  finally
    reg.Free;
  end;
end;
Другие вопросы по тегам