使用 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;
我的程序有一个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;