2009年9月8日 星期二

查詢連線狀態

1. 利用ConnMgrQueryDetailedStatus查詢所有連線
char szBuf[4096]; //一次給4096比較充足,就不需要qurey2次
DWORD dwSize = 0;
CONNMGR_CONNECTION_DETAILED_STATUS *pDetailStatus = (CONNMGR_CONNECTION_DETAILED_STATUS*) szBuf;
HRESULT hRet = S_FALSE;
int idx = 0;
dwSize = sizeof(szBuf);
hRet = ConnMgrQueryDetailedStatus(pDetailStatus, &dwSize);
if(S_OK != hRet)
{
_tprintf( _T("\n Fail to query detailed status"));
return;
}
while( TRUE )
{
TCHAR wszDestGUID[18] = {0};
unsigned char szGUID[8] = {0};
memcpy(szGUID, pDetailStatus->guidDestNet.Data4, 8);
int nDigit[16];
memset(nDigit, 0, sizeof(int) * 16);
int j = 0;

這裡是因為我當初要去抓GUID,GUID有4個data,第4個data是byte, 4個bit一個數字,16進位的數字.
pDetailStatus->guidDestNet--每一組連線都有一組GUID值,連線相關資訊亦會儲存在
HKEY_LOCAL_MACHINE\Comm\ConnMgr\Providers\{EF097F4C-DC4B-4c98-8FF6-AEF805DC0E8E}\{XXXXX......}之下.
取得目前連線中的GUID,可以反推回去,取得連線中的proxy值,ConnMgrQueryDetailedStatus無法取得proxy,但連線至網際網路時,若有proxy必須設定proxy.

for(int i = 0; i < 8; i++)
{
int nDigit1, nTemp;
nDigit1 = szGUID[i] >> 4;
nTemp = nDigit1 << 4;
int nDigit2 = szGUID[i] - nTemp;
nDigit[j] = nDigit2; nDigit[j+1] = nDigit1; j = j + 2;
}
for(int n = 1; n < 16; n = n + 2)
{
TCHAR szTemp[1];
wsprintf(szTemp, _T("%X"), nDigit[n]);
wcscat(wszDestGUID, szTemp);
wsprintf(szTemp, _T("%X"), nDigit[n-1]);
wcscat(wszDestGUID, szTemp);
if(n == 3)
wcscat(wszDestGUID, _T("-"));
}
TCHAR szTemp[MAX_PATH];
wsprintf(m_wszDestGUID, _T("%02X-%02X-%02X-%s"), pDetailStatus->guidDestNet.Data1, pDetailStatus->guidDestNet.Data2, pDetailStatus->guidDestNet.Data3, wszDestGUID);
wcscpy(m_wszCurrConnectKey, TEXT("Comm\\ConnMgr\\Providers\\{EF097F4C-DC4B-4c98-8FF6-AEF805DC0E8E}\\"));
wcscpy(szTemp, _T("HTTP-{"));
wcscat(szTemp, m_wszDestGUID);
wcscat(szTemp, _T("}"));
wcscat(m_wszCurrConnectKey, szTemp);
}
if(NULL == pDetailStatus->pNext)
break;
pDetailStatus =pDetailStatus->pNext;
}

利用ConnMgrQueryDetailedStatus,可以查詢到所有連線, 若是想知道目前連線中的,則利用pDetailStatus->dwConnectionStatus == CONNMGR_STATUS_CONNECTED,再去細看其它各項資訊.

2. 利用Registry查詢連線資訊
DWORD dwType = 0 , dwSize = 0;
HKEY hKey;
int nCount = 0;

HKEY_LOCAL_MACHINE\System\State\Connections\Cellular ->the state of current cellular connections

if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("System\\State\\Connections\\Cellular"), 0, 0, &hKey))
{
dwSize = sizeof(DWORD);
RegQueryValueEx(hKey, _T("Count"), NULL, &dwType, (LPBYTE)&nCount, &dwSize);
}

"Count"-Number of cellular connections that are currently connected.
上述利用ConnMgrQueryDetailedStatus去查詢,pDetailStatus->dwConnectionStatus == CONNMGR_STATUS_CONNECTED,是用來查詢目前連線中相關資訊,此部份包含ActiveSync連線.