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;
}

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daiafei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值