如何从 Windows API 使用 SetComputerName



我正在尝试以编程方式更改计算机的名称。有时,我们必须在升级中擦除系统并还原其数据库。我正在尝试将所有系统设置从数据库中读取并自动设置。其中大部分都是非常简单的东西,但是更改系统名称确实让我陷入了循环。 编辑:编辑代码以反映注释中的更改

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:计算机名称未更改!

感谢@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);

编辑 5/24/18:顺便说一下,这也可以工作,而且更简洁

bool nameSet = SetComputerNameEx(ComputerNamePhysicalDnsHostname, dbHostName.toStdWString().c_str());

最新更新