次の方法で共有


レジストリ値の型

レジストリ値 は、文字列値や整数値など、複数の形式のいずれかでデータを格納できます。 たとえば、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 は最初の文字列を終了し、2 番目から最後の \0 は最後の文字列を終了し、最後の \0 はシーケンスを終了します。 最後のターミネータは文字列の長さに組み込む必要があることに注意してください。
REG_NONE 定義された値型がありません。
REG_QWORD 64 ビット数値。
REG_QWORD_LITTLE_ENDIAN リトル エンディアン形式の 64 ビット数値。 Windows は、リトル エンディアン コンピューター アーキテクチャで実行するように設計されています。 したがって、この値は Windows ヘッダー ファイルで REG_QWORD として定義されます。
REG_SZ null で終わる文字列。 Unicode 関数と ANSI 関数のどちらを使用するかに応じて、Unicode または ANSI 文字列のいずれかになります。

文字列値

データに REG_SZREG_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 として格納されます。

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