0

我正在尝试以编程方式更改计算机的名称。有时我们必须在升级时擦除系统并恢复它的数据库。我正在尝试从数据库中读取所有系统设置并自动设置。其中大部分都是非常简单的东西,但是更改系统的名称真的让我陷入了困境。编辑:编辑代码以反映评论的变化

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,然后尝试使用它来更改计算机名称。

这将返回 false:计算机名称未更改!

4

1 回答 1

0

感谢@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());
于 2018-05-18T17:26:08.317 回答