随笔 - 272  文章 - 0  评论 - 283  阅读 - 142万

通过程序自动设置网卡的“internet共享”选项

操作系统 : Windows 10_x64 [版本 10.0.19042.685]

Windows下可以通过网卡共享进行上网,但是需要在网卡的属性里面进行设置,需要在视窗界面进行操作,不能实现自动化。

 

 

查了下资料,可以通过INetSharingManager来实现,原理很简单: 模拟手工的动作自动化操作。

示例代码如下:

复制代码
HRESULT shareNet(INetSharingManager* pNSM, const char* srcName, const char* dstName)
{
    INetConnection * pNC = NULL;
    INetSharingConfiguration * pNSC = NULL;
    IEnumVARIANT * pEV = NULL;
    IUnknown * pUnk = NULL;
    INetSharingEveryConnectionCollection * pNSECC = NULL;

    HRESULT hr = pNSM->get_EnumEveryConnection(&pNSECC);
    VARIANT v;
    VariantInit(&v);

    if (!pNSECC)
    {
        wprintf(L"failed to get EveryConnectionCollection!\r\n");
        return NULL;
    }

    hr = pNSECC->get__NewEnum(&pUnk);
    if (pUnk)
    {
        hr = pUnk->QueryInterface(__uuidof(IEnumVARIANT), (void**)&pEV);
        pUnk->Release();
    }


    wprintf(L"----------------------------------------------------------\n");
    while (S_OK == pEV->Next(1, &v, NULL))
    {
        if (V_VT(&v) == VT_UNKNOWN)
        {
            V_UNKNOWN(&v)->QueryInterface(__uuidof(INetConnection), (void**)&pNC);
            if (pNC)
            {
                NETCON_PROPERTIES* pNP = NULL;
                pNC->GetProperties(&pNP);
                setlocale(LC_ALL, "chs");

                wprintf(L"pszwName--%s\n", pNP->pszwName);
                wprintf(L"pszwDeviceName--%s\n", pNP->pszwDeviceName);
                wprintf(L"Status--%d\n", pNP->Status);
                wprintf(L"\n");

                //continue;
                if (pNP->Status != NCS_CONNECTED) continue;
                std::string tmpName = CW2A(pNP->pszwName);
                //printf("###### |%s| : |%s|\r\n", tmpName.c_str(),(char*)nicName);

                hr = pNSM->get_INetSharingConfigurationForINetConnection(pNC, &pNSC);
                if (!strcmp(tmpName.c_str(), (char*)srcName))
                {
                    printf("**************find nic srcName : %s\r\n", (char*)srcName);
                    hr = pNSC->DisableSharing();
                    Sleep(500);
                    //getchar();
                    hr = pNSC->EnableSharing(ICSSHARINGTYPE_PUBLIC);
                }
                pNSC->Release();

                hr = pNSM->get_INetSharingConfigurationForINetConnection(pNC, &pNSC);
                if (!strcmp(tmpName.c_str(), (char*)dstName))
                {
                    printf("**************find nic dstName : %s\r\n", (char*)dstName);
                    hr = pNSC->DisableSharing();
                    Sleep(500);
                    hr = pNSC->EnableSharing(ICSSHARINGTYPE_PRIVATE);
                }
                pNSC->Release();
            }
        }
    }
    return hr;
}
复制代码

添加相关代码并使用VS2015编译:

 

 需要管理员权限运行,Release目录有可执行程序

 

使用方法:

ConsoleApplication1.exe 能上网的网卡名称 需要上网的网卡名称

比如:

ConsoleApplication1.exe WLAN "以太网 4"

当然也可以使用批处理文件,但需要注意下文件编码使用GBK 编码。

 

 本文涉代码及预编译程序下载地址:https://pan.baidu.com/s/1sRKwYDP_gFMegeK5rTP3rg

可关注微信公众号(聊聊博文)后回复 2021012301 获取提取码。

posted on   Mike_Zhang  阅读(792)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2018-01-23 vim配置go语法高亮
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示