首页 > 技术文章 > 检测网页是否可以打开, 再使用IE打开网页

barrysgy 2014-05-12 14:09 原文

//检测是否能连接网页
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," \t\r\n");
			/*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);
	}
}

  

推荐阅读