.NET TIPS

レジストリの値のデータ型を判別するには?

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

 Windowsレジストリ(以降、レジストリ)の値を取得する方法について、「TIPS:レジストリの値を取得するには?」(以降、前回のTIPS)で解説した。このTIPSのサンプル・プログラムでは、取得するデータを文字列型(Stringクラスのオブジェクト)として取得していたが、実はレジストリ値のデータ型は文字列型だけではない。では、レジストリにはほかにどのようなデータ型が存在するのだろうか。

 まずは、前回のTIPSと同様の手順で、レジストリ・エディタを開き、レジストリのデータ型を確認してみよう。

 レジストリ・エディタの左側のツリー表示の中からキー「マイ コンピュータ\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework」を選択して、右側のリスト表示の中から[InstallRoot]という値を参照しよう。すると、この値の右側の[種類]の列に「REG_SZ」と表示されているはずだ。これがレジストリ値のデータ型で、「REG_SZ」は文字列型を意味する。次に、[DbgJITDebugLaunchSetting]という値を参照してみよう。すると、この値の[種類]には「REG_DWORD」が表示されているはずだ。これはDWORD型(数値型)を意味する。

レジストリ・エディタ
Windowsに標準でインストールされている。レジストリ・エディタを起動するには、[スタート]メニューの[ファイル名を指定して実行]をクリックして[ファイル名を指定して実行]ダイアログを起動し、そのダイアログのテキスト・ボックスに「regedit」を入力して実行する。
  レジストリ・キー[マイ コンピュータ\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]を選択する。
  選択中のキーがステータス・バーに表示される。この例では、[マイ コンピュータ\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]と表示されている。
  レジストリの値「InstallRoot」を参照する。この値には「.NET Frameworkのインストール・パス」が格納されている。
  レジストリ値のデータ型として「REG_SZ」(文字列型)が表示される。
  レジストリの値「DbgJITDebugLaunchSetting」を参照する。なお、この値には「JIT アタッチ デバッグの有効化」の設定が格納されている。
  レジストリ値のデータ型として「REG_DWORD」(DWORD型)が表示される。

Windowsレジストリのデータ型

 このようにレジストリの値にはデータ型がいくつか存在する。このデータ型の種類についてまとめておこう。

 レジストリのデータ型には、レジストリ特有の呼び方がある。例えば、文字列は「REG_SZ」と呼ばれ、.NET Frameworkの「Stringクラス(System名前空間)」に対応する。この「REG_SZ」の定義は「nullで終わるUnicode文字列値」である。そのほかの主なデータ型について、レジストリでの呼ばれ方、.NET Frameworkでの対応するデータ型、データ型の説明を以下の表にまとめた。なお、これですべてのデータ型ではないが、プログラムで使用する分においてはほとんどの場合で十分だろう。

データ型 レジストリ .NET Framework 説明
文字列値 REG_SZ System.String nullで終わる Unicode文字列値
DWORD値(数値) REG_DWORD System.Int32 4Bytes(32Bit)長の数値。数値の範囲は「0(0x00000000)」〜「4294967295(0xffffffff)」
バイナリ値 REG_BINARY System.Byte[] 未加工のバイナリ・データ
複数行文字列値 REG_MULTI_SZ System.String[] nullで終わる Unicode文字列の配列
展開可能な文字列値 REG_EXPAND_SZ System.String 環境変数(例えば「%USERNAME%」や「%SystemRoot%」など)を含むnullで終わるUnicode文字列
レジストリのデータ型の一覧表

 注意が必要なのは、REG_EXPAND_SZである。このデータ型は.NET FrameworkではStringクラス(System名前空間)に対応付けられている。しかし、REG_SZでも同様にStringクラスに対応付けられているため、両者の区別がつかない。よって、.NET FrameworkプログラムでStringクラスのオブジェクトを取得した場合は、環境変数を含むREG_EXPAND_SZの可能性があることを考慮にいれておかなければならない。

 実際に環境変数(例えば、「%SystemRoot%」など)を含んでいる場合は、その環境変数を「C:\Windows」などの本来の文字列に展開する必要がある。環境変数の展開を行うには、Environmentクラス(System名前空間)のExpandEnvironmentVariablesメソッドを呼び出せばよい。しかし、筆者が試した環境では、REG_EXPAND_SZの値を取得した段階ですでに環境変数が文字列に展開されて取得されて、展開を行う必要はなかった。

 なお、これらのデータ型の中でもっとも使われるのはREG_SZ値で、その次がREG_DWORD値である。それ以外のデータ型はほとんど使われることがないだろう。

