//检测是否能连接网页
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打开网页的更多相关文章

  1. 原创:C语言打开、下载、删除网页,统计网页字符个数

    本程序由本人在华夏联盟的ID闪电笨笨原创,首发地址:http://bbs.hx95.com/ 写此程序希望可以可以激发新手学习C语言的积极性! C语言代码实现功能如下:            1.实现 ...

  2. Android 在安装完成界面,点击打开应用程序。在应用程序点击home键,再从桌面打开程序导致产生多个实例或者说程序被重复打开

    Android 在安装完成界面,点击打开应用程序.在应用程序点击home键,再从桌面打开程序导致产生多个实例或者说程序被重复打开. etong_123的专栏 - 博客频道 - CSDN.NET htt ...

  3. IE能够打开网页 可是chrome和火狐打不开网页解决的方法

    一次偶然.电脑的浏览器打不开经常使用的网页,奇怪的是IE能够打开 之外的其它浏览器都不能够,结果百度一下.找到一个帖子,亲自測试一下,果真能够解决.记录例如以下: (1)開始-执行-输入CMD-确定- ...

  4. 使用selenium webdriver+beautifulsoup+跳转frame,实现模拟点击网页下一页按钮,抓取网页数据

    记录一次快速实现的python爬虫,想要抓取中财网数据引擎的新三板板块下面所有股票的公司档案,网址为http://data.cfi.cn/data_ndkA0A1934A1935A1986A1995. ...

  5. 【Xcode 4 无法打开 Xcode 5 DP 打开过的工程文件 解决方法】

    试用Xcode 5 DP打开现有工程文件后再用Xcode4打开后 Xcode 4 会进入崩溃模式折腾了几次发现下面的方法可以让工程文件恢复 如果在Xcode5-DP中打开过xib文件需要在侧栏中修改I ...

  6. 安装vs2017后造成无法打开xproj项目无法打开

    安装vs2017后,再用vs2015打开xproj项目的时候会报错: Error MSB4019 The imported project "C:\Program Files\dotnet\ ...

  7. 快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力

    为了寻找一个优质的网页模板,网页设计师和开发者往往可能会花上大半天的时间.不过幸运的是,现在的网页设计师和开发人员已经开始共享HTML5,Bootstrap和CSS3中的免费网页模板资源.鉴于网站模板 ...

  8. 【已解决】每次打开Excel时会同时打开一个空的Excel表格

    每次打开Excel时会同时打开一个空的Excel表格,情况如图. 官方解法如下,本人验证有效: 方法1, 请到以后路径中检查是否存在与空白文件夹同名字的Excel文件,删除它. C:\Users\\A ...

  9. Windows组件:打开MSDTC,恢复Windows TaskBar,查看windows日志,打开Remote Desktop,打开Services,资源监控

    一,Win10 打开 MSDTC 1,Win+R 打开运行窗口,输入 dcomcnfg,打开组件服务窗口 2,在组件服务 catalog下找到 Distributed Transaction Coor ...

随机推荐

  1. golang的的模板引擎之pongo2

    https://github.com/flosch/pongo2 beego的扩展包 https://github.com/yansuan/beego-pongo2 gin的扩展包 https://g ...

  2. webstorm 10 设置文件的默认编码

    我在使用webstorm时,发现文件的默认编码是GBK 然后我找到了点击此处可以修改这个文件的编码,但是以后新建文件和项目默认生成的文件还是GBK, 设置项目文件的默认编码可以在 File----Se ...

  3. Ubuntu Server上的LVM配置

    在安装Linux的时候,通常遇到的一个比较头痛的问题就是分区,到底每个区该分多少,用了一段时间之后,某个分区又不够用了,该怎么办?如果是普通的服务器,那一切都好说,大不了就关机重新划分分区嘛,但是对于 ...

  4. [linux basic基础]----套接字

    套接字是一种通信机制,凭借这种机制client/server系统的开发者既可以在本地机器上进行,也可以跨网络进行. 1,服务器应用程序用系统调用socket来创建一个套接字,他是系统分配给服务器进程的 ...

  5. c# 对话框交换数据

    本例是一个管理联系人信息的小程序,程序有两个窗体,一个主窗体,在listview控件中显示联系人信息列表,一个对话框窗体,用来显示和修改 某个联系人的信息.通过主窗体的菜单命令,可以打开对话框,并把主 ...

  6. DBA_Oracle Erp中某个Form需进行升级Patch详解(案例)

    2014-06-21 Created By BaoXinjian

  7. Java中类的加载、连接和初始化

    Java中类的加载.连接和初始化 类的加载.连接和初始化 先介绍一下JVM和类 JVM和类: 当我们调用Java命令运行某个Java程序时,该命令将会启动一个Java虚拟机进程,不管该Java程序有多 ...

  8. eclipse中输入@符号自动提示Annotation

    将Eclipse中Content Assist中的Auto activation for java里.的后面加上@符号即可

  9. mysql索引之四(索引使用注意规则:索引失效--存在索引但不使用索引)

    但是如果是同样的sql如果在之前能够使用到索引,那么现在使用不到索引,以下几种主要情况: 1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全 ...

  10. Android学习笔记02

    1.线性布局LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...