[WM]n久以前写的ConnMgr类
说明: 星期天回去看了一下,能编译通过了(汗).
头文件: ConnectionMgr.h
#pragma once #include <vector> #include <windows.h> #include <InitGuid.h> #include <connmgr.h> #pragma comment( lib, "cellcore.lib" ) #include <connmgr_status.h> class ConnectionMgr { public: typedef CONNMGR_CONNECTION_DETAILED_STATUS STATUS; ConnectionMgr(void); ~ConnectionMgr(); bool EstablishConnection(int index,bool isSync); bool EstablishConnection(const GUID guid,bool isSync); bool EstablishConnection(wchar_t* entryPointName,bool isSync); bool QueryConnStatus(); void ReleaseConnection(); void ReleaseConnection(int bCache); void SetCallbackParams(HWND hWnd,unsigned int uMsg); //#include <connmgr_status.h> //http://www.17feixiang.com/article/jishu/83.htm STATUS QueryStatus(); void RegisterEvent(HWND hwnd,bool isEnable); GUID MapUrl(const wchar_t* wcsURL); const std::vector<CONNMGR_DESTINATION_INFO>* GetNetIdentifiersList(); HANDLE GetHConnection() const; private: void Init(); std::vector<CONNMGR_DESTINATION_INFO> lstNetIdentifiers; HANDLE hConnection; HWND hWnd; unsigned int uMsg; };
实现: ConnectionMgr.cpp
#include "ConnectionMgr.h" #include <stdlib.h> ConnectionMgr::ConnectionMgr(void): hConnection(NULL),hWnd(NULL),uMsg(0) { this->Init(); } ConnectionMgr::~ConnectionMgr(void) { if(this->hConnection) { this->ReleaseConnection(); } } bool ConnectionMgr::EstablishConnection(int index,bool isSync) { CONNMGR_DESTINATION_INFO DestInfo; HRESULT result= ConnMgrEnumDestinations(index,&DestInfo); if(result>=0) { return this->EstablishConnection(DestInfo.guid,isSync); } return false; } bool ConnectionMgr::EstablishConnection(const GUID guid,bool isSync) { CONNMGR_CONNECTIONINFO connInfo={0}; connInfo.cbSize=sizeof(connInfo); connInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET; connInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP | CONNMGR_FLAG_PROXY_WAP | CONNMGR_FLAG_PROXY_SOCKS4 | CONNMGR_FLAG_PROXY_SOCKS5; connInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE; connInfo.bExclusive = false; connInfo.bDisabled = false; connInfo.guidDestNet = guid;//IID_DestNetInternet; connInfo.uMsg=this->uMsg; connInfo.hWnd = this->hWnd; HRESULT result; HANDLE _hConnection=NULL; if(isSync) { DWORD dwStatus; result=ConnMgrEstablishConnectionSync(&connInfo,&_hConnection,10*1000,&dwStatus); this->hConnection=_hConnection; //成功 #if DEBUG wchar_t str[100]; memset(str,0,sizeof(wchar_t)*100); wsprintf(str,L"ResultCode:%d\nhConnection:%d",dwStatus,this->hConnection); MessageBox(NULL,str,L"拨号结果",MB_OK); #endif if(CONNMGR_STATUS_CONNECTED==dwStatus) return true; } else { result=ConnMgrEstablishConnection(&connInfo,&_hConnection); this->hConnection=_hConnection; //这个只是调用结果,并非真实情况 #if DEBUG wchar_t str[100]; memset(str,0,sizeof(wchar_t)*100); wsprintf(str,L"ResultCode:%s\nhConnection:%d",L"NULL",this->hConnection); MessageBox(NULL,str,L"拨号结果",MB_OK); #endif if(S_OK==result) return true; } return false; } bool ConnectionMgr::EstablishConnection(wchar_t* entryPointName,bool isSync) { int index = 0; for (unsigned int i = 0;i < this->lstNetIdentifiers.size();i++) { if(0==wcscmp(this->lstNetIdentifiers[i].szDescription,entryPointName)) { index=i; break; } } return this->EstablishConnection(index,isSync); } bool ConnectionMgr::QueryConnStatus() { DWORD dwStatus; HRESULT result = ConnMgrConnectionStatus(this->hConnection,&dwStatus); if(S_OK==result && CONNMGR_STATUS_CONNECTED==dwStatus) return true; return false; } void ConnectionMgr::RegisterEvent(HWND hwnd,bool isEnable) { ConnMgrRegisterForStatusChangeNotification(isEnable,hwnd); } void ConnectionMgr::ReleaseConnection() { this->ReleaseConnection(2); } GUID ConnectionMgr::MapUrl(const wchar_t* wcsURL) { GUID _guid={0}; HRESULT result=ConnMgrMapURL(wcsURL,&_guid,0); return _guid; //.. } ConnectionMgr::STATUS ConnectionMgr::QueryStatus() { STATUS status; STATUS* _status; DWORD dwSize=0; ConnMgrQueryDetailedStatus(NULL,&dwSize); _status=(STATUS*)new byte[dwSize]; ConnMgrQueryDetailedStatus(_status,&dwSize); status=*_status; delete[] _status; return status; } void ConnectionMgr::ReleaseConnection(int bCache) { #if DEBUG wchar_t message[100]; memset(message,0,sizeof(wchar_t)*100); wsprintf(message,L"hConnection:%d",this->hConnection); MessageBox(NULL,message,L"连接句柄",MB_OK); #endif if(this->hConnection) { ConnMgrReleaseConnection(this->hConnection,bCache); CloseHandle(this->hConnection); this->hConnection=NULL; } } void ConnectionMgr::Init() { //填充list lstNetIdentifiers.clear(); for (int dwEnumIndex=0; ;++dwEnumIndex) { CONNMGR_DESTINATION_INFO tmpInfo; if(ConnMgrEnumDestinations(dwEnumIndex,&tmpInfo)) break; lstNetIdentifiers.push_back(tmpInfo); } } void ConnectionMgr::SetCallbackParams(HWND hWnd,unsigned int uMsg) { this->hWnd=hWnd; this->uMsg=uMsg; } const std::vector<CONNMGR_DESTINATION_INFO>* ConnectionMgr::GetNetIdentifiersList() { return &(this->lstNetIdentifiers); } HANDLE ConnectionMgr::GetHConnection() const { return this->hConnection; }
另外还有C API,供C# P/Invoke:
ConnectionMgr_C.h
#pragma once #define EXPORT __declspec(dllexport) #include "ConnectionMgr.h" #include <string> static ConnectionMgr g_Mgr; static std::vector<wchar_t*> lst; extern "C"{ EXPORT void SetFeedbackParams(HWND hWnd,unsigned int uMsg) { g_Mgr.SetCallbackParams(hWnd,uMsg); } EXPORT void GetMappingGUID(const wchar_t* wcsURL,GUID* pGuid) { *pGuid = g_Mgr.MapUrl(wcsURL); } EXPORT bool EstablishDefaultNET(bool isSync) { return g_Mgr.EstablishConnection(IID_DestNetInternet,isSync); } EXPORT bool EstablishDefaultWAP(bool isSync) { return g_Mgr.EstablishConnection(IID_DestNetWAP,isSync); } EXPORT bool EstablishUseName(wchar_t* entryPointName,bool isSync) { return g_Mgr.EstablishConnection(entryPointName,isSync); } EXPORT bool EstablishUseIndex(int index,bool isSync) { return g_Mgr.EstablishConnection(index,isSync); } EXPORT bool EstablishUseGUID(GUID guid,bool isSync) { return g_Mgr.EstablishConnection(guid,isSync); } EXPORT size_t GetNetIndentifiersSize() { return g_Mgr.GetNetIdentifiersList()->size(); } EXPORT const wchar_t* GetIndentifierDescription(size_t index) { const wchar_t* result=NULL; result= g_Mgr.GetNetIdentifiersList()->operator [](index).szDescription; return result; } EXPORT void ReleaseIdentifierList(wchar_t** pStrings) { delete[] pStrings; } EXPORT void ReleaseCurrentConnection() { g_Mgr.ReleaseConnection(); } };
PS:
ReleaseConnection能否正常断网看你的机器对ConnMgr实现的标准程度,在WM 5中,ReleaseConnection的参数是bCache,只有两种状态;在WM 6中,那个参数换成了lCache,Document里面说lCache>1,那么缓存lCache秒之后断网,但是好像很多机器都不是那么实现.如果不能工作的话,就需要用pknife的RAS办法断网了.....