最后:希望高手给与指点。 雁过留声,人过留名
开始:
windows mobile 通过数据线连接PC,其实是建立一个虚拟的网。在你PC的网上邻居能看到
地址好像是:168.xx.1.2 大概就是这个样子。 网络的建立是通过那个ActiveSync。
在wm手机上会有好多网络连接。你可以枚举一下,好几个,真的!
你写的程序可能在不插上数据线的时候很正常,可是插上之后就不正常了,就是由于这个虚拟网的原因。
WM不会自己找,那就需要我们给他指定!
在网上找了很多资料,测试了一个正常的。
#include "stdafx.h"
#include "winsock.h"
#include <objbase.h>
#include <initguid.h>
#include <connmgr.h>
#include <connmgr_proxy.h>
#pragma comment( lib, "cellcore.lib" )
void ConnectGPRSNet( HANDLE& hConnection )
{
int hResult;
CONNMGR_CONNECTIONINFO ConnInfo;
memset( &ConnInfo, 0, sizeof(ConnInfo));
ConnInfo.cbSize = sizeof(ConnInfo);
ConnInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
ConnInfo.dwPriority = CONNMGR_PRIORITY_HIPRIBKGND;
ConnInfo.dwFlags=0;
ConnInfo.guidDestNet = IID_DestNetInternet;
DWORD dwStatus;
hResult = ConnMgrEstablishConnectionSync(&ConnInfo, &hConnection,30000, &dwStatus);
}
// 释放连接 连接完毕要删除地
void ReleaseGprsConnection ( HANDLE& hConnection )
{
if ( hConnection )
{
ConnMgrReleaseConnection(hConnection, FALSE);
hConnection = NULL;
}
}
这个在你程序的初始化时ConnectGPRSNet 一下, 在程序终止时ReleaseGprsConnection 一下。
由于有的程序会要求指定具体的网络。那么上面那个就不好了。下面时一个大致的代码,网上找的,写在这里留念。
oid ConnectGPRS()
{
//连接GPRS
DWORD dwStatus;// = 0;
HANDLE hConnection=NULL;
CONNMGR_CONNECTIONINFO sConInfo;
memset(&sConInfo, 0 ,sizeof(CONNMGR_CONNECTIONINFO));
sConInfo.cbSize = sizeof(CONNMGR_CONNECTIONINFO);
sConInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
sConInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
sConInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP|CONNMGR_FLAG_PROXY_WAP|CONNMGR_FLAG_PROXY_SOCKS4|CONNMGR_FLAG_PROXY_SOCKS5;
sConInfo.bExclusive = FALSE;
sConInfo.bDisabled = FALSE;
sConInfo.guidDestNet = IID_DestNetInternet; //IID_DestNetWAP
sConInfo.hWnd = 0;
sConInfo.uMsg = 0;
if (FAILED(ConnMgrEstablishConnectionSync(&sConInfo, &hConnection, 60000, &dwStatus))) ;
//目前,移动的WAP网关对外只提供HTTP代理协议(80和8080端口)和WAP网关协议(9201端口),
//彩信还有单独配置接入点是因为彩信服务需要连接专用的服务器。
//所以把上面那段代码中的IID_DestNetInternet换成IID_DestNetWAP,实际中是不能连通GPRS的。
if (hConnection)
{
ConnMgrReleaseConnection(hConnection, FALSE);
hConnection = NULL;
}
CStringArray StrAry;
CONNMGR_DESTINATION_INFO networkDestInfo = {0};
// 得到网络列表
for ( DWORD dwEnumIndex=0; ; dwEnumIndex++ )
{
memset ( &networkDestInfo, 0, sizeof(CONNMGR_DESTINATION_INFO) );
if ( ConnMgrEnumDestinations ( dwEnumIndex, &networkDestInfo ) == E_FAIL )
{
break;
}
StrAry.Add ( networkDestInfo.szDescription );
}
int Index =0;
//查找“WAP”的索引
for (int i = 0; i < StrAry.GetCount(); ++i)
{
if (StrAry[i] == L"WAP")
{
Index = i;
break;
}
}
// 得到正确的连接信息
CONNMGR_DESTINATION_INFO DestInfo = {0};
HRESULT hResult = ConnMgrEnumDestinations(Index, &DestInfo);
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_HIPRIBKGND;//CONNMGR_PRIORITY_USERINTERACTIVE;
ConnInfo.guidDestNet = DestInfo.guid;
ConnInfo.bExclusive = FALSE;
ConnInfo.bDisabled = FALSE;
DWORD dwStatus = 0;
hResult = ConnMgrEstablishConnectionSync(&ConnInfo, &hConnection, 100*1000, &dwStatus );
if(FAILED(hResult))
{
MessageBox(NULL,L"连接失败",L"错误信息",MB_OK);
hConnection = NULL;
}
else
{
MessageBox(NULL,L"连接成功",L"错误信息",MB_OK);
}
}
}