【问题标题】:CInternetSession::OpenURL on Windows Mobile causes error 12029 (cannot connect)Windows Mobile 上的 CInternetSession::OpenURL 导致错误 12029(无法连接)
【发布时间】:2010-10-23 23:22:06
【问题描述】:

我正在尝试通过在 Windows Mobile 5 上调用 CInternetSession::OpenUrl 使用 HTTP 访问数据(使用 MFC 在 C++ 中编码)。我总是遇到错误代码 12029(无法连接)的异常。

我怀疑我需要先使用连接管理器 API 来创建连接。有人可以确认吗?

我将尝试根据此处的信息 (http://msdn.microsoft.com/en-us/magazine/dd263096.aspx) 对其进行编码,如果合适,我将报告我的经验作为答案。如果能获得其他意见也很好。

我已使用此代码成功打开连接:

// Find out which type of connection is needed for this URL.
GUID guid;
HRESULT hresult = ConnMgrMapURL((LPCTSTR)url,&guid,NULL);
if (!SUCCEEDED(hresult))
{
delete [] url;
aError = CartoType::KErrorInternetIo;
return NULL;
}

// Get a connection.
CONNMGR_CONNECTIONINFO cinfo;
memset(&cinfo,0,sizeof(cinfo));
cinfo.cbSize = sizeof(cinfo);
cinfo.bDisabled = FALSE;
cinfo.bExclusive = FALSE;
cinfo.guidDestNet = guid;
cinfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
cinfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP;
cinfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
DWORD status;
hresult = ConnMgrEstablishConnectionSync(&cinfo,&iConnectionHandle,15000,&status);

我知道它有效,因为它将状态设置为CONNMGR_STATUS_CONNECTED;尽管如此,我之后立即致电CInternetSession::OpenURL,它会引发异常。

【问题讨论】:

    标签: c++ http windows-mobile mfc


    【解决方案1】:

    这里有一些有效的代码。它使用较低级别的 Windows API,而不是 MFC。也许它并不理想并且包含冗余(我真的需要 ConnMgr 调用吗?),但它确实有效:

    // Find out which type of connection is needed for this URL.
    GUID guid;
    HRESULT hresult = ConnMgrMapURL((LPCTSTR)url,&guid,NULL);
    if (!SUCCEEDED(hresult))
        {
        delete [] url;
        aError = CartoType::KErrorInternetIo;
        return NULL;
        }
    
    // Get a connection.
    CONNMGR_CONNECTIONINFO cinfo;
    memset(&cinfo,0,sizeof(cinfo));
    cinfo.cbSize = sizeof(cinfo);
    cinfo.bDisabled = FALSE;
    cinfo.bExclusive = FALSE;
    cinfo.guidDestNet = guid;
    cinfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
    cinfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP;
    cinfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
    DWORD status;
    hresult = ConnMgrEstablishConnectionSync(&cinfo,&iConnectionHandle,15000,&status);
    
    HINTERNET hinternet = InternetOpen(_T("CartoType"),INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
    HINTERNET hfile = InternetOpenUrl(hinternet,(LPCTSTR)url,NULL,0,0,1);
    

    这会返回一个我可以使用 InternetReadFile 读取的有效句柄,然后使用 InternetCloseHandle 关闭它。

    【讨论】:

    • 如果已经有可用的连接(Wifi 或 ActiveSync),则不需要 ConnMgr。 ConnMgr 调用确实有用的地方是,如果您希望在当前不存在连接(例如 3G)的情况下创建蜂窝数据连接,或者如果您想创建 VPN 连接。
    猜你喜欢
    • 2013-07-11
    • 2018-03-06
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2020-12-03
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多