レジストリ値の型

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

ヘッダー ファイルでは、次のレジストリ値の型が winnt.h 定義されています。

Type
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 のは最初の文字列を終了し、2 番目から最後 \0 の文字列は最後の文字列を終了し、最後 \0 の文字列はシーケンスを終了します。 最後のターミネータは文字列の長さに組み込む必要があることに注意してください。
REG_NONE 値の型が定義されていません。
REG_QWORD 64 ビット数値。
REG_QWORD_LITTLE_ENDIAN リトル エンディアン形式の 64 ビット数値。 Windows is designed to run on little-endian computer architectures. Therefore, this value is defined as REG_QWORD in the Windows header files.
REG_SZ null で終わる文字列。 It's either a Unicode or an ANSI string, depending on whether you use the Unicode or ANSI functions.

文字列値

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

レジストリに文字列を書き込む場合は、終端の null 文字 (\0) を含む文字列の長さを指定する必要があります。 一般的なエラーは、 関数を strlen 使用して文字列の長さを判断することですが、終了する null をカウントするのではなく、文字列内の文字数のみを返すことを strlen 忘れてしまいます。 そのため、 を使用して文字列の長さを計算する必要があります 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 は big-endian 形式で として 0x12 0x34 0x56 0x78 格納されます。

これらの用語は、ジョナサン・スウィフトの風刺的な小説 ガリバーズ・トラベルズへの軽い心の文化的言及です。