检测网页是否可以打开, 再使用IE打开网页
//检测是否能连接网页
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);
}
}
检测网页是否可以打开, 再使用IE打开网页的更多相关文章
- 原创:C语言打开、下载、删除网页,统计网页字符个数
本程序由本人在华夏联盟的ID闪电笨笨原创,首发地址:http://bbs.hx95.com/ 写此程序希望可以可以激发新手学习C语言的积极性! C语言代码实现功能如下: 1.实现 ...
- Android 在安装完成界面,点击打开应用程序。在应用程序点击home键,再从桌面打开程序导致产生多个实例或者说程序被重复打开
Android 在安装完成界面,点击打开应用程序.在应用程序点击home键,再从桌面打开程序导致产生多个实例或者说程序被重复打开. etong_123的专栏 - 博客频道 - CSDN.NET htt ...
- IE能够打开网页 可是chrome和火狐打不开网页解决的方法
一次偶然.电脑的浏览器打不开经常使用的网页,奇怪的是IE能够打开 之外的其它浏览器都不能够,结果百度一下.找到一个帖子,亲自測试一下,果真能够解决.记录例如以下: (1)開始-执行-输入CMD-确定- ...
- 使用selenium webdriver+beautifulsoup+跳转frame,实现模拟点击网页下一页按钮,抓取网页数据
记录一次快速实现的python爬虫,想要抓取中财网数据引擎的新三板板块下面所有股票的公司档案,网址为http://data.cfi.cn/data_ndkA0A1934A1935A1986A1995. ...
- 【Xcode 4 无法打开 Xcode 5 DP 打开过的工程文件 解决方法】
试用Xcode 5 DP打开现有工程文件后再用Xcode4打开后 Xcode 4 会进入崩溃模式折腾了几次发现下面的方法可以让工程文件恢复 如果在Xcode5-DP中打开过xib文件需要在侧栏中修改I ...
- 安装vs2017后造成无法打开xproj项目无法打开
安装vs2017后,再用vs2015打开xproj项目的时候会报错: Error MSB4019 The imported project "C:\Program Files\dotnet\ ...
- 快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力
为了寻找一个优质的网页模板,网页设计师和开发者往往可能会花上大半天的时间.不过幸运的是,现在的网页设计师和开发人员已经开始共享HTML5,Bootstrap和CSS3中的免费网页模板资源.鉴于网站模板 ...
- 【已解决】每次打开Excel时会同时打开一个空的Excel表格
每次打开Excel时会同时打开一个空的Excel表格,情况如图. 官方解法如下,本人验证有效: 方法1, 请到以后路径中检查是否存在与空白文件夹同名字的Excel文件,删除它. C:\Users\\A ...
- Windows组件:打开MSDTC,恢复Windows TaskBar,查看windows日志,打开Remote Desktop,打开Services,资源监控
一,Win10 打开 MSDTC 1,Win+R 打开运行窗口,输入 dcomcnfg,打开组件服务窗口 2,在组件服务 catalog下找到 Distributed Transaction Coor ...
随机推荐
- (转)Edge实现NodeJS与.NET互操作(包括UI界面示例)
本文转载自:http://blog.csdn.net/kimmking/article/details/42708049 1. Edge是什么 Edge是一种在进程内实现NodeJS与.NET互操作 ...
- ntp.conf:很少有人提及的事
[你可以到ntp.org下个ntp server的源代码,里面有HTML格式的文档,内容很全面.] [REF: http://doc.ntp.org/] Comprehensive List of C ...
- HAML学习
来源:http://ningandjiao.iteye.com/blog/1772845 一个技术能够风靡,一定是有它的原因的,在熟悉之前,我们没有资格去对它做任何的判断. Haml 是一种简洁优美的 ...
- 使用express搭建第一个Web应用【Node.js初学】
来源:http://jingyan.baidu.com/article/bad08e1ee501e009c8512106.html express是一个开源的node.js项目框架,初学者使用expr ...
- 我的Android最佳实践之—— Android启动画面的实现方法
本文实例讲述了Android启动画面的实现方法.分享给大家供大家参考.具体分析如下: 在应用程序中经常用到启动画面,会启动一个后台线程为主程序的运行准备资源.Android要实现启动画面可以这样做: ...
- MVC:上传文件
今天写了一个使用MVC上传的DEMO,很简单不超过10行代码.代码如下(关注重点,所以尽量精简掉其他代码): 项目结构
- HDU 3652 B-number(数位dp)
题意:B数的定义是有字符串“13”且能被整数13整除的数,求[1,n]内的B数个数. 题解:这是数位DP,我也就是刚入门,前两天看到了非递归写法,好麻烦.所以我建议写dfs的方法,容易理解,代码还简短 ...
- ADO.NET(查询、属性扩展)
一.ADO.NET 融合面向对象的查询语句 1.只查询一条数据 //数据访问中的select方法 public stu select(string xuehao) { stu s = null; cm ...
- [物理学与PDEs]第5章习题参考解答
[物理学与PDEs]第5章习题1 矩阵的极分解 [物理学与PDEs]第5章习题2 Jacobian 的物质导数 [物理学与PDEs]第5章习题3 第二 Piola 应力张量的对称性 [物理学与PDEs ...
- 在win7电脑中如何查看运行进程的PID标识符
在介绍技巧方法之前,咱们还是先来介绍一下什么是PID标识符,这个PID标识符就是系统对运行中的程序自动分配的一个编号,是用来识别对应进程的,而且这个编号也是一一对应,不会有重复的,只有当系统结束运行的 ...