为什么GetComputerNameEx返回一个带有奇怪编码的字符串?

时间:2014-06-09 10:52:46

标签: c++ winapi

我试图创建一个返回计算机名称的函数。这就是我到目前为止所做的:

char* getName()
{
    char buffer[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD length = sizeof(buffer);

    GetComputerNameEx((COMPUTER_NAME_FORMAT)0, buffer, &length);

    return buffer;
}

但它并没有真正起作用。它似乎返回一个非常奇怪的字符编码字符串。我将非常感谢你的帮助。

1 个答案:

答案 0 :(得分:4)

使用std::string可以避免内存问题。由于std::string使用单字节字符,因此您应使用GetComputerNameExGetComputerNameExA的单字节版本。

同样最好检查错误值,因为文档明确指出计算机名称可能长于MAX_COMPUTERNAME_LENGTH。

std::string getName()
{
    char buffer[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD length = sizeof(buffer);

    bool ok = GetComputerNameExA((COMPUTER_NAME_FORMAT)0, buffer, &length);

    if (ok) { 
        return buffer;
    } else {
        //handle error
    }
}

或者你可以使用宽版本:

std::wstring getName()
{
    wchar_t buffer[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD length = sizeof(buffer) / sizeof(wchar_t);

    bool ok = GetComputerNameExW((COMPUTER_NAME_FORMAT)0, buffer, &length);

    if (ok) { 
        return buffer;
    } else {
        //handle error
    }
}

或制作在两种环境下都有效的代码(来自here的想法):

std::basic_string<TCHAR> getName()
{
    TCHAR buffer[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD length = sizeof(buffer) / sizeof(TCHAR);

    bool ok = GetComputerNameEx((COMPUTER_NAME_FORMAT)0, buffer, &length);

    if (ok) { 
        return buffer;
    } else {
        //handle error
    }
}