2012-04-01 23 views
3

以下のコードを使用してLPTSTR変数およびCONST CHAR変数のサイズを取得しようとしていますが、適切なサイズを取得できません。16進値を含むLPTSTRまたはCHAR *のサイズの取得

私は20を得るはずですが、const char *変数で0、LPTSTR変数で4が得られます。

私は次の関数を使用してバイナリデータとしてWindowsレジストリに挿入する値のサイズ( REG_BINARY)を取得する必要があります
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 

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

どのように最初のものが0になっていますか?正しいとは思わない。 – cnicutar

+0

申し訳ありませんが私はsizeof(var1)のために4を得ています – hardyRocks

答えて

3

var1のタイプはconst char*で、var2のサイズはLPTSTRです(これはの別名です)。)。 sizeof var1は、それが指している文字配列のサイズではなく、sizeof (const char*)に相当します。あなたのプラットフォームでは、sizeof (char*)は4バイトです。

代わりに行うことができます:

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

そしてsizeof var1は、あなたが望むものであるsizeof (const char[20])、に相当します。

+0

はい、今すぐサイズを取得できます。ありがとうございました。 – hardyRocks

+0

しかし、私は関数のパラメータを介しているcont char *値でconst char var1 []を初期化するには? – hardyRocks

+0

@hardyRocks:関数の引数を渡す場合、呼び出し側はサイズを渡す必要があります。 – jamesdlin

0

あなたは

const char var1[20] = "\x00\x00\x00\x00" 
       "\x00\x00\x00\x00" 
       "\x02\x00\x00\x00" 
       "\x5B\xE0\x5B\xE0" 
       "\x00\x00\x00\x00"; 
を行う必要があります
+0

ええ、値は動的ですが、それは異なる場合があります。 – hardyRocks

+0

あなたは@jamesdlinが示唆していることを行うことができます。しかし、値が動的になる場合は、おそらくメモリを動的に割り当てる必要があります。 – Griffin

+1

@hardyRocks:配列のサイズが動的である場合、メモリを動的に割り当てる必要があり、自分でサイズを追跡する必要があります。 – jamesdlin

0

オルタナティブ:これらの変数の目的が何であるかを

#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); 

わからない、しかし、あなたはまた、

LRES = RegSetValueEx(hMykey、 "スキャンコードマップ"、0、REG_BINARY、(LPBYTE)を行うことができますSTR、sizeof(STR)-1);

+0

値は動的です。実際には、毎回異なる値で関数のパラメータを複数回送信します。だから私は値を定義することはできません。関数は、渡された値と値のサイズでRegSetValueEx関数を呼び出します。 – hardyRocks

+0

その場合は、追加の引数としてサイズを送信するか、サイズをデータの一部として埋め込む必要があります。あなたが持っているものはすべてデータへのポインタなので、ポインタから指すデータの「サイズ」を推測することはできません。 – pizza

+0

MSの情報によると。 typedef CHAR * LPSTR; LPSTR 8ビットのWindows(ANSI)文字のNULLで終了する文字列へのポインタ。 詳細については、「フォントで使用される文字セット」を参照してください。 LPTSTR UNICODEが定義されている場合はLPWSTR、そうでない場合はLPSTR。 #ifdef UNICODE typedef LPWSTR LPTSTR; #else typedef LPSTR LPTSTR; #endif これらの文字列はヌルで終わると考えられます。つまり、データそのものです。 にはバイナリ0が含まれていませんが、終了バイトは0です。しかし、 の例ではバイナリ0が埋め込まれていますか? – pizza

関連する問題