Visual c++ TCHAR数组的大小(以DWORD为单位)

Visual c++ TCHAR数组的大小(以DWORD为单位),visual-c++,tchar,dword,Visual C++,Tchar,Dword,我有下面的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 ) ==

我有下面的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);

bufSize的值将为510字节。 您应该了解,TCHAR是WCHAR的类型定义,即2字节。每当我们使用sizeof运算符时,它都会给出以字节为单位的大小

注意:如果定义了UNICODE_字符串,则TCHAR将被视为8字节,否则其16个字节将包含宽字符


这里的问题可以通过两次调用RegQueryValueExAPI来解决。提到的API的最后一个参数是[\u in\u out],这意味着将其作为null传递并首先检索大小。然后在对API的下一次调用中,传递size并检索lpdata。((如果lpData参数指定的缓冲区不够大,无法容纳数据,则函数将返回ERROR\u MORE\u data并将所需的缓冲区大小存储在lpcbData指向的变量中))

相关:
RegQueryValueEx
不保证
NULL
终止字符串。确保终止它。通常,执行此操作的方法是查询数据的大小,然后创建适当大小的缓冲区。