레지스트리 값 형식
레지스트리 값 문자열 값 또는 정수 값과 같은 여러 형식 중 하나로 데이터를 저장할 수 있습니다. 예를 들어 RegSetValueEx 함수를 호출하여 레지스트리 값에 데이터를 저장하는 경우 아래 표의 형식 중 하나를 지정하여 저장되는 데이터 형식을 나타낼 수 있습니다. 레지스트리 값을 검색할 때 RegQueryValueEx와 같은 함수는 이러한 형식을 사용하여 검색된 데이터 형식을 나타낼 있습니다.
다음 레지스트리 값 형식은 winnt.h
헤더 파일에 정의됩니다.
값 | 형 |
---|---|
REG_BINARY |
모든 형식의 이진 데이터입니다. |
REG_DWORD |
32비트 숫자입니다. |
REG_DWORD_LITTLE_ENDIAN |
little-endian 형식의 32비트 숫자. Windows는 little-endian 컴퓨터 아키텍처에서 실행되도록 설계되었습니다. 따라서 이 값은 Windows 헤더 파일에서 REG_DWORD 정의됩니다. |
REG_DWORD_BIG_ENDIAN |
big-endian 형식의 32비트 숫자. 일부 UNIX 시스템은 빅엔디안 아키텍처를 지원합니다. |
REG_EXPAND_SZ |
환경 변수(예: %PATH%)에 대한 미공개 참조를 포함하는 null로 끝나는 문자열입니다. 유니코드 또는 ANSI 함수를 사용하는지 여부에 따라 유니코드 또는 ANSI 문자열입니다. 환경 변수 참조를 확장하려면 ExpandEnvironmentStrings 함수를 사용합니다. |
REG_LINK |
REG_OPTION_CREATE_LINK사용하여 RegCreateKeyEx 함수를 호출하여 만든 기호 링크의 대상 경로를 포함하는 null로 끝나는 유니코드 문자열입니다. |
REG_MULTI_SZ |
빈 문자열(\0 )로 종료되는 null로 끝나는 문자열 시퀀스입니다.
String1\0String2\0String3\0LastString\0\0 예는 다음과 같습니다. 첫 번째 \0 첫 번째 문자열을 종료하고 마지막 \0 마지막 문자열을 종료하고 마지막 \0 시퀀스를 종료합니다. 마지막 종결자는 문자열의 길이로 계산되어야 합니다. |
REG_NONE |
정의된 값 형식이 없습니다. |
REG_QWORD |
64비트 숫자입니다. |
REG_QWORD_LITTLE_ENDIAN |
little-endian 형식의 64비트 숫자입니다. Windows는 little-endian 컴퓨터 아키텍처에서 실행되도록 설계되었습니다. 따라서 이 값은 Windows 헤더 파일에서 REG_QWORD 정의됩니다. |
REG_SZ |
null로 끝나는 문자열입니다. 유니코드 또는 ANSI 함수를 사용하는지 여부에 따라 유니코드 또는 ANSI 문자열입니다. |
문자열 값
데이터에 REG_SZ
, REG_MULTI_SZ
또는 REG_EXPAND_SZ
형식이 있는 경우 문자열이 적절한 종료 null 문자와 함께 저장되지 않았을 수 있습니다. 따라서 레지스트리에서 문자열을 읽을 때 문자열을 사용하기 전에 문자열이 제대로 종료되었는지 확인해야 합니다. 그렇지 않으면 버퍼를 덮어쓸 수 있습니다.
REG_MULTI_SZ
문자열에는 두 개의 종료 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;
}
바이트 형식
little-endian 형식멀티 바이트 값은 가장 낮은 바이트(작은 끝)에서 가장 높은 바이트까지 메모리에 저장됩니다. 예를 들어 0x12345678
값은 little-endian 형식으로 0x78 0x56 0x34 0x12
저장됩니다.
big-endian 형식멀티 바이트 값은 가장 높은 바이트(빅 엔드)에서 가장 낮은 바이트까지 메모리에 저장됩니다. 예를 들어 0x12345678
값은 big-endian 형식으로 0x12 0x34 0x56 0x78
저장됩니다.
이러한 용어는 걸리버의 여행 조나단 스위프트의 풍자 소설에 대한 가벼운 문화적 언급입니다.