Напишите значение 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;