Размер массива 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))