【问题标题】:How to change the Network name shown in Windows's ncpa.cpl using C++?如何使用 C++ 更改 Windows 的 ncpa.cpl 中显示的网络名称?
【发布时间】:2015-07-06 15:23:58
【问题描述】:

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

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


解决方案:

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

代码如下:

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;
}

【问题讨论】:

    标签: c++ c windows networking


    【解决方案1】:

    粗略看一下代码

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

    它看起来正在使用INetworkConnection::Rename。为了获得您想要的连接,我相信您必须使用INetSharingManager 来枚举所有可用的连接。然后你必须遍历它们以找到你想要的,然后调用 Rename 函数。

    话虽如此,正如@Alexander Balabin 所说,NLM API 可能会更容易,但我不确定它是否符合您的要求。我可以告诉你 netsh 是做什么的。

    【讨论】:

      【解决方案2】:

      我还没有尝试过,但是NLM API's INetwork 有一个 SetName 方法,看起来它应该可以满足您的需求。

      【讨论】:

      • 恐怕NLM API不是我想要的,看更新。
      猜你喜欢
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      相关资源
      最近更新 更多