最近编写一个BHO插件,工作是从数据库中读入url,并使用IE加载。但遇到一个问题:
对于网页中含有自动跳转功能的网页无法正确的加载,因为我是在DocumentComplete事件的消息响应函数中实现新的url加载,具体就是先用navigate加载网页A,网页A中含有meta设置的5秒自动跳转到另外一个网页B,但我在响应A的DocumentComplete事件时加载了一个新的数据库中的网页C,结果网页C正确加载,而B确没有加载。
但功能要求的是网页B也要得到加载,请问各位老师怎样实现此功能?
对于网页中含有自动跳转功能的网页无法正确的加载,因为我是在DocumentComplete事件的消息响应函数中实现新的url加载,具体就是先用navigate加载网页A,网页A中含有meta设置的5秒自动跳转到另外一个网页B,但我在响应A的DocumentComplete事件时加载了一个新的数据库中的网页C,结果网页C正确加载,而B确没有加载。
但功能要求的是网页B也要得到加载,请问各位老师怎样实现此功能?
解决方案 »
- win7下用代码使蜂鸣器报警
- 如何创造进程调用link.exe 直接连接OBJ生成exe
- 请教 我做的连连看出现的问题?
- 一个我想了通宵都不知道到错在那里的图形程序,希望各位帮忙看看.VC++API的.............
- 如何在treectrl中给item前加入图标?[求助]
- 怎样使winsock连接客户端的服务套接字端口固定?
- 关于ATL COM 问题???
- 关于DLL工程的问题,请求帮助!!!
- 请各位大哥帮忙,如何建一个指向CDialog类的指针?
- 在Dll中怎样调用exe模块中的theApp实现的一个函数?
- 请问:matlab中如何画坐标系?以及实物对应坐标的倍数问题?
- [求助]请问怎么让浮点型以最简格式输出?
当我在DocumentComplete的响应中加入messagebox时,提示网页加载完成,出现了两种情况:
1:当网页A 加载完成弹出messagebox,显示加载完成后,我立马点击messagebox的确定按钮,则网页C 得到加载,网页B 不会得到加载
2:当网页A 加载完成弹出messagebox,显示加载完成后,我不点击messagebox的确定按钮,等待5秒后网页B 得到加载,当网页B 加载完成后,点击A 和B 的弹出的messagebox后C 也得不到加载。
请问有什么办法能够实现A,B,C的顺序加载?(A 为数据库中的第一个网页,B 为A 的5秒自动跳转的网页,C 为数据库中的另外一个url)
{
/*================这一块是用来输出Messagebox对话框调试信息的,应该没什么影响吧===================
wchar_t str[1024];
int i=wcslen( (wchar_t *)pvarURL->pcVal);
wcscpy_s(str,(wchar_t *)pvarURL->pcVal);
wcscat_s(str,L"wo shi haoren");
HWND hwnd;
HRESULT hr = m_spWebBrowser->get_HWND((LONG_PTR*)&hwnd);
CComVariant strUrl(str);
strUrl.ChangeType(VT_BSTR);
MessageBox(hwnd,OLE2CW(strUrl.bstrVal), L"BHO", MB_OK);
================================================================================== */
if(Is_AimUrl==FALSE)
Cancel=TRUE; //调试时跟踪显示Cancel也变成1了,但并没有取消导航,为什么??
*cancel = VAIRANT_TRUE;A/B/C依次加载没有特别的技巧,你要判断DocumentComplete时浏览器当前的URL,当是A时不处理,当是B时才重新Navigate到C
--------------本身来说,是不准确的,很多网当前的url并不是网页显示的类容。
而且,档有多个frame的时候更复杂。我的做法是的bho中,搞一个mapfile,把当前的IE内容做一个快照,相当于全局表,从而确定加载的次序。
其实不会错,浏览器的当前URL肯定是根文档的URL,无论里面是frameset还是iframe,你取到的URL可能不是根文档,因为DocumentComplete传递的IWebBrowser2接口仅仅代表当前文档,非常可能是一个frame的文档,所以不要使用这个浏览器接口,根文档所在的IWebBrowser2应该是早就保存的,应该判断根浏览器的URL就不会错。
IUnknown* pUnkBrowser = NULL;
IUnknown* pUnkDisp=NULL;
hr = m_spWebBrowser->QueryInterface( IID_IUnknown, (void**)&pUnkBrowser);
if ( SUCCEEDED(hr) )
{
hr = pDisp->QueryInterface( IID_IUnknown, (void**)&pUnkDisp );
if ( SUCCEEDED(hr) )
{
if ( pUnkBrowser == pUnkDisp )
{ // 这是顶层框架窗口的DocumentComplete 事件 —— 页面载入完成 SetTimer(hwnd,1,6000,(TIMERPROC)TimerProc); ////为了实现全部加载,我在此设置了一个定时器,允许6秒
//之内的跳转页面,6秒之外的覆盖忽略,感觉没有其他跟好的办法了
}
}
}不过上面的比较代码是网上学到的,对于这种接口指针比较的原理还是不太懂,如果胡老大了解的话能简要介绍下吗?
代码如下:HRESULT hr;
IUnknown* pUnkBrowser = NULL;
IUnknown* pUnkDisp=NULL;
hr = m_spWebBrowser->QueryInterface( IID_IUnknown, (void**)&pUnkBrowser);
if ( SUCCEEDED(hr) )
{
hr = pDisp->QueryInterface( IID_IUnknown, (void**)&pUnkDisp );
if ( SUCCEEDED(hr) )
{
if ( pUnkBrowser == pUnkDisp )
{ // 这是顶层框架窗口的DocumentComplete 事件 —— 页面载入完成
SetTimer(hwnd,1,6000,(TIMERPROC)TimerProc);
//为了实现全部加载,我在此设置了一个定时器,允许6秒之内的跳转页面,6秒之外的覆盖忽略
}
}
}
不过上面的比较代码是网上学到的,对于这种接口指针比较的原理还是不太懂,如果胡老大了解的话能简要介绍下吗?实现顺序加载除了定时器还有其他的好办法吗?
结贴,实现方法是使用定时器,在每一个主文档的frame的documentdownload事件响应函数中SetTimer,timeproc中新加载url,几秒内如果beforenavigate中有新的url,则killtimer,加载自动跳转页。