2014-05-09 17 views
0

我有以下VC++代碼。如何在DWORD中聲明TCHAR的大小,在運行時不會失敗。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); 
+0

相關:'RegQueryValueEx'不保證' NULL'終止的字符串。一定要終止它。 – jww

+1

通常,執行此操作的方法是*查詢*數據的大小,然後創建適當大小的緩衝區。 [RegQueryValueEx函數](http://msdn.microsoft.com/en-us/library/windows/desktop/ms724911(v = vs.85).aspx) – crashmstr

回答

0

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指向的變量中))