2013-04-23 2 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

Q : RegQueryValueEx ('')를 사용해 보셨습니까? 빈 문자열 ('''') 만 있으면된다. Q :이 특정 키 *가 기본값을 가지고 있습니까? RegEdit에서 볼 수 있습니까? – paulsm4

+0

아니요 아니요. RegQueryValueEx 시도하지 않았습니다. 예, ** 기본값 **에 관한 것입니다. –

+1

하지만 @ 루비, 나는 이것을 (어제) 말했습니다 (http://stackoverflow.com/questions/16144046/how-to-set-value-of-registry-key#comment23064639_16144046). 두번. –

답변

11

다른 부분에는 Openkey가 없습니다.

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

'ReadString()'또는'WriteString()'을 호출하기 전에'OpenKey()'의 반환 값을 확인하십시오. 그렇지 않으면 키가 열리지 않으면 예외를 발생시킬 수 있습니다. –

+3

사실, 표준 관용구는'If OpenKey ... then'입니다. –

0

HKEY_LOCAL_MACHINE 대신 HKEY_CURRENT_USER를 사용하는 것이 좋습니다.

Vista/7/8에서는 관리자 권한으로 프로그램을 실행하지 않는 한 실제로 HKEY_LOCAL_MACHINE을 얻지 못하면 가상화 된 위치를 얻게됩니다. 본질적으로 Windows는 사용자가 볼 수있는 것만을 제공합니다.

HKEY_LOCAL_MACHINE을 사용하면 나중에 두통이 발생합니다. Windows가이를 잠그고 있습니다.

관련 문제