.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」を入力して実行する。 | ||||||||||||||||||
|
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メソッドを呼び出す。
この処理の実際のコードを以下に示す。
|
|
レジストリから値のデータを取得するプログラム | |
サンプル・プログラム(C#:regtypet.cs、VB.NET:regtype.vb)のダウンロード |
上記のプログラムでは、ToStringメソッドを使って取得した値のデータ型を文字列化してコンソールに出力している。
なお、上記のコードのRegistryKeyクラスのGetValueメソッドでは、第2パラメータを指定すると、値のデータが存在しないときにそのパラメータに指定したデータを戻り値として取得できる。なお、このパラメータは、「TIPS:レジストリの値を取得するには?」のサンプル・プログラムのように、指定せずにメソッドを呼び出すこともできる。
カテゴリ:クラス・ライブラリ 処理対象:レジストリ 使用ライブラリ:RegistryKeyクラス(Microsoft.Win32名前空間) 使用ライブラリ:Registryクラス(Microsoft.Win32名前空間) 使用ライブラリ:Objectクラス(System名前空間) 関連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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|