vista以及更高版本操作系统网络状态实时检测方法

    今天有项目需求,需要实时检测网络连接状态,起码要做的和QQ微信差不多,根据网络上以及MSDN提供的一些API,比如InternetGetConnectedState和IsNetworkAlive均没有达到预期效果,或者是有各种各样的问题,比如说API  InternetGetConnectedState,这个API就有延时的问题,亲测我的机器延时为5秒,而IsNetworkAlive仅仅只能检测到网线连接,但是不能检测到网络连通,只能抛弃这两个函数。通过不断google和翻看MSDN,终于找到一个实现,即实现Network List manager(NLM)的相关方法和回调即可。

首先,从INetworkListManagerEvents派生一个类,并实现相关COM接口函数


#pragma once
#include <atlcom.h>

#include <netlistmgr.h>
#include <netlistmgr.h>

class NetworkEventHandler : public INetworkListManagerEvents
{
public:
	NetworkEventHandler(void);
	virtual ~NetworkEventHandler(void);
	STDMETHODIMP QueryInterface (REFIID riid, void** pIFace);
	STDMETHODIMP_(ULONG) AddRef();
	STDMETHODIMP_(ULONG) Release();
	STDMETHODIMP ConnectivityChanged(NLM_CONNECTIVITY NewConnectivity);
	
private:
	long m_lRefCnt;

};


cpp:

NetworkEventHandler::NetworkEventHandler(void) : m_lRefCnt(0)
{
}


NetworkEventHandler::~NetworkEventHandler(void)
{

}

STDMETHODIMP NetworkEventHandler::QueryInterface(REFIID refIID, void** pIFace)
{
	*pIFace = NULL;
	if(refIID == IID_IUnknown || refIID == __uuidof(INetworkListManagerEvents))
	{
		*pIFace =  (IUnknown*)(INetworkListManagerEvents*)(this);
	}
	if (*pIFace == NULL)
	{
		return E_NOINTERFACE;
	}
	((IUnknown*)*pIFace)->AddRef();

	return S_OK;
}

STDMETHODIMP_(ULONG) NetworkEventHandler::AddRef()
{
	m_lRefCnt++;
	return m_lRefCnt;
}

STDMETHODIMP_(ULONG) NetworkEventHandler::Release()
{
	m_lRefCnt--;
	if(m_lRefCnt == 0) 
	{
		delete this;
		return (0);
	}
	return m_lRefCnt;
}
STDMETHODIMP  NetworkEventHandler :: ConnectivityChanged( NLM_CONNECTIVITY NewConnectivity)
{
	bool bInternet = false;
	if((NewConnectivity & NLM_CONNECTIVITY_IPV4_INTERNET) || (NewConnectivity & NLM_CONNECTIVITY_IPV6_INTERNET))
	{
		bInternet = true;
		//网络已经连通,做点啥事
	}
	else
	{
		//网络已经不通,做点啥事
	}
	return S_OK;
}

然后注册相关事件即可,

定义


CComPtr<INetworkListManager> m_pNLM;
NetworkEventHandler * m_pSink;
DWORD m_dwCookie;
注册:

m_pNLM.CoCreateInstance(CLSID_NetworkListManager);
m_pSink = new NetworkEventHandler();
if (SUCCEEDED (m_pSink->QueryInterface(IID_IUnknown, (void**) &m_pSink)))
{
    AfxConnectionAdvise (m_pNLM, __uuidof(INetworkListManagerEvents), m_pSink, FALSE, &m_dwCookie); // Advising for Events
}

最后程序结束,释放:
AfxConnectionUnadvise (m_pNLM, IID_INetworkListManagerEvents, m_pSink, FALSE, m_dwCookie);
m_pSink->Release();


当网络连接状态改变时,ConnectivityChanged就会收到通知了


好好学习,天天向上


   


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我们可以使用C++中的系统调用来检测操作系统及其版本。具体的方法是,我们可以使用GetVersionEx函数或GetNativeSystemInfo函数来获取操作系统版本信息。 下面是一个示例代码: ```c++ #include <iostream> #include <windows.h> int main() { OSVERSIONINFOEX osvi; SYSTEM_INFO si; BOOL bOsVersionInfoEx; ZeroMemory(&si, sizeof(SYSTEM_INFO)); ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*)&osvi); if (bOsVersionInfoEx == FALSE) { std::cout << "GetVersionEx failed!" << std::endl; return 1; } // 输出操作系统版本信息 std::cout << "Operating System: "; switch (osvi.dwMajorVersion) { case 5: if (osvi.dwMinorVersion == 0) { if (osvi.wProductType == VER_NT_WORKSTATION) std::cout << "Windows 2000 Professional" << std::endl; else std::cout << "Windows 2000 Server" << std::endl; } else if (osvi.dwMinorVersion == 1) { if (osvi.wProductType == VER_NT_WORKSTATION) std::cout << "Windows XP" << std::endl; else std::cout << "Windows Server 2003" << std::endl; } break; case 6: if (osvi.dwMinorVersion == 0) { if (osvi.wProductType == VER_NT_WORKSTATION) std::cout << "Windows Vista" << std::endl; else std::cout << "Windows Server 2008" << std::endl; } else if (osvi.dwMinorVersion == 1) { if (osvi.wProductType == VER_NT_WORKSTATION) std::cout << "Windows 7" << std::endl; else std::cout << "Windows Server 2008 R2" << std::endl; } else if (osvi.dwMinorVersion == 2) { if (osvi.wProductType == VER_NT_WORKSTATION) std::cout << "Windows 8" << std::endl; else std::cout << "Windows Server 2012" << std::endl; } else if (osvi.dwMinorVersion == 3) { if (osvi.wProductType == VER_NT_WORKSTATION) std::cout << "Windows 8.1" << std::endl; else std::cout << "Windows Server 2012 R2" << std::endl; } else if (osvi.dwMinorVersion == 4) { if (osvi.wProductType == VER_NT_WORKSTATION) std::cout << "Windows 10" << std::endl; else std::cout << "Windows Server 2016" << std::endl; } break; default: std::cout << "Unknown" << std::endl; break; } return 0; } ``` 此代码将输出当前操作系统的名称,例如“Windows 10”。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值