.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メソッドを呼び出す。
以上の処理を記述した実際のコード例を次に示す。
|
|
レジストリから値のデータを設定するサンプル・プログラム | |
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");
カテゴリ:クラス・ライブラリ 処理対象:レジストリ 使用ライブラリ:Registryクラス(Microsoft.Win32名前空間) 使用ライブラリ:RegistryKeyクラス(Microsoft.Win32名前空間) 関連TIPS:レジストリの値を取得するには? 関連TIPS:レジストリの値のデータ型を判別するには? |
|
「.NET TIPS」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|