我想知道,GetComputerName 的正确用法是什么。它应该是
TCHAR computerName[1024 + 1];
DWORD size = 1024;
GetComputerName(computerName, &size);
或者
TCHAR computerName[1024];
DWORD size = 1024;
GetComputerName(computerName, &size);
我想知道,GetComputerName 的正确用法是什么。它应该是
TCHAR computerName[1024 + 1];
DWORD size = 1024;
GetComputerName(computerName, &size);
或者
TCHAR computerName[1024];
DWORD size = 1024;
GetComputerName(computerName, &size);
在 lpnSize
参数中传递的大小反映了缓冲区中可用空间的大小,包括空间用于 null 终止符。你的两个语句都可以工作,因为在第一个语句中,你只是分配了比你说的可用空间多一个字节。
你可能想要使用 MAX_COMPUTERNAME_LENGTH
,它远小于1024。
TCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1];
DWORD size = sizeof(computerName) / sizeof(computerName[0]);
GetComputerName(computerName, &size);
文档明确指出:
缓冲区的大小应足够大,以包含MAX_COMPUTERNAME_LENGTH + 1
然后:
如果缓冲区太小,则该功能失败并返回GetLastError ERROR_BUFFER_OVERFLOW。 lpnSize参数指定所需缓冲区的大小,包括终止空字符。
这意味着你可以选择:
MAX_COMPUTERNAME_LENGTH + 1
的缓冲区。在我看来,你可以尝试:
CString value;
DWORD size = 1024;
if(!GetComputerName(value.GetBufferSetLength(size), &size)){
value = _T("");
}
return value;
size
是缓冲区的大小(输入时),而不是字符串的长度。输出时,它是字符串的长度。你的第二个版本是正确的。第一个版本虽然没有问题,但请考虑使用 MAX_COMPUTERNAME_LENGTH 而不是一些硬编码的值。
DWORD size = MAX_COMPUTERNAME_LENGTH + 1;
但这只是在重复自己,并且如果您决定稍后更改数组的大小,则容易出错。 - Greg Hewgill