2017-01-27 5 views
-1

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

[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 (или вручную), ключ реестра выглядит следующим образом:

good key

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

bad key

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

+4

Это, вероятно, шестнадцатеричное представление. В Delphi вы должны написать $ 80000024. –

+0

@Uwe Raabe: Спасибо! Он работает так! – Sierra

+0

Это изменение влияет только на вашу программу. Вы должны решить проблему должным образом. –

ответ

0

Числовое значение в файле .reg кодируется как hex. Так как вы передаете целое число литерала 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; 
+0

Отлично, что также решает проблему «Не удалось установить защищенные данные», которую я иногда получал. – Sierra

Смежные вопросы