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 funzione RegSetValueEx , è possibile indicare il tipo di dati archiviati specificando uno dei tipi nella tabella seguente. Quando si recupera un valore del Registro di sistema, le funzioni come RegQueryValueEx usano questi tipi per indicare il tipo di dati recuperati.

I tipi di valore del winnt.h Registro di sistema seguenti sono definiti nel file di intestazione:

Valore Tipo
REG_BINARY Dati binari in qualsiasi forma.
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 la funzione ExpandEnvironmentStrings .
REG_LINK Stringa Unicode con terminazione Null contenente il percorso di destinazione di un collegamento simbolico creato chiamando la funzione RegCreateKeyEx con 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 l'ultima \0 termina la sequenza. Si noti che il carattere di terminazione finale deve essere inserito nella lunghezza della stringa.
REG_NONE Nessun tipo valore definito.
REG_QWORD Numero a 64 bit.
REG_QWORD_LITTLE_ENDIAN Numero a 64 bit in formato little-endian. 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 Specifica una stringa che termina con Null. It's either a Unicode or an ANSI string, depending on whether you use the Unicode or ANSI functions.

Valori stringa

Se i dati hanno il REG_SZtipo , REG_MULTI_SZo REG_EXPAND_SZ , la stringa potrebbe non essere 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 le 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 strlen funzione per determinare la lunghezza della stringa, ma per 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 REG_MULTI_SZ stringa 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 REG_MULTI_SZ stringa.

#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 (la piccola estremità) 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 multi-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 Travels di Gulliver.