CDHtmlDialog 浏览器遇到的服务器忙( Server Busy)问题

今天用CDHtmlDialog创建了一个简单的浏览器程序,遇到了一个问题,记录一下。

问题描述:当超链接的打开方式为_blank的时候,会弹出一个服务器忙的对话框,如图:

网页内容

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
</HEAD>
<BODY ID=CAntiNetTimeoutDlg BGCOLOR=LIGHTGREY style="font-family:MS Shell Dlg;font-size:9">
<a href="http://www.baidu.com" target="_blank" >百度</a>
<TABLE WIDTH=100% HEIGHT=100%>
<TR WIDTH=100% HEIGHT=45%>
<TD ALIGN=CENTER VALIGN=BOTTOM>
TODO: Place controls here.
</TD>
</TR>
<TR WIDTH=100% HEIGHT=100%>
<TD ALIGN=RIGHT VALIGN=BOTTOM>
<BUTTON STYLE="WIDTH:100" ID="ButtonOK">确定</BUTTON> <BUTTON STYLE="WIDTH:100" ID="ButtonCancel">取消</BUTTON>
</TD>
</TR>
</TABLE>

</BODY>
</HTML>

点击百度链接,出现以下对话框:

如果网页代码中的a标签的打开方式不是_blank则能正常进行网页跳转,网页代码改为下面的方式,正常跳转:

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
</HEAD>
<BODY ID=CAntiNetTimeoutDlg BGCOLOR=LIGHTGREY style="font-family:MS Shell Dlg;font-size:9">
<a href="http://www.baidu.com" target="_parent" >百度</a>
<TABLE WIDTH=100% HEIGHT=100%>
<TR WIDTH=100% HEIGHT=45%>
<TD ALIGN=CENTER VALIGN=BOTTOM>
TODO: Place controls here.
</TD>
</TR>
<TR WIDTH=100% HEIGHT=100%>
<TD ALIGN=RIGHT VALIGN=BOTTOM>
<BUTTON STYLE="WIDTH:100" ID="ButtonOK">确定</BUTTON> <BUTTON STYLE="WIDTH:100" ID="ButtonCancel">取消</BUTTON>
</TD>
</TR>
</TABLE>

</BODY>
</HTML>

跳转后页面:

百度中的新闻 贴吧等链接的打开方式也是以_blank方式,如果点击人一个链接,都会出现上面的服务忙对话框,下面给出点击贴吧的截图:

不知是何原因,难道是没有足够的页面用来打开新的网页,望有知道的高手能告知原因。

解决方案:

既然是由于a标签的打开方式引起的,那就对a标签进行一下处理吧。

思路:1、获取点击位置的标签

2、获取标签名称,查看是否为a标签

3、如果是a标签,获取打开方式,并获取href网址

4、关闭当前页面,打开href指向的页面

在PreTranslateMessage中获取鼠标按下消息,在鼠标按下消息中处理是否a标签,并对打开方式为_blank的a标签进行处理,下面给出判断页面点击位置标签的代码:

BOOL CAntiNetTimeoutDlg::IsAtag()
{
	CComVariant variant(NULL);
	CString strTarget,strTagName,strHref;
	BSTR szTagName;
	long nTop;
	CPoint point;
	IHTMLElement *pElement = NULL;
	::ATL::CComPtr<IHTMLDocument2> spHtmlDoc;
	LPDISPATCH   lpDisp = NULL;

	GetCursorPos(&point);
	ScreenToClient(&point);

	m_pBrowserApp->get_Document(&lpDisp);
	HRESULT   hr   =   lpDisp->QueryInterface(IID_IHTMLDocument2,   (void**) &spHtmlDoc);   

	if(spHtmlDoc)
	{
		if(spHtmlDoc.p)
		{
			m_pBrowserApp->get_Top(&nTop);//获取网页窗体距对话框顶部的距离
			if(spHtmlDoc.p->elementFromPoint(point.x,point.y - nTop,&pElement) == S_OK)//修正鼠标点击时y方向上的值,需要减掉距离窗体顶部的高度值
			{
				if (pElement != NULL)
				{
					hr = pElement->get_tagName(&szTagName);//获取标签名字
					if(szTagName != NULL)
					{
						strTagName.Format(_T("%s"),szTagName);
						if(strTagName.CompareNoCase(_T("a")) == 0)//判断是非a标签
						{
							hr = pElement->getAttribute(_T("target"),0,&variant);//获取打开方式
							if (variant.vt == VT_BSTR)
							{
								strTarget = variant.bstrVal;
								if (strTarget.CompareNoCase(_T("_blank")) == 0)//判断是非_blank
								{
									pElement->getAttribute(_T("href"),0,&variant);//获取连接地址
									if (variant.vt == VT_BSTR)
									{
										strHref = variant.bstrVal;
										if (PathIsURL(strHref))
										{
											spHtmlDoc->clear();
											spHtmlDoc->close();//关闭当前页面,打开href指向的页面
											Navigate(strHref);
										}
									}
                                  return TRUE;
								}
							}
						}
					}
				}
			}
		}
	}
	return FALSE;
}

