📄 wmgprsconn.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 + -