2009-05-05 7 views
1

Ich versuche, auf Daten über HTTP zuzugreifen, indem ich CInternetSession :: OpenUrl auf Windows Mobile 5 (Codierung in C++ mit MFC) aufruft. Ich bekomme immer eine Ausnahme mit Fehlercode 12029 (kann nicht verbinden).CInternetSession :: OpenURL unter Windows Mobile verursacht Fehler 12029 (kann nicht verbunden werden)

Ich vermute, dass ich die Connection Manager API verwenden muss, um zuerst eine Verbindung zu erstellen. Kann das jemand bestätigen?

Ich werde versuchen, es zu kodieren, basierend auf Informationen hier (http://msdn.microsoft.com/en-us/magazine/dd263096.aspx), und ich werde meine Erfahrungen als eine Antwort, falls zutreffend. Es wäre schön, auch andere Eingaben zu erhalten.

Ich habe geöffnet erfolgreich eine Verbindung mit diesem Code:

// 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); 

und ich weiß, dass es funktioniert, weil es den Status CONNMGR_STATUS_CONNECTED setzt; trotzdem rufe ich gleich danach CInternetSession::OpenURL an und es löst eine Ausnahme aus.

Antwort

1

Hier ist ein Code, der funktioniert. Es verwendet die untergeordnete Windows-API, nicht MFC. Vielleicht ist es nicht ideal und enthält Redundanzen (wirklich tun Ich brauche die ConnMgr nennt?), Aber es funktioniert:

// 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); 

Dies gibt einen gültigen Handle, das ich lesen kann Internetread verwenden, schließen Sie dann Internetclose verwenden.

+0

Sie benötigen den ConnMgr nicht, wenn bereits eine Verbindung verfügbar ist (Wifi oder ActiveSync). Wo die ConnMgr-Anrufe nützlich sind, ist es, wenn Sie eine Mobilfunk-Datenverbindung erstellen möchten, wenn derzeit keine Verbindung besteht (z. B. 3G) oder wenn Sie eine VPN-Verbindung erstellen möchten. –