【问题标题】:Why does GetComputerNameEx return a string with a strange encoding?为什么 GetComputerNameEx 返回一个编码奇怪的字符串?
【发布时间】:2014-06-09 10:52:45
【问题描述】:

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

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

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

    return buffer;
}

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

【问题讨论】:

标签: c++ winapi


【解决方案1】:

使用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
    }
}

【讨论】:

  • +1 用于提及 TCHAR 的使用。除了其他错误之外,问题还提到了返回字符串的奇怪编码,这很可能与使用 Unicode 构建有关。
  • 请不要建议今天使用TCHAR。当您需要在 Win95 和 WinNT 下编译代码时,这很有用。这不再有用了。
  • @DavidHeffernan:确实如此,尤其是在 Visual Studio 中逐渐弃用 MCBS 构建的情况下,但使用 TCHAR 至少可以匹配构建的其余部分。如果使用 VS。
  • @icabod 正确的做法是为UNICODE 编译并使用wchar_tstd::wstringL"..." 等。使用TCHAR 只会增加一个无用且令人困惑的级别间接。
  • 在任何一种情况下,您都应该将最终的length 传递给字符串构造函数,而不是依赖于以空值结尾的buffer,例如:return std::string(buffer, length);return std::wstring(buffer, length);return std::basic_string&lt;TCHAR&gt;(buffer, length);
猜你喜欢
  • 2020-11-18
  • 1970-01-01
  • 2021-11-17
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 2023-04-05
相关资源
最近更新 更多