通过程序打开TCP/IP属性窗口


两年前工作中有需求要实现在自己程序中调出“TCP/IP属性窗口”的需求,具体功能如下图,当时花了好多时间也没有实现,最后也只能放弃。虽然这个功能作用也不太大,但是总是记着这个,最近又花了几个周末,终于实现了,网上这个资料特别少,分享出来希望对大家有用。
在这里插入图片描述


函数入口:

void InvokeTCPIPProperties(HWND hWndParent)
{
    CComPtr<INetCfg> NetCfg;
    CComQIPtr<INetCfgLock> NetCfgLock;
    CComPtr<INetCfgComponent> NetCfgComponent;
    HRESULT hr = S_OK;
    LPWSTR ppszwrClient = NULL;

    CComObject<CNetConnectionPropertyUi>* pNetLanConnectionUiObj = NULL;
    hr = CComObject<CNetConnectionPropertyUi>::CreateInstance(&pNetLanConnectionUiObj);
    CComPtr<IUnknown> spNetConnectionPropertyUi((INetConnectionConnectUi*)pNetLanConnectionUiObj);

    hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_SERVER,
    IID_INetCfg, (LPVOID*)&NetCfg);

    NetCfgLock = NetCfg;
    hr = NetCfgLock->AcquireWriteLock(5, _T("MY CLIENT"),
    &ppszwrClient);
    hr = NetCfg->Initialize(NULL);

    hr = NetCfg->FindComponent(NETCFG_TRANS_CID_MS_TCPIP,
    &NetCfgComponent);

    hr = NetCfgComponent->RaisePropertyUi(hWndParent, NCRP_SHOW_PROPERTY_UI,  spNetConnectionPropertyUi);

    hr = NetCfg->Apply();
    hr = NetCfg->Uninitialize();
    hr = NetCfgLock->ReleaseWriteLock();
}

其中CNetConnectionPropertyUi 为自己实现的,头文件如下:

class CNetConnectionPropertyUi:
    public CComCoClass<CNetConnectionPropertyUi, &CLSID_LanConnectionUi>,
    public CComObjectRootEx<CComMultiThreadModelNoCS>,
    public INetLanConnectionUiInfo
{
    public:
        CNetConnectionPropertyUi();
        ~CNetConnectionPropertyUi();

        virtual HRESULT  GetDeviceGuid(GUID *pGuid);

	private:
        QString GetNetcardGuid();
    public:
        DECLARE_NO_REGISTRY()
        DECLARE_NOT_AGGREGATABLE(CNetConnectionPropertyUi)
        DECLARE_PROTECT_FINAL_CONSTRUCT()

        BEGIN_COM_MAP(CNetConnectionPropertyUi)
            COM_INTERFACE_ENTRY_IID(IID_INetLanConnectionUiInfo, INetLanConnectionUiInfo)
        END_COM_MAP()
};

其中CNetConnectionPropertyUi 实现如下:

CNetConnectionPropertyUi::CNetConnectionPropertyUi()
{
}

CNetConnectionPropertyUi::~CNetConnectionPropertyUi()
{
}
HRESULT CNetConnectionPropertyUi::GetDeviceGuid(GUID *pGuid)
{
    // "{A907657F-6FDF-11D0-8EFB-00C04FD912B2}" 为网卡的GUID,
    // 可以通过GetAdaptersInfo获取
    QString strGuid = "{A907657F-6FDF-11D0-8EFB-00C04FD912B2}";
    QUuid uuid(strGuid);
    GUID temp = GUID(uuid);
    CopyMemory(pGuid, &temp, sizeof(GUID));
    return S_OK;
}

基本功能以上代码可以实现,但是具体原理,com编程相关的知识还是不懂,继续努力。

参考资料:
https://microsoft.public.win32.programmer.networks.narkive.com/HrZBARUX/howto-show-tcp-ip-properties-using-inetcfgcomponent-raisepropertyui

网络适配器是计算机和网络之间进行通信的重要组件之一。它通过将网络信号转化为计算机能够理解的信号,以实现计算机与网络之间的数据传输。 然而有时候,我们可能会遇到网络适配器没有启用TCP/IP服务的问题。TCP/IP协议是Internet上最常用的协议之一,它负责数据在网络上的传输,并确保数据的可靠性。 当网络适配器没有启用TCP/IP服务时,计算机将无法连接到网络或与网络上的其他设备进行通信。此时,我们需要采取一些措施来解决这个问题。 首先,我们可以通过以下步骤来启用TCP/IP服务: 1. 打开计算机的网络设置。 2. 找到当前使用的网络适配器。 3. 右键点击该适配器,并选择“属性”选项。 4. 在属性窗口中,找到“Internet协议版本4 (TCP/IPv4)”或“Internet协议版本6 (TCP/IPv6)”。根据网络的需求,选择对应的协议版本。 5. 确保选中了“获取IP地址自动”和“获取DNS服务器地址自动”选项。 6. 点击“确定”保存更改,并退出网络设置。 如果上述方法无效,我们可以尝试重置网络设置: 1. 打开命令提示符窗口。 2. 输入“netsh int ip reset”并按下回车键。 3. 等待命令执行完毕,然后重新启动计算机。 如果仍然无法解决问题,我们可以考虑更新网络适配器的驱动程序。可以通过以下步骤来更新驱动程序: 1. 打开计算机的设备管理器。 2. 展开“网络适配器”部分,找到当前使用的适配器。 3. 右键点击适配器,并选择“更新驱动程序”选项。 4. 选择自动搜索更新的选项,并等待驱动程序更新完成。 如果以上方法依然无法解决问题,我们可以考虑联系网络管理员或技术支持寻求更进一步的帮助,以确保网络适配器正常工作并启用TCP/IP服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值