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

hss*_*son 0 c++ winapi

我正在尝试创建一个返回计算机名称的函数。这是我到目前为止:

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

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

    return buffer;
}
Run Code Online (Sandbox Code Playgroud)

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

Csq*_*Csq 5

使用 anstd::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
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用宽版:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

或者制作一个在两种环境下都可以使用的代码(来自这里的想法):

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
    }
}
Run Code Online (Sandbox Code Playgroud)