How to read the default value for a registry key

I have one Delphi XE2 project to work with a registry key. Therefore, I defined the following codes:

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; 

My requirement is to check the default value of "MyName" and show in Memo01. But nothing happens. So I tried another way:

 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; 

But it also does not work.

+4
source share
2 answers

There is no public key in your part.

 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; 
+11
source

You might want to use HKEY_CURRENT_USER instead of HKEY_LOCAL_MACHINE.

In Vista / 7/8, if the program does not start with administrator privileges, you actually do not get HKEY_LOCAL_MACHINE, you get a virtualized location. In essence, Windows gives you only what the user can see.

Using HKEY_LOCAL_MACHINE only leads to headaches. Windows has blocked this.

0
source

All Articles