如何使用 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());