使用 Delphi 在注册表中写入双字值

Write dword value in Registry with Delphi

我的程序有一个TWebBrowser,用户可以在其中打开各种本地文档。例如,为了避免在 Word 中而不是在 TWebBrowser(也就是说,在 Internet Explorer 中)中打开 Word 文档,我通过使用以下指令执行 .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代码,关键就变成了这样:

不同的是括号中的数字,但这是注册表自动引入的。

.reg 文件中的数值被编码为十六进制。由于您将整数文字传递给 WriteInteger(),因此您需要在其前面加上 $ 前缀,以使编译器将其解释为十六进制:

reg.WriteInteger('BrowserFlags', 000024);

话虽如此,请注意,您正在写入 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', 000024);
    finally
      reg.CloseKey;
    end;
  finally
    reg.Free;
  end;
end;