c++ - GetComputerName() 适用于 win7 但在 xp 上失败

标签 c++ winapi windows-xp

我正在尝试使用 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+1len 值,那么如果名称适合,函数就会成功。它不会自动失败并返回 ERROR_BUFFER_OVERFLOW。当然,如果此函数返回的名称永远不会超过 MAX_COMPUTERNAME_LENGTH,那么第二个版本就相当偏执了。


FWIW,您更新后的答案中的代码仍然严重损坏。您绝对不能将第一个参数的 NULL 传递给 GetComputerName。文档再清楚不过了。

关于c++ - GetComputerName() 适用于 win7 但在 xp 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22491733/

相关文章:

c++ - gtkmm3 示例未编译(未定义引用)

c++ - 与 Windows 重新启动/关闭的交互

python - 无法将 pyODBC 与 SQL Server 2008 Express R2 连接

windows - 如何在系统启动后20分钟运行windows计划任务?

iis - 检索具有 CLSID {000209FF-0000-0000-C000-000000000046} 的组件的 COM 类工厂

c++ - 是否可以指向任何类型的变量?

c++ - 在一行上流式传输多个变量?

c++ - 为什么下面的代码也会调用拷贝构造函数呢?

C++ WINAPI : How to kill child processes when the calling (parent) process is forcefully terminated?

c++ - 无法从注册表中读取字符串