C++ 为什么GetComputerNameEx返回编码奇怪的字符串?

C++ 为什么GetComputerNameEx返回编码奇怪的字符串?,c++,winapi,C++,Winapi,我正在尝试创建一个返回计算机名称的函数。这就是我到目前为止所做的: char* getName() { char buffer[MAX_COMPUTERNAME_LENGTH + 1]; DWORD length = sizeof(buffer); GetComputerNameEx((COMPUTER_NAME_FORMAT)0, buffer, &length); return buffer; } 但它并没有真正起作用。它似乎返回一个字符编码非常

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

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

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

    return buffer;
}

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

使用
std::string来避免内存问题。由于
std::string
使用单字节字符,您应该使用
GetComputerNameEx
GetComputerNameExA
的单字节版本

此外,检查错误值也是一个好主意,因为文档明确指出计算机名可能比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
    }
}
或者编写一个在两种环境下都能工作的代码(idea来源):

std::basic_string getName()
{
TCHAR缓冲区[最大计算机名称长度+1];
DWORD长度=sizeof(缓冲区)/sizeof(TCHAR);
bool ok=GetComputerNameEx((计算机名称格式)0、缓冲区和长度);
如果(确定){
返回缓冲区;
}否则{
//处理错误
}
}

使用
std::string
避免内存问题。由于
std::string
使用单字节字符,您应该使用
GetComputerNameEx
GetComputerNameExA
的单字节版本

此外,检查错误值也是一个好主意,因为文档明确指出计算机名可能比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
    }
}
或者编写一个在两种环境下都能工作的代码(idea来源):

std::basic_string getName()
{
TCHAR缓冲区[最大计算机名称长度+1];
DWORD长度=sizeof(缓冲区)/sizeof(TCHAR);
bool ok=GetComputerNameEx((计算机名称格式)0、缓冲区和长度);
如果(确定){
返回缓冲区;
}否则{
//处理错误
}
}

字符缓冲区[…]
仅在您的函数范围内有效!
char buffer[…]
的可能重复项仅在您的函数范围内有效!提及TCHAR使用的+1的可能副本。除了其他错误外,问题还提到了返回字符串的奇怪编码,这很可能与Unicode中的构建有关。请不要建议现在使用
TCHAR
。当您需要在Win95和WinNT下编译代码时,这非常有用。这不再有用了。@DavidHeffernan:这是真的,特别是在Visual Studio中逐渐弃用MCBS版本的情况下,但是使用
TCHAR
至少可以匹配版本的其余部分。如果使用VS.@icabod,正确的方法是编译
UNICODE
并使用
wchar\u t
std::wstring
L“…”
等。使用
TCHAR
只会增加无用且令人困惑的间接寻址级别。在这两种情况下,您应该将最后的
length
传递给字符串构造函数,而不要依赖于
buffer
以null结尾,例如:
return std::string(buffer,length)
返回标准::wstring(缓冲区,长度)
返回标准::基本字符串(缓冲区,长度)+1用于提及TCHAR的使用。除了其他错误外,问题还提到了返回字符串的奇怪编码,这很可能与Unicode中的构建有关。请不要建议现在使用
TCHAR
。当您需要在Win95和WinNT下编译代码时,这非常有用。这不再有用了。@DavidHeffernan:这是真的,特别是在Visual Studio中逐渐弃用MCBS版本的情况下,但是使用
TCHAR
至少可以匹配版本的其余部分。如果使用VS.@icabod,正确的方法是编译
UNICODE
并使用
wchar\u t
std::wstring
L“…”
等。使用
TCHAR
只会增加无用且令人困惑的间接寻址级别。在这两种情况下,您应该将最后的
length
传递给字符串构造函数,而不要依赖于
buffer
以null结尾,例如:
return std::string(buffer,length)
返回标准::wstring(缓冲区,长度)
返回标准::基本字符串(缓冲区,长度)