这样,上面的问题就得到了暂时的解决(因为自己并不知道上述问题的真正原因)。

时间: 2024-11-10 11:22:28

CDHtmlDialog 浏览器遇到的服务器忙( Server Busy)问题的相关文章

服务器(Server)

服务器(Server)指一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器.数据库服务器和应用程序服务器.运行以上软件的计算机或计算机系统也被称为服务器.相对于普通PC来说,服务器在稳定性.安全性.性能等方面都要求更高,因此CPU.芯片组.内存.磁盘系统.网络等硬件和普通PC有所不同. 简介 服务器,也称伺服器.服务器是网络环境中的高性能计算机,它侦听网络上的其他计算机(客户机)提交的服务请求,并提供相应的服务,为此,服务器必须具有承担服务并且保障服务的能力.有时,这两种定义会引起混淆

分布式计算——实现简单的浏览器和web服务器

此次是分布式的第三次作业,作业要求如下: 1.基于TCP通讯(ServerSocket.Socket套接字),编写一个带有图形用户界面的浏览器和 一个支持文档读取并返回给客户浏览器的web服务器.客户端支持超链接事件处理,服务器采用多 线程技术支持并发访问. 2.在此基础上,修改服务器侧设计与实现,使之能够动态地添加客户端请求的类文件,即设计 一个小服务程序容器. 3.试在服务器侧代码中对客户端请求行.请求头和请求体部分进行处理. ================================

通过浏览器查看nginx服务器状态配置方法

通过浏览器查看nginx服务器状态配置方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了通过浏览器查看nginx服务器状态配置方法,本文讲解开启nginx-status的配置方法,并对服务器的参数做了详细讲解,需要的朋友可以参考下 复制代码 代码如下: location /nginx-status { stub_status on; #access_log /var/log/nginx/mmt_nginx_status.log; access_log off; all

asp.net网站部署在云服务器windows server 2008上

搭建一个网站需要以下4个准备: 1.域名解析 2.(云)服务器 3.数据库 4.网站代码 其中1可以可以去DNSPOD申请,同时需要进行备案,在上面就都可以完成.2用的是阿里云服务器windows server 2008 R2,去阿里云购买一个,一般400多一个月就好.3的数据库用的sql server2005,直接在云服务器上安装就行.4网站代码用的asp.net.好了,来看看发布一个网站的完整流程 1.vs中(用的vs2013)点击发布,一路默认配置就好 2.在发布后的文件夹根目录中找到we

http通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤

http通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: (1)    建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络.HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80 (2)    Web

序列化和反序列化在浏览器和 Web 服务器之间传递的数据、加密解密

js中数组不能传递到后台,需进行json序列化: var data = new Array(); data.push({para1:name,para2:answer}); string data = JSON.stringify(data) //解析参数 JavaScriptSerializer js = new JavaScriptSerializer(); List<Dictionary<string, string>> answerList = js.Deserialize

VC中处理总是弹出server busy对话框的方法

在编程过程中,总是会遇见弹出题为server busy的对话框,特别是在程序中加入了com组件,这种情况就更加频繁.以下几句代码就能轻松解决. AfxOleGetMessageFilter()->EnableBusyDialog(FALSE);   AfxOleGetMessageFilter()->SetBusyReply(SERVERCALL_RETRYLATER);     AfxOleGetMessageFilter()->EnableNotRespondingDialog(TR

HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤

1. 建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络.HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80. 2. Web浏览器向Web服务器发送请求命令 一旦建立了TCP连接,Web浏览器就会向Web服务器发送

火狐浏览器 无法连接服务器。Firefox 无法建立到 服务器的连接。

iis部署网站浏览出现火狐浏览器 无法连接服务器.Firefox 无法建立到 服务器的连接. 首先查看ip地址 开始——cmd-ipconfig 发现ip地址和部署网站的地址不一样 更改iis网站ip地址:右击网址——编辑绑定——编辑单击倒三角——选中你要更改的ip——确定