操作系統 : 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 獲取提取碼。