xiaomayi2012 发表于 2020-11-22 21:40

c++调用win32 api 函数无法修改win10系统计算机名称

c++调用win32 api 函数 setComputerName()用于修改win10系统的计算机名称,但修改完后重启计算机,发现名称没有改变,但是在win7 32位系统下就可以更改成功。请教这是什么原因造成的。
以下是从网上找的代码
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string>
#include <conio.h>

using namespace std;

//获取计算机名称
wstring getComputerName() {
        DWORD size = 0;
        wstring wstr;
        GetComputerName(NULL, &size); //得到电脑名称长度
        wchar_t *name = new wchar_t;
        if (GetComputerName(name, &size)) {
                wstr = name;
        }
        delete[] name;
        return wstr;
}


//设置计算机名称
bool setComputerName(string pcName) {
        if (!pcName.length())
                return false;
        size_t size = pcName.length();
        wchar_t *buffer = new wchar_t;
        MultiByteToWideChar(CP_ACP, 0, pcName.c_str(), size, buffer, size * sizeof(wchar_t));
        buffer = 0;
        bool isOk = SetComputerNameEx(ComputerNamePhysicalDnsHostname, buffer);
        delete[] buffer;
        return isOk;
}

void getInput(string title, string &arg) {
        cout << title << endl;
        getline(cin, arg);
}

//打印基本信息
void view_welcome() {
        //设置字体背景色红色
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_RED);
        printf("******************修改工具v1.0*****************\n");
        printf("                    作者:wangtong                       \n\n");
        printf("-------------------包含功能--------------------\n");
        printf("【修改计算机名】--【修改IP】--【修改子网掩码】 \n");
        printf("-----------------------------------------------\n\n\n");
        //设置字体颜色 绿色
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
}
/**
*确认语句
例子:yOrN(“确认要修改以上信息吗?”)
输出:确认要修改以上信息吗?(y/n)
**/
bool yOrN(string desc) {

        cout << desc << "(y/n)";
        int ch = getchar();
        ch = toupper(ch);
        getchar();//这句的作用是清空缓冲区-回车键换行符10
        if (ch == 'Y') {
                return true;
        }
        return false;
}
//修改IP和掩码。调用dos命令
void modifyIpAndMask(string ip, string mask) {
        if (ip.length() == 0 || mask.length() == 0)
                return;
        string cmd = "netsh interface ip set address name=本地连接 static ";
        cmd += ip + " " + mask;
        system(cmd.c_str());
}
//修改电脑主机名,调用windowAPI
bool modifyPCName(string pcName) {

        if (setComputerName(pcName)) {
                return true;
        }
        else {
                printf("Error%d\n", GetLastError());
                return false;
        }

}

int main() {
        view_welcome();
        wcout << "【ComputerName】" << getComputerName() << endl;
        string pcName;
        string mask;
        string ip;
        getInput("Please enter a new computer name(Enter the default does not change)", pcName);
        getInput("请输入新的ip(回车默认不改)", ip);
        if (ip.length()) {
                getInput("Please enter a new IP(回车默认255.255.255.0)", mask);
                if (!mask.length()) {
                        mask = "255.255.255.0";
                }
        }
        if (ip.length() || pcName.length()) {
                printf("您修改了如下信息:\n");
                if (ip.length())
                        cout << "【ip地址】:" + ip << "\n【子网掩码】:" + mask << endl;
                if (pcName.length())
                        cout << "【ComputerName】:" + pcName << endl;
                if (yOrN("确认要修改以上信息吗?")) {
                        if (ip.length())
                                modifyIpAndMask(ip, mask);
                        if (pcName.length()) {
                                if (modifyPCName(pcName)) {
                                        printf("修改成功,重启后生效\n");
                                        if (yOrN("现在要重启吗?回车默认不重启!")) {
                                                system("shutdown /r /t 0");
                                        }
                                }
                                else {
                                        printf("修改计算机名发生错误\n");
                                }
                        }

                }
        }
        printf("按任意键退出!");
        _getch();
        return 0;
}

邪恶海盗 发表于 2020-11-22 21:55

我之前好像是通过修改注册表能改名的...

xiaomayi2012 发表于 2020-11-22 21:58

邪恶海盗 发表于 2020-11-22 21:55
我之前好像是通过修改注册表能改名的...

通过api不行吗?不知道和修改注册表这两者修改后效果有不同吗

repobor 发表于 2020-11-22 22:23

我猜是UAC

xiaomayi2012 发表于 2020-11-22 22:28

repobor 发表于 2020-11-22 22:23
我猜是UAC

额,,有可能哈。。。

tanlijing 发表于 2020-11-22 22:46

大佬太强了吧

邪恶海盗 发表于 2020-11-22 23:11

xiaomayi2012 发表于 2020-11-22 21:58
通过api不行吗?不知道和修改注册表这两者修改后效果有不同吗

忘记了,好久没玩这个了...

Rodriguezs 发表于 2020-11-23 01:09

用管理员登录打开程序试过没?

fanvalen 发表于 2020-11-23 02:09

可能系统版本不对位,32位只能32系统,64位要64。
还有可能就是win10 api变更了

xiaomayi2012 发表于 2020-11-28 09:28

Rodriguezs 发表于 2020-11-23 01:09
用管理员登录打开程序试过没?

测试了 确实 是管理员问题,,必须以管理员模式运行才可以。。感谢提醒~!
页: [1] 2
查看完整版本: c++调用win32 api 函数无法修改win10系统计算机名称