.NET TIPS

レジストリの値を設定するには?

デジタルアドバンテージ
2004/02/20

 Windowsレジストリ(以降、レジストリ)は、アプリケーションの構成/設定情報などを格納するためのWindows特有のデータベースである。レジストリ値を取得する方法については「TIPS:レジストリの値を取得するには?」で解説している。本稿では、レジストリ値を設定する方法を紹介する。

 「TIPS:レジストリの値を取得するには?」で解説したように、レジストリの値を取得するにはRegistryKeyクラス(Microsoft.Win32名前空間)のGetValueメソッドを呼び出す。一方、レジストリの値の設定では、このメソッドの代わりにRegistryKeyクラスのSetValueメソッドを呼び出す。値の取得がGetValueメソッドで、値の設定がSetValueメソッドである。

 しかし、レジストリの値の設定はGetValueメソッドをSetValueメソッドに置き換えただけでは動作しない。なぜなら、SetValueメソッドを呼び出すために事前にRegistryKeyクラスのOpenSubkeyメソッドを使ってレジストリ・キーを開くと、そのレジストリ・キーが読み取り専用で開かれてしまうからだ。SetValueメソッドを使うには、レジストリ・キーを書き込み可能な状態で開かなければならない。

 これを行うには、OpenSubkeyメソッドの第2パラメータ(書き込みアクセス許可)にtrueを指定するか、もしくはRegistryKeyクラスのCreateSubkeyメソッドを使用する。この2つのメソッドの違いは、OpenSubkeyメソッドは既存のキーを開くだけなのに対し、CreateSubkeyメソッドはキーが存在しない場合は新たにキーを作成してから開くことだ。もしキーが確実に存在するかどうか分からない場合は、CreateKeyメソッドでレジストリ・キーを開く方がよいだろう。

 レジストリの値を取得する手順は次のようになる。まずレジストリ・キーを開くために、RegistryKeyクラスのCreateSubkeyメソッドを呼び出す。このメソッドを呼び出すには、RegistryKeyクラスのオブジェクトが必要なので、Registryクラスの静的フィールドであるLocalMachineオブジェクトやCurrentUserオブジェクトを利用する。なお前述したように、レジストリ・キーが既存ならば、CreateSubkeyメソッドの代わりにOpenSubKeyメソッドを書き込み可能モードで呼び出してもよい。

 CreateSubkeyメソッド(またはOpenSubKeyメソッド)はRegistryクラスのオブジェクトをその戻り値として返すので、次にそのオブジェクトのSetValueメソッドを呼び出す。これにより、その値のデータを設定できる。このSetValueメソッドは、設定したいレジストリ値の「名前(第1パラメータ)」と「データ(第2パラメータ)」を指定して呼び出す必要がある。

 最後に、先ほど開いたレジストリ・キーを閉じるため、RegistryオブジェクトのCloseメソッドを呼び出す。

 以上の処理を記述した実際のコード例を次に示す。

static void Main(string[] args)
{
  // 操作するレジストリ・キーの名前
  string rKeyName = @"SOFTWARE\Insider.NET\.NET TIPS";

  // 設定処理を行う対象となるレジストリの値の名前
  string rSetValueName = "TestValue";

  // 設定する値のデータ
  string  location = "RegistryData";  // REG_SZ型

  // レジストリの設定と削除
  try
  {
    // レジストリ・キーを新規作成して開く
    RegistryKey rKey = Registry.LocalMachine.CreateSubKey(rKeyName);

    // レジストリの値を設定
    rKey.SetValue(rSetValueName, location);

    // 開いたレジストリを閉じる
    rKey.Close();

    //設定したレジストリの値をコンソールに表示
    Console.WriteLine(location);
  }
  catch (Exception ex)
  {
    // レジストリ・キーが存在しない
    Console.WriteLine(ex.Message);
  }
}
レジストリから値のデータを設定するサンプル・プログラム
サンプル・プログラム(C#:regset.cs、VB.NET:regset.vb)のダウンロード

 RegistryKeyクラスのSetValueメソッドについてもう少し詳しく解説しておこう。

 SetValueメソッドに指定するパラメータは、「名前(第1パラメータ)」と「データ(第2パラメータ)」の2つである。この第2パラメータに設定可能なデータの「データ型」には、REG_SZ型/REG_DWORD型/REG_BINARY型/REG_MULTI_SZ型の4つがある。もしREG_SZ型を設定したい場合には、SetValueメソッドの第2パラメータ(レジストリ値の「データ」)に、System.String型のオブジェクトを指定する。これは上記のプログラムのとおりだ。ほかのデータ型でも同様に、REG_DWORD型ならSystem.Int32型、REG_BINARY型ならSystem.Byte[]型、REG_MULTI_SZ型ならString[]型のオブジェクトを指定する。なお、これらのレジストリのデータ型と.NET Frameworkのデータ型の組み合わせについては「レジストリの値のデータ型を判別するには?」の表で解説しているので、詳しくはそちらを参照してほしい。

 またレジストリの値には、レジストリ・キーごとに1つだけ割り当てられるデフォルト値が存在する。通常これはレジストリ・エディタでは「(既定値)」と表示される。このデフォルト値を設定するには、SetValueメソッドの第1パラメータであるレジストリ値の「名前」に空文字(「""」)を指定すればよい。なおこの第1パラメータには「null」を指定することも可能だが、レジストリ値を削除するRegistryKeyクラスのDeleteValueメソッドでレジストリ値の名前に「null」を指定するとエラーになってしまうため、「null」ではなく空文字「""」を使うことをお勧めする。

 なお、ここでDeleteValueメソッドが出てきたので「レジストリ値を操作するメソッド」をまとめておくと、レジストリ値を設定するのがSetValueメソッド、取得するのがGetValueメソッド、削除するのがDeleteValueメソッドである。これらのメソッドは、いずれもRegistryKeyクラスのメソッドだ。

 ついでにレジストリ・キーの作成や削除についてもまとめておく。「レジストリ・キーを操作するメソッド」には、レジストリ・キーを開くOpenSubKeyメソッド、作成して開くCreateSubKeyメソッド、削除するDeleteSubKeyメソッド、さらにレジストリ・キーの下位にあるすべてのキー(サブ・キー)も含めて一括でレジストリ・キーを削除するDeleteSubKeyTreeメソッドがある。これらのいずれのメソッドも、RegistryKeyクラスのメソッドだ。

 DeleteKeyメソッドやDeleteSubKeyTreeメソッドは、レジストリ・キーを開くわけではないのでCloseメソッドを呼び出す必要はない。これらのメソッドは単独で呼び出すことができる。例えば、

Registry.LocalMachine.DeleteSubKey(@"SOFTWARE\Insider.NET\.NET TIPS");

のようにして呼び出すことが可能だ。End of Article

カテゴリ:クラス・ライブラリ 処理対象:レジストリ
使用ライブラリ:Registryクラス(Microsoft.Win32名前空間)
使用ライブラリ:RegistryKeyクラス(Microsoft.Win32名前空間)
関連TIPS:レジストリの値を取得するには?
関連TIPS:レジストリの値のデータ型を判別するには?
 
この記事と関連性の高い別の.NET TIPS
レジストリの値を列挙するには?
レジストリの値を取得するには?
レジストリの値のデータ型を判別するには?
レジストリのキーを列挙するには?
レジストリの値のデータ型を明示的に識別・設定するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間