【问题标题】:size of TCHAR array in DWORDDWORD 中 TCHAR 数组的大小
【发布时间】:2014-05-09 15:32:27
【问题描述】:

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

【问题讨论】:

  • 相关:RegQueryValueEx 不保证 NULL 终止的字符串。请务必终止它。
  • 通常,这样做的方法是查询数据的大小,然后创建一个适当大小的缓冲区。 RegQueryValueEx function

标签: visual-c++ tchar dword


【解决方案1】:

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

注意:如果定义了 UNICODE_STRING,则 TCHAR 被视为 8 个字节,否则它的 16 个字节包含宽字符。

您的问题可以通过调用 RegQueryValueEx API 两次来解决。提到的 API 的最后一个参数是 [_in_out] 确实意味着将其作为 null 传递并首先检索大小。然后在下一次调用 API 时,传递大小并检索 lpdata。 (((如果lpData参数指定的缓冲区不足以容纳数据,则函数返回ERROR_MORE_DATA并将所需的缓冲区大小存储在lpcbData指向的变量中))

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多