两年前工作中有需求要实现在自己程序中调出“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