⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmgprsconn.cpp

📁 evc 的关于gprs连接的源代码~~~~
💻 CPP
字号:
#include "stdafx.h"
#include <Connmgr.h>
#include "wmgprsconn.h"

CWMGPRSConn::CWMGPRSConn(void){
	this->hConn=NULL;
}

CWMGPRSConn::~CWMGPRSConn(void){
	this->ReleaseConn();
}

void CWMGPRSConn::ReleaseConn(void){
	if (NULL!=this->hConn){
        ConnMgrReleaseConnection(this->hConn,0);
        this->hConn=NULL;
    }
}
//首先检查设备中是否有可用连接
BOOL CWMGPRSConn::VerifyConnMgr(void){
    HANDLE hConnMgr = ConnMgrApiReadyEvent();
    BOOL bAvailbale = FALSE;
    DWORD dwResult = WaitForSingleObject(hConnMgr,2000);//如果毫秒数设置为INFINITE,则一直等待到有信号返回为止,用两秒时间等待返回足够
    if (dwResult==WAIT_OBJECT_0)	bAvailbale = TRUE;//说明有可用的连接
    if (hConnMgr) CloseHandle(hConnMgr);
    return bAvailbale;
}
//枚举所有可用连接-可能为: 单位设置 / Internet 设置 / 默认单位设置 / 安全 WAP 网络 / WAP 网络 / 默认 Internet 设置
int CWMGPRSConn::EnumNetIdent(OUT _bstr_t* &StrAry){
	if(!this->VerifyConnMgr()) return 0;
    CONNMGR_DESTINATION_INFO networkDestInfo = {0};
	DWORD dwEnumIndex;//记录可连接的个数
    // 得到网络列表
	_bstr_t* StrAryTemp;//由于个数为止,所以每次循环都会被重新开辟新空间存储数据,此变量为中间倒数据临时使用
    for(dwEnumIndex=0;;dwEnumIndex++){
		if(dwEnumIndex>0){//已不是首次执行,需要把上次得倒数据转到临时变量中,再重新申请内存前释放上次分配的内存
		    StrAryTemp=new _bstr_t[dwEnumIndex];
			for(DWORD i=0;i<dwEnumIndex;i++) StrAryTemp[i]=StrAry[i].copy();
			if(StrAry) delete[] StrAry;
		}
		StrAry=new _bstr_t[dwEnumIndex+1];//申请新内存空间
		if(dwEnumIndex>0){//把申请新内存空间前保存倒临时变量内的数据取回来,再释放掉临时变量申请的内存
			for(DWORD i=0;i<dwEnumIndex;i++) StrAry[i]=StrAryTemp[i].copy();
			if(StrAryTemp) delete[] StrAryTemp;
		}
        memset(&networkDestInfo,0,sizeof(CONNMGR_DESTINATION_INFO));
        if (ConnMgrEnumDestinations(dwEnumIndex,&networkDestInfo)==E_FAIL) break;
		StrAry[dwEnumIndex]=networkDestInfo.szDescription;
    }
	return dwEnumIndex;
}
//用远程URL映射的方式来为系统自动选取一个最优的“Internet”连接名称,参数pcsDesc返回名称,函数返回该名称在连接列表里的索引值,为-1则为寻找失败。 
int CWMGPRSConn::MapURLAndGUID(LPCTSTR lpszURL,OUT GUID &guidNetworkObject,OUT BSTR *pcsDesc/*=NULL*/){
    if(!lpszURL||lstrlen(lpszURL)<1)	return FALSE;//如果参数为空或长度为0则返回失败
    memset(&guidNetworkObject,0,sizeof(GUID));
    int nIndex = 0;
    HRESULT hResult=ConnMgrMapURL(lpszURL,&guidNetworkObject,(DWORD*)&nIndex);//获取最优连接的索引号
    if(FAILED(hResult)){
        nIndex = -1;
        DWORD dwLastError = GetLastError ();
        //MessageBox ( _T("Could not map a request to a network identifier") );
    }else{
        if(pcsDesc){
            CONNMGR_DESTINATION_INFO DestInfo = {0};
            if(SUCCEEDED(ConnMgrEnumDestinations(nIndex,&DestInfo)))	*pcsDesc=DestInfo.szDescription;
        }
    }
    return nIndex;
}
//最后启用指定编号的连接并检查连接状态
BOOL CWMGPRSConn::EstablishConn(BSTR name/*=NULL*/,DWORD dwIndex/*=-1*/){
    this->ReleaseConn();//释放之前的连接
	if(NULL==name && -1==dwIndex) return false;//参数不能同时不设置
    // 得到正确的连接信息
    CONNMGR_DESTINATION_INFO DestInfo={0},DestInfo1={0},DestInfo2={0};
	HRESULT hResult,hResult1,hResult2; hResult=hResult1=hResult2=E_FAIL;
	if(-1!=dwIndex){
		hResult1=ConnMgrEnumDestinations(dwIndex,&DestInfo1);
		if(SUCCEEDED(hResult1) && NULL!=name){
			if(wcscmp(DestInfo1.szDescription ,name)) hResult1=E_FAIL;
		}
	}
	if(NULL!=name){
		if(E_FAIL==hResult1){//如果hResult1成功说明已对name判断过了无需再判断
			if(-1==dwIndex){//如果dwIndex>-1前提下hResult1失败说明dwIndex和name不匹配,没有必要在判断下去了
				for(DWORD i=0;;i++){
					memset(&DestInfo2,0,sizeof(CONNMGR_DESTINATION_INFO));
					if ((hResult2=ConnMgrEnumDestinations(i,&DestInfo2))==E_FAIL) break;
					if(!wcscmp(DestInfo2.szDescription ,name))	break;
				}
			}
		}
	}
	if(SUCCEEDED(hResult1)){	hResult=hResult1;	DestInfo=DestInfo1;}
	else if(SUCCEEDED(hResult2)){	hResult=hResult2;	DestInfo=DestInfo2;}
    BOOL bRet = FALSE;
    if(SUCCEEDED(hResult)){
        CONNMGR_CONNECTIONINFO ConnInfo;//初始化连接结构
        ZeroMemory(&ConnInfo, sizeof(ConnInfo));
        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.guidDestNet =DestInfo.guid;//IID_DestNetInternet;
        ConnInfo.bExclusive    = FALSE; 
        ConnInfo.bDisabled = FALSE;
        DWORD dwStatus = 0;
        hResult = ConnMgrEstablishConnectionSync(&ConnInfo,&this->hConn,10*1000,&dwStatus);
        if(FAILED(hResult))	this->hConn = NULL;
        else bRet = TRUE;
    }
    return bRet;
}
//检测连接状态
BOOL CWMGPRSConn::IsConnected(int nTimeoutSec,DWORD *pdwStatus/*=NULL*/){
	if(NULL==this->hConn) return false;
    DWORD dwStartTime=GetTickCount ();
    BOOL bRet = FALSE;
    while(GetTickCount()-dwStartTime<(DWORD)nTimeoutSec*1000){
        DWORD dwStatus=0;
        HRESULT hr = ConnMgrConnectionStatus(this->hConn,&dwStatus);
        if(pdwStatus) *pdwStatus = dwStatus;
        if(SUCCEEDED(hr)){
            if(dwStatus==CONNMGR_STATUS_CONNECTED){bRet = TRUE;break;}
        }
        Sleep(100);
    }
    return bRet;
}
//检测是否有可用连接,并连接
BOOL CWMGPRSConn::ConnGPRS(LPCTSTR lpszURL,BSTR name/*=NULL*/)
{
	if(NULL==lpszURL) return false;
	if(!this->VerifyConnMgr()) return false;

	BSTR bstStr=NULL;
	if(NULL!=name) bstStr=SysAllocString(name);

	if(NULL!=bstStr && SysStringLen(bstStr)>0){
		if(this->EstablishConn(bstStr)){ SysFreeString(bstStr); return true;}
		else{ SysFreeString(bstStr); return false;}
	}else{
		if(NULL!=bstStr) SysFreeString(bstStr);
		GUID guidNetworkObject;
		return this->EstablishConn(NULL,this->MapURLAndGUID(lpszURL,guidNetworkObject));
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -