Как использовать SetComputerName из Windows API? - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь изменить имя компьютера программно. Иногда нам приходится стирать систему и восстанавливать ее базу данных при обновлении. Я пытаюсь, чтобы все системные настройки были считаны из базы данных и были настроены автоматически. Большинство из них довольно простые вещи, но изменение названия системы действительно заставляет меня задуматься. РЕДАКТИРОВАТЬ: код отредактирован для отражения изменений из комментариев

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: имя компьютера не изменилось!

1 Ответ

0 голосов
/ 18 мая 2018

Выражение благодарности @ 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);

Правка 24.05.18. Кстати, это тоже работает и гораздо более кратко

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