2013-04-23 3 views
4

У меня есть один проект Delphi XE2 для работы с ключом реестра. Таким образом, я определил следующие коды:Как читать значение по умолчанию для ключа реестра

procedure TMainForm.BitBtn01Click(Sender: TObject); 
var 
    RegistryEntry: TRegistry; 
begin 
    RegistryEntry := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY); 
    RegistryEntry.RootKey:= HKEY_LOCAL_MACHINE; 
    if (not RegistryEntry.KeyExists('Software\MyCompanyName\MyName\')) then 
    begin 
     RegistryEntry.Access:= KEY_WRITE or KEY_WOW64_64KEY; 
     RegistryEntry.OpenKey('Software\MyCompanyName\MyName\',True); 
     RegistryEntry.WriteString('', 'MyFirstProject'); 
    end 
    else 
    begin 
     Memo01.Lines.Add(RegistryEntry.ReadString('(Default)')); //Not Working 
     Memo01.Lines.Add(RegistryEntry.ReadString('')); //Not Working 
     Memo01.Lines.Add(RegistryEntry.ReadString('@')); //Not Working 
    end; 
    RegistryEntry.CloseKey(); 
    RegistryEntry.Free; 
end; 

Мое требование, чтобы проверить значение по умолчанию «MyName» и показать в Memo01. Но ничего не происходит. Поэтому я пробовал еще один способ:

procedure TMainForm.BitBtn01Click(Sender: TObject); 
var 
    RegistryEntry: TRegistry; 
    RegistryString: string; 
begin 
    RegistryEntry := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY); 
    RegistryEntry.RootKey:= HKEY_LOCAL_MACHINE; 
    if (not RegistryEntry.KeyExists('Software\MyCompanyName\MyName\')) then 
    begin 
     RegistryEntry.Access:= KEY_WRITE or KEY_WOW64_64KEY; 
     RegistryEntry.OpenKey('Software\MyCompanyName\MyName\',True); 
     RegistryEntry.WriteString('', 'MyFirstProject'); 
    end 
    else 
    begin 
     RegistryString := RegistryEntry.ReadString('(Default)'); //Not Working 
     RegistryString := RegistryEntry.ReadString(''); //Not Working 
     RegistryString := RegistryEntry.ReadString('@'); //Not Working 
     Memo01.Lines.Add(RegistryString); 
    end; 
    RegistryEntry.CloseKey(); 
    RegistryEntry.Free; 
end; 

Но он также не работает.

+0

Вопрос: Вы пробовали RegQueryValueEx ('')? Пустая строка ('' '') должна быть все, что вам нужно. Вопрос: Вы уверены, что данный конкретный ключ * имеет значение по умолчанию? Вы можете видеть это в RegEdit? – paulsm4

+0

Нет нет. Я не пробовал RegQueryValueEx. Да, все имеет значение ** Значение по умолчанию **. –

+1

Но, @Rubi, я сказал вам это [вчера] (http://stackoverflow.com/questions/16144046/how-to-set-value-of-registry-key#comment23064639_16144046). Дважды. –

ответ

11

В вашей части нет открытого ключа.

Const 
    C_KEY='Software\MyCompanyName\MyName\'; 
var 
    RegistryEntry: TRegistry; 
    RegistryString: string; 
begin 
    RegistryEntry := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY); 
    try 
    RegistryEntry.RootKey := HKEY_LOCAL_MACHINE; 
    if (not RegistryEntry.KeyExists(C_KEY)) then 
    begin 
     RegistryEntry.Access := KEY_WRITE or KEY_WOW64_64KEY; 
     if RegistryEntry.OpenKey(C_KEY, true) then 
     RegistryEntry.WriteString('', 'MyFirstProject'); 
    end 
    else 
    begin 
     RegistryEntry.Access := KEY_READ or KEY_WOW64_64KEY; 
     if RegistryEntry.OpenKey(C_KEY, false) then 
     begin 
     Memo01.Lines.Add(RegistryEntry.ReadString('')); 
     end; 
    end; 
    RegistryEntry.CloseKey(); 
    finally 
    RegistryEntry.Free; 
    end; 
end; 
+0

Спасибо .. Большое спасибо. –

+1

Убедитесь, что вы проверяете возвращаемое значение 'OpenKey()' для отказа перед вызовом 'ReadString()' или 'WriteString()', иначе они могут создавать исключения, если ключ не открыт. –

+3

Действительно, стандартная идиома - 'if OpenKey ... then' –

0

Вы могли бы рассмотреть возможность использования HKEY_CURRENT_USER вместо HKEY_LOCAL_MACHINE.

В Vista/7/8, если программа не запускается с правами администратора, вы фактически не получаете HKEY_LOCAL_MACHINE, вы получаете виртуализованное местоположение. По сути, Windows дает вам только то, что может видеть пользователь.

Использование HKEY_LOCAL_MACHINE приводит только к головной боли. Windows заблокировала это.

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