0

次の VC++ コードがあります。実行時に失敗しない DWORD の TCHAR のサイズを計算する方法。

HKEY hKey = 0;

DWORD dwType = REG_SZ;

TCHAR buf[255] = {0};

DWORD dwBufSize = sizeof(buf);


if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS ) 
{
    auto ret = RegQueryValueEx( hKey, TEXT("\\Device\\Serial0"), 0, &dwType, (LPBYTE)buf, &dwBufSize );
    ...
}

次に、 の価値は何ですかbufSize。次のコードはまだ正しいですか?

DWORD bufSize = sizeof(buf);
4

1 に答える 1

0

bufSize の値は 510 バイトになります。U は、TCHAR が WCHAR、つまり 2 バイトの typedef であることを理解する必要があります。sizeof 演算子を使用すると、サイズがバイト単位で表示されます。

注: UNICODE_STRING が定義されている場合、TCHAR は 8 バイトと見なされます。それ以外の場合は、16 バイトがワイド文字を保持します。

ここでの問題は、 RegQueryValueEx API を 2 回呼び出すことで解決できます。上記の API の最後の引数は [_in_out] であり、これを null として渡し、最初にサイズを取得することを意味します。次に、API への次の呼び出しで、サイズを渡し、lpdata を取得します。((lpData パラメータで指定されたバッファがデータを保持するのに十分な大きさでない場合、関数は ERROR_MORE_DATA を返し、必要なバッファ サイズを lpcbData が指す変数に格納します))

于 2014-05-12T08:49:38.297 に答える