2012-04-01 5 views
3

Ich versuche, die Größe einer LPTSTR-Variablen und einer CONST CHAR-Variablen mit dem folgenden Code zu ermitteln, aber ich kann die richtige Größe nicht ermitteln.Größe von LPTSTR oder CHAR * mit Hexadezimalwerten ermitteln

Ich soll 20 bekommen, aber stattdessen bekomme ich 0 für die const char * Variable und 4 für die LPTSTR Variable.

const char *var1 = "\x00\x00\x00\x00" 
        "\x00\x00\x00\x00" 
        "\x02\x00\x00\x00" 
        "\x5B\xE0\x5B\xE0" 
        "\x00\x00\x00\x00"; 

LPTSTR var2 =  "\x00\x00\x00\x00" 
        "\x00\x00\x00\x00" 
        "\x02\x00\x00\x00" 
        "\x5B\xE0\x5B\xE0" 
        "\x00\x00\x00\x00"; 

printf("%d", sizeof(var1)); // this outputs 0 
printf("%d", sizeof(var2)); // this outputs 4 

Ich brauche die Größe des Wertes, um es in der Windows-Registrierung einfügen als Binärdaten (REG_BINARY) unter Verwendung der folgenden Funktion:

lRes = RegSetValueEx(hMykey, "Scancode Map", 0, REG_BINARY, (LPBYTE) var2, sizeof(var2)); 
+1

Wie erhalten Sie 0 für die erste? Scheint nicht richtig. – cnicutar

+0

Sorry, ich bekomme 4 für sizeof (var1) – hardyRocks

Antwort

3

Der Typ var1 ist const char*, und die Größe var2 ist LPTSTR (das ist Ihr Fall ist ein Alias ​​zu char*). sizeof var1 entspricht sizeof (const char*), nicht die Größe des Zeichenarrays, auf das es zeigt. Auf Ihrer Plattform ist sizeof (char*) 4 Byte.

Sie stattdessen tun könnte:

const char var1[] = { 0x00, 0x00, ..., 0x00 }; 

Und dann sizeof var1 würde sizeof (const char[20]), gleichwertig sein, das ist das, was Sie wollen.

+0

Ja, ich bin jetzt in der Lage, die Größe zu bekommen. Vielen Dank. – hardyRocks

+0

Aber wie const char var1 [] mit cont Char * Wert zu initialisieren, die ich durch den Funktionsparameter bekomme? – hardyRocks

+0

@hardyRocks: Wenn Sie es durch einen Funktionsparameter erhalten, muss der Anrufer die Größe übergeben. – jamesdlin

0

Sie benötigen

const char var1[20] = "\x00\x00\x00\x00" 
       "\x00\x00\x00\x00" 
       "\x02\x00\x00\x00" 
       "\x5B\xE0\x5B\xE0" 
       "\x00\x00\x00\x00"; 
zu tun
+0

Ja, aber der Wert wird dynamisch sein, kann es variieren. – hardyRocks

+0

Nun, du kannst tun, was @jamesdlin vorschlägt. Aber wenn die Werte dynamisch sind, sollten Sie Ihren Speicher vielleicht auch dynamisch zuweisen. – Griffin

+1

@hardyRocks: Wenn die Array-Größe dynamisch ist, müssen Sie Speicher dynamisch zuweisen und müssen die Größe selbst verfolgen. – jamesdlin

0

Alternative:

#define STR "\x00\x00\x00\x00" \ 
      "\x00\x00\x00\x00" \ 
      "\x02\x00\x00\x00" \ 
      "\x5B\xE0\x5B\xE0" \ 
      "\x00\x00\x00\x00" 
const char * var1 = STR; 

printf("%d\n", sizeof(STR)-1); 

sicher nicht das, was der Zweck dieser Variablen, aber Sie können auch tun

lres = RegSetValueEx (hMykey "Scancode Map", 0, REG_BINARY, (LPBYTE) STR, Größe von (STR) -1);

direkt.

+0

Der Wert wird dynamisch sein, in der Tat wird er durch den Parameter einer Funktion mehrmals mit verschiedenen Werten gesendet. Also kann ich den Wert nicht definieren. Die Funktion ruft die Funktion RegSetValueEx mit dem übergebenen Wert und der Größe des Werts auf. – hardyRocks

+0

Wenn dies der Fall ist, müssen Sie die Größe als zusätzliches Argument senden oder die Größe als Teil der Daten einbetten. Da Sie nur einen Zeiger auf die Daten haben, können Sie die "Größe" der Daten, auf die Sie vom Zeiger zeigen, nicht ableiten. – pizza

+0

Nach Informationen von MS. typedef CHAR * LPSTR; LPSTR Ein Zeiger auf eine nullterminierte Zeichenfolge von 8-Bit-Windows (ANSI) -Zeichen. Weitere Informationen finden Sie unter Von Schriftarten verwendete Zeichensätze. LPTSTR Ein LPWSTR wenn UNICODE definiert ist, ansonsten ein LPSTR. #ifdef UNICODE typedef LPWSTR LPTSTR; #else typedef LPSTR LPTSTR; #endif Also diese Zeichenketten sollen null terminiert sein, das heißt die Daten selbst enthält keine binären 0s, aber die abschließenden Bytes ist 0. Aber in dem Beispiel Sie gaben, betten Sie binäre 0s ein? – pizza