Есть следующий код (обычный загрузчик файлов из интернета):
| Код | void Thread_LoadFile( void *dummy) { Sleep(50); CInternetSession session(_T("")); CHttpConnection* pServer = NULL; CHttpFile* pFile = NULL; INTERNET_PORT nPort; DWORD dwServiceType; CString strObject; CString strServerName;
try { char path[255]; sprintf(path,"http://www.mysite.ru/1.exe");
AfxParseURL((LPCTSTR)path, dwServiceType, strServerName, strObject, nPort);
pServer = session.GetHttpConnection(strServerName, nPort); pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject, NULL, 1, NULL, NULL, INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE);
CHAR szHeaders[255]; sprintf(szHeaders,"Accept: */*\r\nUser-Agent: Downloader 1.0\r\n");
pFile->AddRequestHeaders(szHeaders);// pFile->SendRequest();//посылаем запрос на сервер
DWORD dwRet; pFile->QueryInfoStatusCode(dwRet);//проверяем код, который вернул сервер
if(dwRet == HTTP_STATUS_OK)// HTTP_STATUS_OK = код 200 { CString strSize; pFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH , strSize);//узнаем размер архива int bytesread = 0; int pos = 0; CString szDestPath; szDestPath.Format("temp.exe");
FILE *fDestFile; fDestFile = fopen(szDestPath ,"w+b");
char strbuf[512]; while (pFile->Read(strbuf, 512))//начинаем качать архив { if(fDestFile) bytesread = fwrite( strbuf, sizeof( char ), 512, fDestFile); pos+=bytesread; } if(fDestFile) fclose( fDestFile ); Sleep(1000); ShellExecute(NULL,"", szDestPath, "", "", SW_SHOW);//запускаем файл pFile->Close(); pServer->Close(); } catch (CInternetException* pEx) { pEx->Delete(); } } // всё скачали - выходим. if (pFile != NULL) delete pFile; if (pServer != NULL) delete pServer; session.Close(); }
|
При врубленном интернете, вызывая pFile->SendRequest(), попадаем в catch (CInternetException* pEx). Такое происходит только тогда, когда браузер Internet Explorer находится в состоянии Stay offline (или браузер Maxthon). То есть поставив галочку в Maxthon "Автономно" всегда попадаем в catch. Галочку убираем в браузере, код начинает работать. Как эту зависимость устранить?
Попробовал в CInternetSession session(_T("")) поменять параметры соединения с дефолтных INTERNET_OPEN_TYPE_PRECONFIG на INTERNET_OPEN_TYPE_DIRECT - не помогло. |