Tipi di valore del Registro di sistema
Un valore del Registro di sistema può archiviare i dati in uno dei diversi formati, ad esempio un valore stringa o un valore intero. Quando si archiviano dati in un valore del Registro di sistema, ad esempio chiamando la funzioneregSetValueEx, è possibile indicare il tipo di dati archiviati specificando uno dei tipi nella tabella seguente. Quando si recupera un valore del Registro di sistema, funzioni come RegQueryValueEx usare questi tipi per indicare il tipo di dati recuperati.
I tipi di valore del Registro di sistema seguenti sono definiti nel file di intestazione winnt.h
:
Valore | Digitare |
---|---|
REG_BINARY |
Dati binari in qualsiasi formato. |
REG_DWORD |
Numero a 32 bit. |
REG_DWORD_LITTLE_ENDIAN |
Numero a 32 bit in formato little-endian . Windows è progettato per l'esecuzione in architetture di computer little-endian. Pertanto, questo valore viene definito come REG_DWORD nei file di intestazione di Windows. |
REG_DWORD_BIG_ENDIAN |
Numero a 32 bit in formato big-endian . Alcuni sistemi UNIX supportano architetture big-endian. |
REG_EXPAND_SZ |
Stringa con terminazione Null che contiene riferimenti non espansi alle variabili di ambiente, ad esempio %PATH%. Si tratta di una stringa Unicode o ANSI, a seconda che si usino le funzioni Unicode o ANSI. Per espandere i riferimenti alle variabili di ambiente, usare funzione ExpandEnvironmentStrings. |
REG_LINK |
Stringa Unicode con terminazione Null contenente il percorso di destinazione di un collegamento simbolico creato chiamando la funzioneregCreateKeyExcon REG_OPTION_CREATE_LINK. |
REG_MULTI_SZ |
Sequenza di stringhe con terminazione Null, terminate da una stringa vuota (\0 ). Di seguito è riportato un esempio: String1\0String2\0String3\0LastString\0\0 . Il primo \0 termina la prima stringa, il secondo dall'ultimo \0 termina l'ultima stringa e il \0 finale termina la sequenza. Si noti che il carattere di terminazione finale deve essere inserito nella lunghezza della stringa. |
REG_NONE |
Nessun tipo di valore definito. |
REG_QWORD |
Numero a 64 bit. |
REG_QWORD_LITTLE_ENDIAN |
Numero a 64 bit in formato little-endian. Windows è progettato per l'esecuzione in architetture di computer little-endian. Pertanto, questo valore viene definito come REG_QWORD nei file di intestazione di Windows. |
REG_SZ |
Stringa con terminazione Null. Si tratta di una stringa Unicode o ANSI, a seconda che si usino le funzioni Unicode o ANSI. |
Valori stringa
Se i dati hanno il tipo REG_SZ
, REG_MULTI_SZ
o REG_EXPAND_SZ
, è possibile che la stringa non sia stata archiviata con i caratteri null di terminazione appropriati. Pertanto, quando si legge una stringa dal Registro di sistema, è necessario assicurarsi che la stringa venga terminata correttamente prima di usarla; in caso contrario, potrebbe sovrascrivere un buffer. Si noti che REG_MULTI_SZ
stringhe devono avere due caratteri Null di terminazione.
Quando si scrive una stringa nel Registro di sistema, è necessario specificare la lunghezza della stringa, incluso il carattere null di terminazione (\0
). Un errore comune consiste nell'usare la funzione strlen
per determinare la lunghezza della stringa, ma dimenticare che strlen
restituisce solo il numero di caratteri nella stringa, senza contare il valore Null di terminazione. È quindi consigliabile calcolare la lunghezza della stringa con strlen(string) + 1
Una stringa di REG_MULTI_SZ
termina con una stringa di lunghezza 0. Pertanto, non è possibile includere una stringa di lunghezza zero nella sequenza. Una sequenza vuota viene definita come segue: \0
.
Nell'esempio seguente viene descritta una stringa 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;
}
Formati di byte
In formato little-endian, un valore a più byte viene archiviato in memoria dal byte più basso (il piccolo) al byte più alto. Ad esempio, il valore 0x12345678
viene archiviato come 0x78 0x56 0x34 0x12
in formato little-endian.
In formato big-endian, un valore a più byte viene archiviato in memoria dal byte più alto (il big end) al byte più basso. Ad esempio, il valore 0x12345678
viene archiviato come 0x12 0x34 0x56 0x78
in formato big-endian.
Questi termini sono riferimenti culturali leggeri al romanzo satirico di Jonathan Swift Viaggi di Gulliver.