GetComputerName的正确用法 - 我需要为空字符保留额外的空间吗?

4

我想知道,GetComputerName 的正确用法是什么。它应该是

TCHAR computerName[1024 + 1];
DWORD size = 1024;
GetComputerName(computerName, &size);

或者

TCHAR computerName[1024];
DWORD size = 1024;
GetComputerName(computerName, &size);
4个回答

11

lpnSize 参数中传递的大小反映了缓冲区中可用空间的大小,包括空间用于 null 终止符。你的两个语句都可以工作,因为在第一个语句中,你只是分配了比你说的可用空间多一个字节。

你可能想要使用 MAX_COMPUTERNAME_LENGTH,它远小于1024。

TCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1];
DWORD size = sizeof(computerName) / sizeof(computerName[0]);
GetComputerName(computerName, &size);

1
@Yan Cheng CHEOK:除法是一种常见的习语,用于确定静态分配数组中元素的数量,而不需要显式引用数组大小或类型。是的,你可以说DWORD size = MAX_COMPUTERNAME_LENGTH + 1;但这只是在重复自己,并且如果您决定稍后更改数组的大小,则容易出错。 - Greg Hewgill
我认为值得强调的是,TCHAR的大小可以根据代码构建时使用的字符集而改变。Unicode=2字节,MBCS=1字节。这就是为什么要使用sizeof division习语的原因 :) - TinyRacoon

3

文档明确指出:

缓冲区的大小应足够大,以包含MAX_COMPUTERNAME_LENGTH + 1

然后:

如果缓冲区太小,则该功能失败并返回GetLastError ERROR_BUFFER_OVERFLOW。 lpnSize参数指定所需缓冲区的大小,包括终止空字符。

这意味着你可以选择:

  1. 创建长度为MAX_COMPUTERNAME_LENGTH + 1的缓冲区。
  2. 创建较小的缓冲区,但一定要捕获错误值,以防它太小。在这种情况下,请注意,输入时,[lpnSize]指定缓冲区的大小,以TCHAR表示。 因此,第二个方案是正确的。

1

在我看来,你可以尝试:

CString value;
DWORD size = 1024;
if(!GetComputerName(value.GetBufferSetLength(size), &size)){
    value = _T("");
}
return value;

0

size 是缓冲区的大小(输入时),而不是字符串的长度。输出时,它是字符串的长度。你的第二个版本是正确的。第一个版本虽然没有问题,但请考虑使用 MAX_COMPUTERNAME_LENGTH 而不是一些硬编码的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接