2008年7月26日星期六

Windows Mobile枚举网络链接

本文适用于Windows Mobile 2003以上版本。

有很多Window Mobile(一下简称WM)的程序需要访问网络,但是在国内环境下,访问网络还是比较昂贵的。因此大多数程序都是在需要的时候自动建立网络连接,然后访问网络,做一些事情之后断开链接。所要求的也就是用户事先设定好网络连接的帐号。

要完成这样的功能,需要利用Windows Mobile SDK中的Connection Manager。只需要三个函数即可完成任务。

  • ConnMgrEnumDestinations
  • ConnMgrEstablishConnectionSync/ConnMgrEstablishConnection
  • ConnMgrReleaseConnection
需要的包含的头文件为<connmgr.h>

其实想法很简单,我们利用ConnMgrEnumDestinations枚举可用的网络,然后利用ConnMgrEstablishConnectionSync/ConnMgrEstablishConnection(前者在建立链接完毕之前不会返回,后者直接返回,本文使用前者为例),最后使用ConnMgrReleaseConnection断开链接。

示例代码如下:


HRESULT hResult = E_FAIL;
CONNMGR_DESTINATION_INFO DestInfo;
int index = 0;
hResult = ConnMgrEnumDestinations(index++, &DestInfo);
TCHAR* str1 = _T("Internet");
TCHAR* str2 = _T("单位");
while(SUCCEEDED(hResult))
{

if( _tcsstr(DestInfo.szDescription, str1) != NULL ||
_tcsstr(DestInfo.szDescription, str2) != NULL )
{
//
// try to connect
CONNMGR_CONNECTIONINFO ConnInfo;
ZeroMemory(&ConnInfo, sizeof(ConnInfo));
ConnInfo.cbSize = sizeof(ConnInfo);
ConnInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
ConnInfo.dwPriority = CONNMGR_PRIORITY_USERBACKGROUND;
ConnInfo.bExclusive = TRUE;
ConnInfo.guidDestNet = DestInfo.guid;
HANDLE hConnection;
DWORD status;
hResult = ConnMgrEstablishConnectionSync
(&ConnInfo, &hConnection, 60*1000,&status);
if( SUCCEEDED(hResult) &&(status & CONNMGR_STATUS_CONNECTED)){
hResult = ConnMgrReleaseConnection(hConnection, FALSE);
break;
}
else{
switch(status)
{
// do something;
}
}
}
hResult = ConnMgrEnumDestinations(index++, &DestInfo);
}



程序相当简单,因为一般WM的手机都使用Internet(CMNET)或者单位链接(CMWAP)来连入网络,所以我把其他的网络过滤掉了。

注意红色标出的部分,这里表明该链接是独占的。只有这样的链接才能断开。

没有评论: