2014-05-09 2 views
0

У меня есть следующий код VC++. Как подсчитать размер TCHAR в DWORD, который не будет работать во время выполнения.размер массива 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); 
+0

Связано: 'RegQueryValueEx' не гарантирует' NULL'. Обязательно прекратите его. – jww

+1

Часто для этого нужно * запросить * размер данных, а затем создать буфер соответствующего размера. [Функция RegQueryValueEx] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724911 (v = vs.85) .aspx) – crashmstr

ответ

0

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

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

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

Смежные вопросы