获取接入点类型名称,主要通过DMProcessConfigXML函数 #include <connmgr.h> #include <Connmgr_status.h> #include <Cfgmgrapi.h> #include <strsafe.h> HRESULT GPRSConnection::GetAPNFromEntryName(LPCTSTR szEntryName, LPTSTR szAPN, int cchAPN) { // parm query formating string of "CM_GPRSEntries Configuration Service Provider" LPCTSTR 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; LPTSTR szOutput = NULL; if(NULL == szEntryName) return E_INVALIDARG; // prepare the query string with the special entry name LPTSTR szInput = new TCHAR[_tcslen(szFormat) + _tcslen(szEntryName) + 10]; if(NULL == hr) return E_OUTOFMEMORY; _stprintf(szInput, szFormat, szEntryName); // Process the XML. hr = DMProcessConfigXML(szInput, CFGFLAG_PROCESS, &szOutput); if(S_OK == hr) { hr = E_FAIL; // find the value of GPRSInfoAccessPointName param LPTSTR szAPNStrStart = _tcsstr(szOutput, TEXT("value=/"")); if(NULL != szAPNStrStart) { szAPNStrStart += _tcslen(TEXT("value=/"")); // find the end of value string LPTSTR szAPNStrEnd = _tcsstr(szAPNStrStart, TEXT("/"")); if(NULL != szAPNStrEnd) { // set the null char at the end of the value string *szAPNStrEnd = TEXT('/0'); // get the final Access Point Name string _tcsncpy(szAPN, szAPNStrStart, cchAPN); hr = S_OK; } } } // the caller must delete the XML returned from DMProcessConfigXML. delete[] szOutput; // clear the input string delete[] szInput; return hr; } // 连上了才能得到接入点名称 int GPRSConnection::GetAccessPointName() { TCHAR szAPN[200]; // Get the the required size of the buffer // with which the function needs to be called on the next attempt. DWORD dwSize = 0; 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; // Get the connection information hr = ConnMgrQueryDetailedStatus((CONNMGR_CONNECTION_DETAILED_STATUS*)pBuffer, &dwSize); if(S_OK == hr) { // Enum each connection entry CONNMGR_CONNECTION_DETAILED_STATUS* cmStatus = (CONNMGR_CONNECTION_DETAILED_STATUS*)pBuffer; 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) { // get the connected GPRS APN if(S_OK == GetAPNFromEntryName(cmStatus->szDescription, szAPN, 200)) MessageBox(NULL, szAPN, cmStatus->szDescription, MB_OK | MB_ICONINFORMATION); } // test the next one cmStatus = cmStatus->pNext; } } // clear the buffer delete pBuffer; return 0; }