6

レジストリ キーを操作する Delphi XE2 プロジェクトが 1 つあります。だから私は次のコードを定義しました:

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;

しかし、それも機能していません。

4

2 に答える 2

13

あなたのelse部分には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;
于 2013-04-23T18:43:14.853 に答える
0

HKEY_LOCAL_MACHINE の代わりに HKEY_CURRENT_USER の使用を検討することをお勧めします。

Vista/7/8 では、プログラムが管理者権限を使用して実行されない限り、実際には HKEY_LOCAL_MACHINE を取得せず、仮想化された場所を取得します。基本的に、Windows はユーザーだけが見ることができるものを提供します。

HKEY_LOCAL_MACHINE を使用すると、後で頭痛の種になるだけです。Windowsはそれをロックダウンしています。

于 2013-04-24T16:56:23.597 に答える