我正在尝试使用 GetComputerName() 来检索框的名称。该代码在 Windows 7 上运行良好,但是,当我在 Windows XP 上测试时,该代码不起作用(结果未知)。知道为什么吗?
int GetBoxName(BoxInfo &box_info)
{
int Ret;
DWORD dwLen;
const char* szUnk = "UNKNOWN\0";
// Get the size of the box name then allocate memory.
Ret = GetComputerName(NULL, &dwLen);
box_info.BoxName = new char[dwLen];
// Attempt to retrieve the box name.
if((Ret = GetComputerName(box_info.BoxName, &dwLen) == 0))
{
delete[] box_info.BoxName;
box_info.BoxName = new char[strlen(szUnk)];
box_info.BoxName = (char*)szUnk;
return 1;
}
return 0;
}
最佳答案
@Ben 已经很好地说明了您所犯的错误。我想向您展示您通常如何调用 GetComputerName
。你让它变得比它需要的更难。关键信息是文档的摘录:
The buffer size should be large enough to contain MAX_COMPUTERNAME_LENGTH + 1 characters.
您对缓冲区的大小有一个硬性上限。因此,您可以使用固定大小的缓冲区,并且只调用一次 GetComputerName
。
std::string getComputerName()
{
char buffer[MAX_COMPUTERNAME_LENGTH + 1];
DWORD len = MAX_COMPUTERNAME_LENGTH + 1;
if (GetComputerName(buffer, &len))
return std::string(buffer, len);
return "UNKNOWN";
}
如果您针对 Unicode 进行编译,它将是:
std::wstring getComputerName()
{
wchar_t buffer[MAX_COMPUTERNAME_LENGTH + 1];
DWORD len = MAX_COMPUTERNAME_LENGTH + 1;
if (GetComputerName(buffer, &len))
return std::wstring(buffer, len);
return L"UNKNOWN";
}
如果你想迎合计算机名称长度超过MAX_COMPUTERNAME_LENGTH
的可能性,那么你可以这样写:
std::string getComputerName()
{
char buffer[MAX_COMPUTERNAME_LENGTH + 1];
DWORD len = MAX_COMPUTERNAME_LENGTH + 1;
if (GetComputerName(buffer, &len))
{
return std::string(buffer, len);
}
if (GetLastError() == ERROR_BUFFER_OVERFLOW)
{
std::vector<char> name(len);
if (GetComputerName(&name[0], &len))
{
return std::string(&name[0], len);
}
}
return "UNKNOWN";
}
我不知道这是否会发生。文档暗示它可以,但如果它确实发生了,那么它会使 MAX_COMPUTERNAME_LENGTH
有点用词不当。如果我们传递一个小于 MAX_COMPUTERNAME_LENGTH+1
的 len
值,那么如果名称适合,函数就会成功。它不会自动失败并返回 ERROR_BUFFER_OVERFLOW
。当然,如果此函数返回的名称永远不会超过 MAX_COMPUTERNAME_LENGTH
,那么第二个版本就相当偏执了。
FWIW,您更新后的答案中的代码仍然严重损坏。您绝对不能将第一个参数的 NULL
传递给 GetComputerName
。文档再清楚不过了。
关于c++ - GetComputerName() 适用于 win7 但在 xp 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22491733/