Размер массива TCHAR в DWORD

У меня есть следующий код VC++. Как рассчитать размер TCHAR в DWORD, который не потерпит неудачу во время выполнения.

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

1 ответ

Решение

Значение для bufSize будет 510 байтов. Вы должны понимать, что TCHAR является typedef для WCHAR, то есть 2 байта. Всякий раз, когда мы используем оператор sizeof, он будет давать размер в байтах.

Примечание. Если определено UNICODE_STRING, то значение TCHAR берется как 8 байтов, в противном случае его 16 байтов содержат широкие символы.

Ваша проблема здесь может быть решена путем вызова RegQueryValueEx API дважды. Последний аргумент упомянутого API: [_in_out] действительно означает, что передайте это значение как null и сначала получите размер. Затем при следующем вызове API передайте размер и получите lpdata. (Если буфер, указанный в параметре lpData, недостаточно велик для хранения данных, функция возвращает ERROR_MORE_DATA и сохраняет требуемый размер буфера в переменной, на которую указывает lpcbData))

Другие вопросы по тегам