Kayıt defteri değer türleri
kayıt defteri değeri, verileri dize değeri veya tamsayı değeri gibi çeşitli biçimlerden birinde depolayabilir. Verileri bir kayıt defteri değerinde depoladığınızda (örneğin, RegSetValueEx işlevini çağırarak), aşağıdaki tabloda yer alan türlerden birini belirterek depolanan veri türünü belirtebilirsiniz. Kayıt defteri değerini aldığınızda, RegQueryValueEx gibi işlevler alınan veri türünü belirtmek için bu türleri kullanır.
Aşağıdaki kayıt defteri değer türleri winnt.h
üst bilgi dosyasında tanımlanır:
Değer | Tür |
---|---|
REG_BINARY |
Herhangi bir biçimdeki ikili veriler. |
REG_DWORD |
32 bitlik bir sayı. |
REG_DWORD_LITTLE_ENDIAN |
küçük endian biçiminde 32 bitlik bir sayı. Windows, küçük endian bilgisayar mimarilerinde çalışacak şekilde tasarlanmıştır. Bu nedenle, bu değer Windows üst bilgi dosyalarında REG_DWORD olarak tanımlanır. |
REG_DWORD_BIG_ENDIAN |
büyük endian biçiminde 32 bitlik bir sayı. Bazı UNIX sistemleri büyük endian mimarileri destekler. |
REG_EXPAND_SZ |
Ortam değişkenlerine (örneğin, %PATH%) genişletilmemiş başvurular içeren null olarak sonlandırılan bir dize. Unicode veya ANSI işlevlerini kullanıp kullanmadığınıza bağlı olarak bir Unicode veya ANSI dizesidir. Ortam değişkeni başvurularını genişletmek için ExpandEnvironmentStringsişlevinikullanın. |
REG_LINK |
REG_OPTION_CREATE_LINKile RegCreateKeyEx işlevi çağrılarak oluşturulan sembolik bağlantının hedef yolunu içeren null olarak sonlandırılan unicode dizesi. |
REG_MULTI_SZ |
Boş bir dize (\0 ) tarafından sonlandırılan, null olarak sonlandırılan dize dizisi. Aşağıda bir örnek verilmiştir: String1\0String2\0String3\0LastString\0\0 . İlk \0 ilk dizeyi sonlandırır, ikinci son \0 son dizeyi sonlandırır ve son \0 diziyi sonlandırır. Son sonlandırıcının dizenin uzunluğuna hesaba katılmış olması gerektiğini unutmayın. |
REG_NONE |
Tanımlı değer türü yok. |
REG_QWORD |
64 bitlik bir sayı. |
REG_QWORD_LITTLE_ENDIAN |
Küçük endian biçiminde 64 bitlik bir sayı. Windows, küçük endian bilgisayar mimarilerinde çalışacak şekilde tasarlanmıştır. Bu nedenle, bu değer Windows üst bilgi dosyalarında REG_QWORD olarak tanımlanır. |
REG_SZ |
Null olarak sonlandırılan bir dize. Unicode veya ANSI işlevlerini kullanıp kullanmadığınıza bağlı olarak bir Unicode veya ANSI dizesidir. |
Dize değerleri
Verilerin REG_SZ
, REG_MULTI_SZ
veya REG_EXPAND_SZ
türü varsa, dize doğru sonlandıran null karakterlerle depolanmamış olabilir. Bu nedenle, kayıt defterinden bir dize okurken, kullanmadan önce dizenin düzgün şekilde sonlandırıldığından emin olmanız gerekir; aksi takdirde, bir arabelleğin üzerine yazabilir.
REG_MULTI_SZ
dizelerinde iki sonlandırıcı null karakter olması gerektiğini unutmayın.
Kayıt defterine bir dize yazdığınızda, sonlandırıcı null karakter (\0
) dahil olmak üzere dizenin uzunluğunu belirtmeniz gerekir. Yaygın bir hata, dizenin uzunluğunu belirlemek için strlen
işlevini kullanmaktır, ancak strlen
sonlandırıcı null değerini saymak yerine yalnızca dizedeki karakter sayısını döndürdüğünü unutmaktır. Bu nedenle, strlen(string) + 1
ile dizenin uzunluğunu hesaplamanız gerekir
REG_MULTI_SZ
dizesi, 0 uzunluk dizesiyle biter. Bu nedenle, diziye sıfır uzunluklu bir dize eklemek mümkün değildir. Boş bir sıra şu şekilde tanımlanabilir: \0
.
Aşağıdaki örnek bir REG_MULTI_SZ
dizesini gösterir.
#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;
}
Bayt biçimleri
küçük endian biçiminde, bellekte en düşük bayttan (küçük uç) en yüksek bayt'a kadar çok baytlı bir değer depolanır. Örneğin, 0x12345678
değeri küçük endian biçiminde 0x78 0x56 0x34 0x12
olarak depolanır.
büyük endian biçiminde, bellekte en yüksek bayttan (büyük uç) en düşük bayta kadar çok baytlı bir değer depolanır. Örneğin, 0x12345678
değeri büyük endian biçiminde 0x12 0x34 0x56 0x78
olarak depolanır.
Bu terimler, Jonathan Swift'in Gulliver'ın Travels hiciv romanı için samimi kültürel referanslardır.