レジストリ値のデータ型の判別

 それでは、これらのレジストリ値のデータ型を.NETプログラムで判別する手順を解説しよう。

 レジストリ値のデータ型の判別は難しくない。まずは、前回の「TIPS:レジストリの値を取得するには?」のサンプル・プログラムと同じように、レジストリの値をする。このとき、前回はStringクラスに型変換してレジストリの値のオブジェクトを取得したが、今回はObjectクラスのオブジェクトのまま取得する。次に、そのオブジェクトのGetTypeメソッドを呼び出す。これだけでレジストリの値のデータ型を取得できる。この「.NET Frameworkのデータ型」を先ほどの「レジストリのデータ型の一覧表」に照らし合わせて、実際の「レジストリのデータ型」を判別すればよい。では、このデータ型の取得を行うプログラムの一連の流れを説明しよう。

 まず、レジストリ・キーを開くために、RegistryKeyクラス(Microsoft.Win32名前空間)のOpenSubKeyメソッドを呼び出す。OpenSubKeyメソッドを呼び出すと、その戻り値としてRegistryクラス(Microsoft.Win32名前空間)のオブジェクトを取得できる。このオブジェクトのGetValueメソッドを呼び出し、その値のデータをObjectクラスのオブジェクトのまま取得する(前回のTIPSではStringクラスのオブジェクトとして取得した)。このオブジェクトのGetTypeメソッドを呼び出すと、そのオブジェクトの.NET Frameworkでのデータ型を取得できる。最後に、先ほど開いたレジストリ・キーを閉じるため、RegistryオブジェクトのCloseメソッドを呼び出す。

 この処理の実際のコードを以下に示す。

static void Main(string[] args)
{
  // 操作するレジストリ・キーの名前
  string rKeyName = @"SOFTWARE\Microsoft\.NETFramework";
  // 取得処理を行う対象となるレジストリの値の名前
  string rGetValueName = "DbgJITDebugLaunchSetting";

  // レジストリの取得
  try
  {
    // レジストリ・キーのパスを指定してレジストリを開く
    RegistryKey rKey = Registry.LocalMachine.OpenSubKey(rKeyName);

    // レジストリの値を取得
    object location = rKey.GetValue(rGetValueName, 2);

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

    // 取得したデータのデータ型を調べる
    Type dataType = location.GetType();

    // コンソールに取得したレジストリの値を表示
    Console.WriteLine(
      dataType.ToString() + ":" + location.ToString());
  }
  catch (NullReferenceException)
  {
    // レジストリ・キーまたは値が存在しない
    Console.WriteLine("レジストリ[" + rKeyName
      + "]の[" + rGetValueName + "]がありません!");
  }
}
レジストリから値のデータを取得するプログラム
サンプル・プログラム(C#:regtypet.cs、VB.NET:regtype.vb)のダウンロード

 上記のプログラムでは、ToStringメソッドを使って取得した値のデータ型を文字列化してコンソールに出力している。

 なお、上記のコードのRegistryKeyクラスのGetValueメソッドでは、第2パラメータを指定すると、値のデータが存在しないときにそのパラメータに指定したデータを戻り値として取得できる。なお、このパラメータは、「TIPS:レジストリの値を取得するには?」のサンプル・プログラムのように、指定せずにメソッドを呼び出すこともできる。End of Article

カテゴリ:クラス・ライブラリ 処理対象:レジストリ
使用ライブラリ:RegistryKeyクラス(Microsoft.Win32名前空間)
使用ライブラリ:Registryクラス(Microsoft.Win32名前空間)
使用ライブラリ:Objectクラス(System名前空間)
関連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 記事ランキング

本日 月間