繁体   English   中英

如何使用C ++更改Windows的ncpa.cpl中显示的网络名称?

[英]How to change the Network name shown in Windows's ncpa.cpl using C++?

Windows的“控制面板\\网络和Internet \\网络连接”对话框(也通过运行ncpa.cpl )用于显示网络。 用户可以通过右键单击并选择“重命名”来重命名网络的名称。 该名称与适配器名称不同,例如,我的以太网卡的网络名称“以太网” ,但适配器名称“ Qualcomm Atheros AR8171 / 8175 PCI-E千兆以太网控制器(NDIS 6.30)” 我知道我可以使用NetCfg API更改后一个, 但是我不知道如何更改前一个,即“以太网”

我知道netsh命令似乎可以完成这项工作。 但是我想使用C ++实现这种重命名 有办法吗?


解:

我很高兴使用NetShareManager API 解决了问题! NETCON_PROPERTIES结构保存设备的GUID ,用于搜索设备, INetConnection :: Rename可用于重命名网络连接名称!

这是代码:

BOOL DoTheWork(INetSharingManager *pNSM, wchar_t strDeviceName[])
{   // add a port mapping to every firewalled or shared connection 
    BOOL bFound = FALSE;
    INetSharingEveryConnectionCollection * pNSECC = NULL;
    HRESULT hr = pNSM->get_EnumEveryConnection (&pNSECC);
    if (!pNSECC)
        wprintf (L"failed to get EveryConnectionCollection!\r\n");
    else {

        // enumerate connections
        IEnumVARIANT * pEV = NULL;
        IUnknown * pUnk = NULL;
        hr = pNSECC->get__NewEnum (&pUnk);
        if (pUnk) {
            hr = pUnk->QueryInterface (__uuidof(IEnumVARIANT),
                (void**)&pEV);
            pUnk->Release();
        }
        if (pEV) {
            VARIANT v;
            VariantInit (&v);

            while ((S_OK == pEV->Next (1, &v, NULL)) && (bFound == FALSE)) {
                if (V_VT (&v) == VT_UNKNOWN) {
                    INetConnection * pNC = NULL;
                    V_UNKNOWN (&v)->QueryInterface (__uuidof(INetConnection),
                        (void**)&pNC);
                    if (pNC) {
                        NETCON_PROPERTIES *pNETCON_PROPERTIES;
                        pNC->GetProperties(&pNETCON_PROPERTIES);

                        wchar_t currentGUID[BUF_SIZE];
                        GUID guid = pNETCON_PROPERTIES->guidId;
                        wsprintf(currentGUID, L"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", 
                            guid.Data1, guid.Data2, guid.Data3, 
                            guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
                            guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);

                        if (wcscmp(currentGUID, strDeviceName) == 0)
                        {
                            pNC->Rename(NPCAP_LOOPBACK_INTERFACE_NAME);
                            bFound = TRUE;
                        }

                        pNC->Release();
                    }
                }
                VariantClear(&v);
            }
            pEV->Release();
        }
        pNSECC->Release();
    }

    return bFound;
}

我没有尝试过,但是NLM API的 INetwork有一个SetName方法,它看起来应该SetName您的要求。

从粗略的看待代码

netsh interface set interface name "oldname" newname="newname"

它似乎正在使用INetworkConnection :: Rename 为了获得所需的连接,我相信您将必须使用INetSharingManager枚举所有可用的连接。 然后,您将不得不遍历它们以查找所需的对象,然后调用“重命名”函数。

就像@Alexander Balabin所说的那样,NLM API可能会更容易,但是我不确定它是否能满足您的要求。 我只能告诉您netsh的作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM