none
如何切换手机网络 RRS feed

  • 问题

  • 我现在的问题是,应用不能使用GPRS的CMWAP、CDMA的WAP连接网络(当然也可以用Socket,不过这样底层改动太大了,对其他部分影响太大),所以应用使用连接之前,先检测当前已连接的网络是否是有代理的连接,如果是用代理连网的连接,则断开当前连接,重新拨一个非代理连接。

    步骤如下:

    1、现在我是通过注册表去判断连接是否有代理,但是感觉不太可靠,各位是否有更好的办法?(其中GUID m_guid是通过ConnMgrEnumDestinations获取的guid):

    bool CMainFrame::GetProxyFromReg(GUID m_guid,TCHAR * szProxy, int nProxySize)
    {
        HKEY hKey;
            LPCWSTR SEARCH_KEY = _T("\\Comm\\ConnMgr\\Providers");
        //打开注册表
        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;
        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)
                {              
                    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;
    }

     

    2、根据第一步判断是否有代理以后,怎么通过RasHangUp或者ConnMgrReleaseConnection断开该连接,也就是怎么去获取当前连接的句柄?不能遍历所有的现有连接,然后去断掉,只能断掉当前使用了代理的连接。

    试过很多办法,都不行。

    我接触WinCE甚至C++也不到一个月,实乃新手,提问里面也可能有错误的理解,还望各位多多帮忙指正,谢谢先!

    2010年5月21日 8:04

答案