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(缓冲区,长度)代码>或返回标准::基本字符串(缓冲区,长度)代码>