最近一直在做mobile联网方面的工作,有点成果,在此分享下。希望大家能够指正。
由于拨号采用的是ConnMgrMapURL来自动分析选择连接方式,所以对于如何区分wap和net网络是个比较头疼的问题。参考了刀哥的文章
http://blog.csdn.net/pknife/archive/2008/11/07/3248315.aspx
和下面帖子里
http://topic.csdn.net/u/20080520/16/ff4273af-c2f3-409b-b992-4c18bd48d91a.html
网友chengchenz的回帖,总结出下面方法:
电信(CDMA)
HRESULT GetAPNFromEntryName(LPCTSTR szEntryName, TCHAR* szAPN)
{
LPCWSTR szFormat = TEXT("<wap-provisioningdoc>")
TEXT(" <characteristic type=/"CM_PPPEntries/">")
TEXT(" <characteristic type=/"%s/">")
TEXT(" <parm-query name=/"UserName/"/>")
TEXT(" </characteristic>")
TEXT(" </characteristic>")
TEXT("</wap-provisioningdoc>");
HRESULT hr = E_FAIL;
LPWSTR szOutput = NULL;
if(NULL == szEntryName)
return E_INVALIDARG;
int nLen = _tcslen(szFormat) + _tcslen(szEntryName) + 10;
LPWSTR szInput = new TCHAR[nLen];
ZeroMemory(szInput, nLen);
if(NULL == hr)
return E_OUTOFMEMORY;
_stprintf(szInput, szFormat, szEntryName);
hr = DMProcessConfigXML(szInput, CFGFLAG_PROCESS, &szOutput);
if(S_OK == hr)
{
hr = E_FAIL;
LPWSTR szAPNStrStart = _tcsstr(szOutput, TEXT("value=/""));
if(NULL != szAPNStrStart)
{
szAPNStrStart += _tcslen(TEXT("value=/""));
LPWSTR szAPNStrEnd = _tcsstr(szAPNStrStart, TEXT("@")); //CDMA
if(NULL != szAPNStrEnd)
{
int nResult = szAPNStrEnd - szAPNStrStart;
for (int i = 0; i < nResult; ++i)
{
szAPN[i] = szAPNStrStart[i];
}
_tcscpy(m_szAPNResult, szAPN);
hr = S_OK;
}
}
}
delete[] szOutput;
delete[] szInput;
return hr;
}
移动(GSM)
HRESULT GetAPNFromEntryName(LPCTSTR szEntryName, TCHAR* szAPN)
{
LPCWSTR szFormat = TEXT("<wap-provisioningdoc>")
TEXT(" <characteristic type=/"CM_GPRSEntries/">")
TEXT(" <characteristic type=/"%s/">")
TEXT(" <characteristic type=/"DevSpecificCellular/">")
TEXT(" <parm-query name=/"GPRSInfoAccessPointName/"/>")
TEXT(" </characteristic>")
TEXT(" </characteristic>")
TEXT(" </characteristic>")
TEXT("</wap-provisioningdoc>");
HRESULT hr = E_FAIL;
LPWSTR szOutput = NULL;
if(NULL == szEntryName)
return E_INVALIDARG;
int nLen = _tcslen(szFormat) + _tcslen(szEntryName) + 10;
LPWSTR szInput = new TCHAR[nLen];
ZeroMemory(szInput, nLen);
if(NULL == hr)
return E_OUTOFMEMORY;
_stprintf(szInput, szFormat, szEntryName);
hr = DMProcessConfigXML(szInput, CFGFLAG_PROCESS, &szOutput);
if(S_OK == hr)
{
hr = E_FAIL;
LPWSTR szAPNStrStart = _tcsstr(szOutput, TEXT("value=/""));
if(NULL != szAPNStrStart)
{
szAPNStrStart += _tcslen(TEXT("value=/""));
LPWSTR szAPNStrEnd = _tcsstr(szAPNStrStart, TEXT("/"")); //GSM
if(NULL != szAPNStrEnd)
{
int nResult = szAPNStrEnd - szAPNStrStart;
for (int i = 0; i < nResult; ++i)
{
szAPN[i] = szAPNStrStart[i];
}
_tcscpy(m_szAPNResult, szAPN);
hr = S_OK;
}
}
}
delete[] szOutput;
delete[] szInput;
return hr;
}
下面是测试函数:
void fun()
{
DWORD dwSize = 0;
HRESULT hr = E_FAIL;
// Get the the required size of the buffer
// with which the function needs to be called on the next attempt.
hr = ConnMgrQueryDetailedStatus(NULL, &dwSize);
if(STRSAFE_E_INSUFFICIENT_BUFFER != hr)
return;
LPBYTE pBuffer = new BYTE[dwSize];
if(NULL == pBuffer)
return;
TCHAR szAPN[MAX_PATH];
ZeroMemory(szAPN, MAX_PATH);
// Get the connection information
hr = ConnMgrQueryDetailedStatus((CONNMGR_CONNECTION_DETAILED_STATUS*)pBuffer, &dwSize);
CONNMGR_CONNECTION_DETAILED_STATUS* cmStatus = (CONNMGR_CONNECTION_DETAILED_STATUS*)pBuffer;
if(S_OK == hr)
{
// Enum each connection entry
while(NULL != cmStatus)
{
// find the connected GPRS entry
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)
{
GetAPNFromEntryName(cmStatus->szDescription, szAPN);
}
// test the next one
cmStatus = cmStatus->pNext;
}
}
delete pBuffer;
}
这样,可以正确的区分出cmwap和cmnet(ctwap和ctnet)网络,从而在后续的操作中判断是否需要添加代理地址。