描述:
我做了一个BHO想在页面一打开时,就想可以获取这个打开网页的标题,测试的时候,打开第一个网页没有问题,在网页上点击弹出新的窗口时也没有
问题,但是如果在当前的窗口中打开新的网页就会出问题了,怎么也排除不了:难,实在是难!小弟低三下气求助中
本人开发的代码是这样的:
// EyeOnIE.cpp : Implementation of CEyeOnIE
#include "stdafx.h"
#include "Cctv.h"
#include "EyeOnIE.h"
#include "stdafx.h"
#include "resource.h"
#include "msHtml.h"
#include "ExDispID.h"// DWebBrowserEvents2 所需要的头文件
#include "atlcom.h"
#include "atlbase.h"
#include "winuser.h"
#include "comdef.h"
/////////////////////////////////////////////////////////////////////////////
// CEyeOnIE
STDMETHODIMP CEyeOnIE::SetSite(IUnknown *pUnkSite)
{
// TODO: Add your implementation code here
USES_CONVERSION;
if(pUnkSite)
{
mWebBrowser2=pUnkSite;
if(mWebBrowser2)
{
return RegisterEventHandler(TRUE);
}
}
return E_FAIL;
}
HRESULT CEyeOnIE::RegisterEventHandler(BOOL inAdvise)
{
//下面这段代码经过测试和下面的测试代码具有相关性,可能这里也会出发问题
//DWORD mCookie;
//CComQIPtr<IWebBrowser2, &IID_IWebBrowser2>mWebBrowser2;
CComPtr<IConnectionPoint>spCP;
CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer>m_spCPC(mWebBrowser2);
HRESULT hr=m_spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&spCP);
if(FAILED(hr))
return hr;
if(inAdvise)
{
hr=spCP->Advise(reinterpret_cast<IDispatch*>(this), &mCookie);
}
else
{
spCP->Unadvise(mCookie);
}
return S_OK;
}
//第三部分
STDMETHODIMP CEyeOnIE::Invoke(DISPID dispidMember,REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS * pDispParams,
VARIANT * pvarResult,EXCEPINFO * pexcepinfo,
UINT * puArgErr)
{
USES_CONVERSION;
if (!pDispParams)
return E_INVALIDARG;
switch (dispidMember)
{
case DISPID_BEFORENAVIGATE2:
break;
case DISPID_NAVIGATECOMPLETE2:
break;
case DISPID_DOCUMENTCOMPLETE:
{
//-------------------测试一:下面这个方法获取标题已经成功了,但是存在一个错误框
//经过实际测试是if (SUCCEEDED(mWebBrowser2->get_Document( &pDisp)))导致的问题
//主要是在打开新窗口的时候出现问题的,估计的原因是不能将这种获取方式放在BHO中,或者事件中
//因为每打开一个新的窗口就会重新获取一次,而前次的没有释放,后面一次又要重新赋值,所以会出错
//采取的实验二,是释放所有变量,把mWebBrowser2和pDisp释放,然后看看
//要定义OnDocumentComplete();和m_bDocumentCompleted = true;
if (mWebBrowser2!=NULL)
{
if (SUCCEEDED(mWebBrowser2->get_Document( &pDisp)))
{
USES_CONVERSION;
m_spHTML = pDisp;
if (m_spHTML!=NULL)
{
CComBSTR bstrTitle;
m_spHTML->get_title( &bstrTitle );//取得文档标题
//OLE2CT( bstrTitle )
::MessageBox(NULL, _T("终于成功了"),_T("一定成功"),MB_ICONINFORMATION);
//下面释放资源
if (m_spHTML!=NULL)
m_spHTML==NULL;
if (mWebBrowser2!=NULL)
mWebBrowser2.Release;
if (pDisp)
pDisp.Release;
//pUnkSite.Release;
//return S_OK;
}
}
}
break;
}
case DISPID_ONVISIBLE:
break;
case DISPID_QUIT:
//RegisterEventHandler(FALSE);
break;
default:
break;
}
return S_OK;
}
--------------------------------------------------------------------------------------------
下面是在IE中运行程序是出现的状况如下:
我这里运行会出错:
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!
Program: ...d Settings\Administrator\桌面\Mimefilter\Debug\Mimefilter.exe
File: d:\program files\microsoft visual studio\vc98\atl\include\atlbase.h
Line: 469
Expression: p==0
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
---------------------------
终止(A) 重试(R) 忽略(I)
---------------------------