CInternetSession :: OpenURL в Windows Mobile вызывает ошибку 12029 (не удается подключиться) - PullRequest
1 голос
/ 05 мая 2009

Я пытаюсь получить доступ к данным, используя HTTP, вызывая CInternetSession :: OpenUrl в Windows Mobile 5 (кодирование на C ++ с MFC). Я всегда получаю исключение с кодом ошибки 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 сразу после этого, и это вызывает исключение.

1 Ответ

1 голос
/ 06 мая 2009

Вот код, который работает. Он использует 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.

...