思路:用ConnMgrQueryDetailedStatus找到Dest GUID, 然后根据Dest GUID用DMProcessConfigXML函数透过CM_GPRSEntries Configuration Service Provider来查接入点名称。
示例代码:
#include <stdlib.h>
#include <windows.h>
#include <connmgr.h>
#include <Connmgr_status.h>
#include <Cfgmgrapi.h>
#include <strsafe.h>
//
// FUNCTION: GetAPNFromEntryName(LPCTSTR szEntryName, LPTSTR szAPN, int cchAPN)
//
// PURPOSE: Get the GPRS Access Point Name form the Entry Name
//
HRESULT 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;
}
//
// we will enum the all connected GPRS
// and display their entry name and APN on the message box
//
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
TCHAR szAPN[200];
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 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;
}