//检测是否能连接网页 BOOL CanLinkWebPage(string strUrl) { /*clock_t start, finish; double duration; start = clock(); char buf[100];*/ //使用mfc的CHttpFile来检测 BOOL CanLink = FALSE; CInternetSession session("HttpClient"); session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 5000); // 5000毫秒的连接超时 session.SetOption(INTERNET_OPTION_SEND_TIMEOUT, 5000); // 5000毫秒的发送超时 session.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, 5000); // 5000毫秒的接收超时 session.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT, 5000); // 5000毫秒的发送超时 session.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 5000); // 5000毫秒的接收超时 session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); // 1次重试 try { CHttpFile* pFile = (CHttpFile*)session.OpenURL(strUrl.c_str(), 1, INTERNET_FLAG_RELOAD | INTERNET_FLAG_TRANSFER_BINARY); DWORD dwStatusCode; pFile-> QueryInfoStatusCode(dwStatusCode); /*sprintf_s(buf, "%s返回状态码是:%lu", strUrl.c_str(), dwStatusCode); UpdateDebugLogToFile(buf);*/ //200 302 206状态码都可以 if(dwStatusCode == HTTP_STATUS_OK || dwStatusCode == HTTP_STATUS_REDIRECT || dwStatusCode == HTTP_STATUS_PARTIAL_CONTENT) CanLink = TRUE; pFile -> Close(); delete pFile; } catch (CException* e) { e->Delete(); } session.Close(); /*finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; sprintf_s(buf, "%s%s%f%s, CanLink值:%d", strUrl.c_str()," 连接时间: ", duration, "秒", CanLink); UpdateDebugLogToFile(buf);*/ return CanLink; } //测试几个URL的速度 unsigned __stdcall TestUrlSpeed(void* _pParam) { string _Url; string* _pStr = (string*)_pParam; if (_pStr) { _Url = *_pStr; if(_pStr != NULL) { delete _pStr; _pStr = NULL; } } if(CanLinkWebPage(_Url)) return 1; else return 0; } // 打开网页 unsigned __stdcall OpenUrlUseIEThread(void* _pParam) { string _Url; string* _pStr = (string*)_pParam; if (_pStr) { _Url = *_pStr; SAFE_DELETE(_pStr); } if (!_Url.empty()) { vector<string> _UrlList; CVarTypeCvt::split_by(_Url,_UrlList,';'); vector<string> urls; for (INT _Idx = 0; _Idx < (INT)_UrlList.size(); _Idx++) { _Url = _UrlList[_Idx]; CVarTypeCvt::trim(_Url," "); /*if (!_Url.empty() && CanOpenWebPage(_Url)) { ::ShellExecute(NULL, "open",_Url.c_str(), NULL, NULL, SW_SHOWNORMAL); break; }*/ if (!_Url.empty()) { urls.push_back(_Url); } } HANDLE* pHandles = new HANDLE[urls.size()]; for(int i = 0; i < urls.size(); ++i) { unsigned _ThreadID; HANDLE _hThread = (HANDLE)_beginthreadex(NULL,NULL,TestUrlSpeed,(void*)new string(urls[i]),NULL,&_ThreadID); pHandles[i] = _hThread; } DWORD dw = WaitForMultipleObjects(urls.size(), pHandles, FALSE, 10000); if(dw != WAIT_FAILED && dw != WAIT_TIMEOUT) { DWORD dwRet; GetExitCodeThread(pHandles[dw - WAIT_OBJECT_0], &dwRet); if(dwRet) { ::ShellExecute(NULL, "open",urls[dw - WAIT_OBJECT_0].c_str(), NULL, NULL, SW_SHOWNORMAL); } } for(int i = 0; i < urls.size(); ++i) { if(pHandles[i] != NULL) { CloseHandle(pHandles[i]); pHandles[i] = NULL; } } delete [] pHandles; pHandles = NULL; } return 0; } void OpenUrlUseIE(string _Url, BOOL _Async = TRUE) { if (_Url.empty()) return; if (_Async) { unsigned _ThreadID; HANDLE _hThread = (HANDLE)_beginthreadex(NULL,NULL,OpenUrlUseIEThread,(void*)new string(_Url),NULL,&_ThreadID); CloseHandle(_hThread); _hThread = NULL; } else { ::ShellExecute(NULL, "open",_Url.c_str(), NULL, NULL, SW_SHOWNORMAL); } }