但透过ConnMgrMapURL、ConnMgrEstablishConnectionSync、ConnMgrQueryDetailedStatus这三个函数的组合是可以达到楼主想要的结果。步骤如下:
1、先用ConnMgrMapURL让系统来选择一个最佳的连接,其实系统选择的就是我们在网络管理中所设置的。
GUID guid;
memset(&guid, 0, sizeof(GUID));
DWORD dwIndex = 0;
::ConnMgrMapURL(L"http://wap.baidu.com", &guid, &dwIndex);
这边的url是用http开头还是wsp开题我没研究过,但值得注意的是dwIndex一定要初始化为0。
2、然后用ConnMgrEstablishConnectionSync建立连接
CONNMGR_CONNECTIONINFO connInfo;
ZeroMemory(&connInfo, sizeof(CONNMGR_CONNECTIONINFO));
//为了能够建立连接要填写CONNMGR_CONNECTIONINFO结构体
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 = guid;//这边的GUID用的就是刚才ConnMgrMapURL所得到的GUID
connInfo.bExclusive = FALSE;
connInfo.bDisabled = FALSE;
//通过同步方式建立连接
hResult = ::ConnMgrEstablishConnectionSync(&connInfo, &m_hConnection, 10*1000, &dwStatus);
3、通过以上两个步骤其实已经建立的GPRS连接,但并非就这样完事了,就如同网上经常有人讨论的那样这边不可避免的还得牵扯CMWAP和CMNET的问题(简单点就是是否使用代理),但获取代理之前得先找到当前建立的连接,这个可以通过ConnMgrQueryDetailedStatus来实现。
DWORD dwSize = 0;
GUID destGuid;
char m_sNowTraffic[255];
HRESULT hr = E_FAIL;
hr = ConnMgrQueryDetailedStatus(NULL, &dwSize);
if(STRSAFE_E_INSUFFICIENT_BUFFER != hr)
return hr;
LPBYTE pBuffer = new BYTE[dwSize];
if(NULL == pBuffer)
return E_OUTOFMEMORY;
hr = ConnMgrQueryDetailedStatus((CONNMGR_CONNECTION_DETAILED_STATUS*)pBuffer, &dwSize);
if(S_OK == hr)
{
CONNMGR_CONNECTION_DETAILED_STATUS* cmStatus = (CONNMGR_CONNECTION_DETAILED_STATUS*)pBuffer;
while(NULL != cmStatus)
{
// 找到当前处于连接状态的GPRS连接
if((cmStatus->dwParams &
(CONNMGRDETAILEDSTATUS_PARAM_TYPE |CONNMGRDETAILEDSTATUS_PARAM_DESCRIPTION | CONNMGRDETAILEDSTATUS_PARAM_CONNSTATUS))
&&CM_CONNTYPE_CELLULAR == cmStatus->dwType &&CONNMGR_STATUS_CONNECTED == cmStatus->dwConnectionStatus &&NULL != cmStatus->szDescription)
{
//我不知道这个destGuid的学名叫什么,但是它在寻找代理的过程中很有用处
memcpy(&destGuid, &(cmStatus->guidDestNet), sizeof(GUID));
}
cmStatus = cmStatus->pNext;
}
}
// clear the buffer
delete pBuffer;
4、接着就是通过查找注册表来得到代理了,当然如果是CMNET的话就没有代理了,因而通过以下函数也就不会有什么结果
bool GetProxyFromReg(TCHAR * szProxy, int nProxySize)
{
HKEY hKey;
//打开注册表
if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, SEARCH_KEY, 0 ,0, &hKey))
{
return false;
}
DWORD dwSubKeysNumber;
DWORD dwMaxSubKeyLen;
if (ERROR_SUCCESS != RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeysNumber, &dwMaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, NULL) )
{
return false;
}
int nIndex = 0;
DWORD dwSize;
DWORD dwType;
DWORD dwNSize = MAX_PATH;
TCHAR szSubKeyName[MAX_PATH] = {0};
TCHAR szDestId[MAX_PATH] = {0};
CString strSrcGuid;
//这边的m_guid就是步骤3中所得到的那个destGuid
strSrcGuid.Format(_T("{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}"),
m_guid.Data1, m_guid.Data2, m_guid.Data3,
m_guid.Data4[0], m_guid.Data4[1], m_guid.Data4[2],
m_guid.Data4[3], m_guid.Data4[4],m_guid.Data4[5],
m_guid.Data4[6], m_guid.Data4[7]);
bool bSearch = false;
while (!bSearch && ERROR_NO_MORE_ITEMS != RegEnumKeyEx(hKey, nIndex, szSubKeyName, &dwNSize, NULL, NULL, NULL, NULL))
{
HKEY hSubKey;
CString strSubPath = SEARCH_KEY + CString(_T("//")) + CString(szSubKeyName);
DWORD dwNetType = -1;
DWORD dwEnable = -1;
TCHAR szSrcId[MAX_PATH] = {0};
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, strSubPath, 0, 0, &hSubKey) == ERROR_SUCCESS)
{
dwSize = sizeof(szSrcId);
RegQueryValueEx(hSubKey, _T("SrcId"), NULL, &dwType, (LPBYTE)szSrcId, &dwSize);
dwSize = sizeof(dwNetType);
RegQueryValueEx(hSubKey, _T("Type"), NULL, &dwType, (LPBYTE)&dwNetType, &dwSize);
dwSize = sizeof(dwEnable);
RegQueryValueEx(hSubKey, _T("Enable"), NULL, &dwType, (LPBYTE)&dwEnable, &dwSize);
if (strSrcGuid.CompareNoCase(szSrcId) == 0 && (dwNetType == CONNMGR_FLAG_PROXY_HTTP) && dwEnable == 1)
{
//就在这边了,只是得到是类似于10.0.0.172:80的东西
dwSize = nProxySize;
RegQueryValueEx(hSubKey, _T("Proxy"), NULL, &dwType, (LPBYTE)szProxy, &dwSize);
bSearch = true;
}
RegCloseKey(hSubKey);
}
nIndex++;
dwNSize = MAX_PATH;
}
RegCloseKey(hKey);
if( bSearch && szProxy[0] == NULL )
return FALSE;
return bSearch;
}
c# wincd gprs
最新推荐文章于 2024-09-26 20:57:04 发布