レジストリ値の種類

レジストリ値は、さまざまな形式でデータを格納できます。 たとえば、 RegSetValueEx 関数を呼び出してレジストリ値の下にデータを格納する場合は、次のいずれかの値を指定して、格納されるデータの種類を示すことができます。 レジストリ値を取得する場合、 RegQueryValueEx などの関数は、これらの値を使用して取得されたデータの種類を示します。

次のレジストリ値の型は Winnt.h で定義されています。

REG_BINARY 任意の形式のバイナリ データ。
REG_DWORD 32 ビットの数値。
REG_DWORD_LITTLE_ENDIAN リトル エンディアン形式の 32 ビット数値。 Windowsは、リトル エンディアン コンピューター アーキテクチャで実行するように設計されています。 したがって、この値は、Windows ヘッダー ファイルでREG_DWORDとして定義されます。
REG_DWORD_BIG_ENDIAN ビッグ エンディアン形式の 32 ビット数値。 一部のUNIX システムでは、ビッグ エンディアン アーキテクチャがサポートされています。
REG_EXPAND_SZ 環境変数 ("%PATH%" など) への未展開の参照を含む null で終わる文字列。 Unicode 関数と ANSI 関数のどちらを使用するかに応じて、Unicode または ANSI 文字列になります。 環境変数の参照を展開するには、 ExpandEnvironmentStrings 関数を 使用します。
REG_LINK REG_OPTION_CREATE_LINKで RegCreateKeyEx 関数を呼び出すことによって作成されたシンボリック リンクのターゲット パスを含む null で終わる Unicode 文字列。
REG_MULTI_SZ 空の文字列 (\0) で終わる null で終わる文字列のシーケンス。 String1\0String2\0String3\0LastString\0\0\0 の例を次に示します。最初の \0 は最初の文字列を終了し、最後の \0 の 2 番目の文字列は最後の文字列を終了し、最後の \0 はシーケンスを終了します。 最後のターミネータは文字列の長さに組み込む必要があることに注意してください。
REG_NONE 定義された値の型はありません。
REG_QWORD 64 ビットの数値。
REG_QWORD_LITTLE_ENDIAN リトル エンディアン形式の 64 ビット番号。 Windowsは、リトル エンディアン コンピューター アーキテクチャで実行するように設計されています。 したがって、この値は、Windows ヘッダー ファイルでREG_QWORDとして定義されます。
REG_SZ null で終わる文字列。 これは、Unicode 関数と ANSI 関数のどちらを使用するかに応じて、Unicode または ANSI 文字列のいずれかになります。

文字列の値

データにREG_SZ、REG_MULTI_SZ、またはREG_EXPAND_SZ型がある場合、文字列が適切な終端 null 文字で格納されていない可能性があります。 したがって、レジストリから文字列を読み取る場合は、使用する前に文字列が正しく終了していることを確認する必要があります。それ以外の場合は、バッファーが上書きされる可能性があります。 (REG_MULTI_SZ文字列には 2 つの終端 null 文字が必要です)。

レジストリに文字列を書き込む場合は、終端の null 文字 (\0) を含む文字列の長さを指定する必要があります。 一般的なエラーは、 strlen 関数を使用して文字列の長さを判断することですが、 strlen は文字列内の文字数のみを返し、終端の null は含めないことを忘れます。 したがって、文字列の長さは次のように計算する必要があります。 strlen( string ) + 1

REG_MULTI_SZ文字列は、長さ 0 の文字列で終わります。 したがって、シーケンスに長さ 0 の文字列を含めうことはできません。 空のシーケンスは、\0 のように定義されます。

次の例では、REG_MULTI_SZ文字列について説明します。

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

void SampleSzz(PTSTR pszz)
{
   _tprintf(_TEXT("\tBegin multi-sz string\n"));
   while (*pszz) 
   {
      _tprintf(_TEXT("\t\t%s\n"), pszz);
      pszz = pszz + _tcslen(pszz) + 1;
   }
   _tprintf(_TEXT("\tEnd multi-sz\n"));
}

int __cdecl main(int argc, char **argv)
{
   // Because the compiler adds a \0 at the end of quoted strings, 
   // there are two \0 terminators at the end. 

   _tprintf(_TEXT("Conventional multi-sz string:\n"));  
   SampleSzz(_TEXT("String1\0String2\0String3\0LastString\0"));

   _tprintf(_TEXT("\nTest case with no strings:\n"));  
   SampleSzz(_TEXT(""));

   return 0;
}

バイト形式

リトル エンディアン形式では、マルチバイト値は、最小バイト ("リトル エンド") から最大バイトまでメモリに格納されます。 たとえば、0x12345678値は、リトル エンディアン形式で (0x78 0x56 0x34 0x12) として格納されます。

ビッグ エンディアン形式では、マルチバイト値は、最上位バイト ("ビッグ エンド") から最下位バイトまでメモリに格納されます。 たとえば、0x12345678値はビッグ エンディアン形式で (0x12 0x34 0x56 0x78) として格納されます。