如何使用 windows api 中的 SetComputerName?
How to use SetComputerName from the windows api?
我正在尝试以编程方式更改计算机的名称。有时我们必须擦除系统并在升级中恢复它的数据库。我正在尝试从数据库中读取所有系统设置并自动设置。其中大部分都是非常简单的东西,但是更改系统的名称真的让我陷入困境。
编辑:编辑代码以反映评论的变化
if(dbHostName.length() > MAX_COMPUTERNAME_LENGTH)
{
dbHostName.truncate(MAX_COMPUTERNAME_LENGTH);
}
LPCTSTR cname = dbHostName.toStdWString().c_str();
bool nameset = SetComputerNameEx(ComputerNamePhysicalDnsHostname, cname);
if(nameset) qDebug() << "Computer name changed to" << dbHostName;
else qDebug() << "Computer name NOT changed!";
我正在使用 QString,确保它不会太长,将其转换为标准的宽字符串,将其转换为 LPCTSTR,然后尝试使用它来更改计算机名称。
这returns false: 计算机名称未更改!
感谢@user4581301 和@IInspectable 提供的建议,这些建议导致了以下解决方案。这两个都有效,我选择了第二个,因为似乎没有就如何最好地将字符串转换为 LPCTSTR 对象达成一致。
if(dbHostName.length() > MAX_COMPUTERNAME_LENGTH)
{
dbHostName.truncate(MAX_COMPUTERNAME_LENGTH);
}
std::wstring wstring = dbHostName.toStdWString();
LPCTSTR cname = wstring.c_str();
SetComputerNameEx(ComputerNamePhysicalDnsHostname, cname);
这是我选择的实际解决方案,但同样,它们都适用于 Windows 8.1。
if(dbHostName.length() > MAX_COMPUTERNAME_LENGTH)
{
dbHostName.truncate(MAX_COMPUTERNAME_LENGTH);
}
std::string sname = dbHostName.toStdString();
LPCSTR cname = sname.c_str();
SetComputerNameExA(ComputerNamePhysicalDnsHostname, cname);
编辑 2018 年 5 月 24 日:顺便说一下,这也有效,而且更加简洁
bool nameSet = SetComputerNameEx(ComputerNamePhysicalDnsHostname, dbHostName.toStdWString().c_str());
我正在尝试以编程方式更改计算机的名称。有时我们必须擦除系统并在升级中恢复它的数据库。我正在尝试从数据库中读取所有系统设置并自动设置。其中大部分都是非常简单的东西,但是更改系统的名称真的让我陷入困境。 编辑:编辑代码以反映评论的变化
if(dbHostName.length() > MAX_COMPUTERNAME_LENGTH)
{
dbHostName.truncate(MAX_COMPUTERNAME_LENGTH);
}
LPCTSTR cname = dbHostName.toStdWString().c_str();
bool nameset = SetComputerNameEx(ComputerNamePhysicalDnsHostname, cname);
if(nameset) qDebug() << "Computer name changed to" << dbHostName;
else qDebug() << "Computer name NOT changed!";
我正在使用 QString,确保它不会太长,将其转换为标准的宽字符串,将其转换为 LPCTSTR,然后尝试使用它来更改计算机名称。
这returns false: 计算机名称未更改!
感谢@user4581301 和@IInspectable 提供的建议,这些建议导致了以下解决方案。这两个都有效,我选择了第二个,因为似乎没有就如何最好地将字符串转换为 LPCTSTR 对象达成一致。
if(dbHostName.length() > MAX_COMPUTERNAME_LENGTH)
{
dbHostName.truncate(MAX_COMPUTERNAME_LENGTH);
}
std::wstring wstring = dbHostName.toStdWString();
LPCTSTR cname = wstring.c_str();
SetComputerNameEx(ComputerNamePhysicalDnsHostname, cname);
这是我选择的实际解决方案,但同样,它们都适用于 Windows 8.1。
if(dbHostName.length() > MAX_COMPUTERNAME_LENGTH)
{
dbHostName.truncate(MAX_COMPUTERNAME_LENGTH);
}
std::string sname = dbHostName.toStdString();
LPCSTR cname = sname.c_str();
SetComputerNameExA(ComputerNamePhysicalDnsHostname, cname);
编辑 2018 年 5 月 24 日:顺便说一下,这也有效,而且更加简洁
bool nameSet = SetComputerNameEx(ComputerNamePhysicalDnsHostname, dbHostName.toStdWString().c_str());