C++打开windows xp的ICS共享

ICS分享分为公有共享和私有共享,对应的类型为ICSSHARINGTYPE_PUBLIC和ICSSHARINGTYPE_PRIVATE。

ICS需要一个能够访问Internet的网卡(公用网络连接),一个用于局域网连接的网卡(一般为可做AP的无线网卡,专用网络连接)。

把访问Internet的网卡设为公有共享,用于局域网的网卡设为私有共享。当把专用网络进行连接PRIVATE共享后,它会自动和本机的公用网络连接进行关联,实现内部的ICS

共享。并且专用网络会被分配一个196.168.0.1的ip地址。

下面是MSDN的部分代码:

#include "stdafx.h"

// as in winsock.h
#define NAT_PROTOCOL_TCP 6
#define NAT_PROTOCOL_UDP 17

   //首先初始化COM库,获取 INetSharingManager接口 
    CoInitialize (NULL);

    // init security to enum RAS connections
    CoInitializeSecurity (NULL, -1, NULL, NULL, 
                          RPC_C_AUTHN_LEVEL_PKT, 
                          RPC_C_IMP_LEVEL_IMPERSONATE,
                          NULL, EOAC_NONE, NULL);

    INetSharingManager * pNSM = NULL;    
    HRESULT hr = ::CoCreateInstance (__uuidof(NetSharingManager),
                                     NULL,
                                     CLSCTX_ALL,
                                     __uuidof(INetSharingManager),
                                     (void**)&pNSM);
//枚举从电脑中的网卡并从中找出一个想要作为公有共享的网络和想要作为私有共享的网络,
   //关键的代码已用蓝色字体标出
   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)) {
                if (V_VT (&v) == VT_UNKNOWN) {
                    INetConnection * pNC = NULL;
                    V_UNKNOWN (&v)->QueryInterface (__uuidof(INetConnection),
                                                     (void**)&pNC);
                    if (pNC) {
                        INetConnectionProps * pNCP = NULL;
				pNSM->get_NetConnectionProps (pNC, &pNCP);
				if (!pNCP)
					wprintf (L"failed to get NetConnectionProps!\r\n");
				else
				{
					BSTR  strName, strDeviceName,strGuid;
					NETCON_MEDIATYPE mediaType;
					pNCP->get_Guid(&strGuid);
					pNCP->get_Name(&strName);
					pNCP->get_DeviceName(&strDeviceName);
					pNCP->get_MediaType(&mediaType);						
					CString csDeviceName = strDeviceName;
					//strSelectedWanAdapterName为想要公有共享的网卡的设备名称
					if(wcscmp(strDeviceName,strSelectedWanAdapterName) == 0)
					{
						// check properties for firewalled or shared connection
						DWORD dwCharacteristics = 0;
						pNCP->get_Characteristics (&dwCharacteristics);
								
						m_strPublicAdapterName = strDeviceName;

						NETCON_MEDIATYPE MediaType = NCM_NONE;
						pNCP->get_MediaType (&MediaType);
						if ((MediaType != NCM_SHAREDACCESSHOST_LAN) &&
							(MediaType != NCM_SHAREDACCESSHOST_RAS) )
						{
							// got a shared/firewalled connection
							INetSharingConfiguration * pNSC = NULL;
							NETCON_STATUS Status;
							pNCP->get_Status(&Status);

							hr = pNSM->get_INetSharingConfigurationForINetConnection (pNC, &pNSC);
							if (!pNSC)
								wprintf (L"can't make INetSharingConfiguration object!\r\n");
							else 
							{
								pNSC->EnableSharing(ICSSHARINGTYPE_PUBLIC);
								pNCP->get_Characteristics (&dwCharacteristics);
								pNSC->Release();
							}
						}
					}//strSelectedLANAdapterName为想要私有共享的网卡的设备名称
					else if(wcscmp(strDeviceName,strSelectedLANAdapterName) == 0)
					{
						DWORD dwCharacteristics = 0;
						pNCP->get_Characteristics (&dwCharacteristics);
						NETCON_MEDIATYPE MediaType = NCM_NONE;
						pNCP->get_MediaType (&MediaType);
						if ((MediaType != NCM_SHAREDACCESSHOST_LAN) &&
							(MediaType != NCM_SHAREDACCESSHOST_RAS) )
						{
							// got a shared/firewalled connection
							INetSharingConfiguration * pNSC = NULL;
							
							NETCON_STATUS Status;
							pNCP->get_Status(&Status);
							hr = pNSM->get_INetSharingConfigurationForINetConnection (pNC, &pNSC);
							if (!pNSC)
								wprintf (L"can't make INetSharingConfiguration object!\r\n");
							else
							{
								pNSC->EnableSharing(ICSSHARINGTYPE_PRIVATE);
								pNCP->get_Characteristics (&dwCharacteristics);
								pNSC->Release();
							}
						}
					}
                            pNCP->Release();
                        }
                        pNC->Release();
                    }
                }
                VariantClear (&v);
            }
            pEV->Release();
        }
        pNSECC->Release();
    }
 
参考文章:
http://hi.baidu.com/ritrachiao/item/bf7715e6bb8cb3a0c10d75be
 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值