C++BUILDER2010下屏蔽webbrowser脚本错误对话框

来源:互联网 发布:一年级体测数据 编辑:程序博客网 时间:2024/05/04 15:13

使用Webbrowser->Silent = True一刀切屏蔽脚本错误对话框(不执行有错误的脚本),但是某些页面需要执行js脚本的。

搜索互联网,很多都是MFC和.NET的,只找到一篇BCB的添加右击菜单的。经过学习改进MFC代码,尝试了很多代码,实现了继承IDocHostUIHandler、IOleCommandTarget,并实现了接口。最后几乎要放弃该方法,去使用枚举对象。但是还是不甘心,MFC下能行的,C++BUILDER2010下肯定也可以。

代码如下:

DocHostUIHandlerImpl.h

#ifndef DocHostUIHandlerImplH
#define DocHostUIHandlerImplH
//---------------------------------------------------------------------------
#include <ShDocVw_TLB.h>
#include <exdispid.h>
#include <mshtmhst.h>
class TDocHostUIHandlerImpl : public IDocHostUIHandler, public IOleCommandTarget
{
  private:
IDocHostUIHandler *m_spDefaultDocHostUIHandler;
IOleCommandTarget *m_spDefaultOleCommandTarget;
ULONG RefCount;
  public:
TDocHostUIHandlerImpl();
// IUnknown Method
HRESULT __stdcall QueryInterface(REFIID riid, void **ppv);
ULONG   __stdcall AddRef();
ULONG   __stdcall Release();
//
// IOleCommandTarget
//
STDMETHOD(QueryStatus)(
/*[in]*/ const GUID *pguidCmdGroup,
/*[in]*/ ULONG cCmds,
/*[in,out][size_is(cCmds)]*/ OLECMD *prgCmds,
/*[in,out]*/ OLECMDTEXT *pCmdText);
STDMETHOD(Exec)(
/*[in]*/ const GUID *pguidCmdGroup,
/*[in]*/ DWORD nCmdID,
/*[in]*/ DWORD nCmdExecOpt,
/*[in]*/ VARIANTARG *pvaIn,
/*[in,out]*/ VARIANTARG *pvaOut);
// IDocHostUIHandler Method
STDMETHOD(ShowContextMenu)(
/* [in] */ DWORD dwID,
/* [in] */ POINT __RPC_FAR *ppt,
/* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
/* [in] */ IDispatch __RPC_FAR *pdispReserved);
STDMETHOD(GetHostInfo)(
/* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo);
STDMETHOD(ShowUI)(
/* [in] */ DWORD dwID,
/* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,
/* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget,
/* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame,
/* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc){ return E_NOTIMPL; }
STDMETHOD(HideUI)( void){ return E_NOTIMPL; }
STDMETHOD(UpdateUI)( void){ return E_NOTIMPL; }
STDMETHOD(EnableModeless)(
/* [in] */ BOOL fEnable){ return E_NOTIMPL; }
STDMETHOD(OnDocWindowActivate)(
/* [in] */ BOOL fActivate){ return E_NOTIMPL; }
STDMETHOD(OnFrameWindowActivate)(
/* [in] */ BOOL fActivate){ return E_NOTIMPL; }
STDMETHOD(ResizeBorder)(
/* [in] */ LPCRECT prcBorder,
/* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
/* [in] */ BOOL fRameWindow){ return E_NOTIMPL; }
STDMETHOD(TranslateAccelerator)(
/* [in] */ LPMSG lpMsg,
/* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
/* [in] */ DWORD nCmdID){ return E_NOTIMPL; }
STDMETHOD(GetOptionKeyPath)(
/* [out] */ LPOLESTR __RPC_FAR *pchKey,
/* [in] */ DWORD dw){ return E_NOTIMPL; }
STDMETHOD(GetDropTarget)(
/* [in] */ IDropTarget __RPC_FAR *pDropTarget,
/* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget){ return E_NOTIMPL; }
STDMETHOD(GetExternal)(
/* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch){ return E_NOTIMPL; }
STDMETHOD(TranslateUrl)(
/* [in] */ DWORD dwTranslate,
/* [in] */ OLECHAR __RPC_FAR *pchURLIn,
/* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut){ return E_NOTIMPL; }
STDMETHOD(FilterDataObject)(
/* [in] */ IDataObject __RPC_FAR *pDO,
/* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet){ return E_NOTIMPL; }
};
#endif

cpp代码

#include <Vcl.h>
#pragma hdrstop
#include "DocHostUIHandlerImpl.h"
TDocHostUIHandlerImpl::TDocHostUIHandlerImpl() :RefCount(0)
{
m_spDefaultDocHostUIHandler = NULL;
m_spDefaultOleCommandTarget = NULL;
}
//---------------------------------------------------------------------------
//                      IUnknown Method
//---------------------------------------------------------------------------
//QueryInterface
HRESULT __stdcall TDocHostUIHandlerImpl::QueryInterface(REFIID riid, void **ppv)
{
  if(IsEqualIID(riid,IID_IUnknown))
  {
//*ppv = static_cast<IUnknown*>(this);//这个编译不过
    //return S_OK;
  }
  else if(IsEqualIID(riid,IID_IDocHostUIHandler))
  {
    *ppv = static_cast<IDocHostUIHandler*>(this);
    return S_OK;
  }
  else if(IsEqualIID(riid,IID_IOleCommandTarget))
  {
    *ppv = static_cast<IOleCommandTarget*>(this);
    return S_OK;
  }
  else
  {
    *ppv = NULL;
    return E_NOINTERFACE;
  }
}
//---------------------------------------------------------------------------
//AddRef
ULONG __stdcall TDocHostUIHandlerImpl::AddRef()
{
  InterlockedIncrement((long*)&RefCount);
  return RefCount;
}
//---------------------------------------------------------------------------
//Release
ULONG __stdcall TDocHostUIHandlerImpl::Release()
{
  if(InterlockedDecrement((long*)&RefCount) <= 0)
    delete this;
  return RefCount;
}
// ---------------------------------------------------------------------------
// IOleCommandTarget Method
// ---------------------------------------------------------------------------
STDMETHODIMP TDocHostUIHandlerImpl::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText)
{
return m_spDefaultOleCommandTarget->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText);
}
STDMETHODIMP TDocHostUIHandlerImpl::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut)
{
if (nCmdID == OLECMDID_SHOWSCRIPTERROR)
{
// Don't show the error dialog, but
// continue running scripts on the page.
(*pvaOut).vt = VT_BOOL;
(*pvaOut).boolVal = VARIANT_TRUE;
return S_OK;
}
return m_spDefaultOleCommandTarget->Exec(pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut);
}
//---------------------------------------------------------------------------
//                      IDocHostUIHandler Method
//---------------------------------------------------------------------------
STDMETHODIMP TDocHostUIHandlerImpl::ShowContextMenu(DWORD dwID,POINT *ppt,
IUnknown *pcmdtReserved,IDispatch *pdispReserved)
{
  return S_OK;
}
//---------------------------------------------------------------------------
STDMETHODIMP TDocHostUIHandlerImpl::GetHostInfo(DOCHOSTUIINFO *pInfo)
{
  pInfo->dwFlags = pInfo->dwFlags | DOCHOSTUIFLAG_NO3DBORDER;
  return S_OK;
}
//---------------------------------------------------------------------------
#pragma package(smart_init)


调用程序:

#include <vcl.h>
#pragma hdrstop


#include "Unit1.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SHDocVw_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;


TDocHostUIHandlerImpl *FDocHostUIHandler;


// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
FDocHostUIHandler = new TDocHostUIHandlerImpl();
}


// ---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete FDocHostUIHandler;
}


// ---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
CppWebBrowser1->Navigate(L"about:blank");


while (CppWebBrowser1->Document == NULL)
{
Sleep(10);
Application->ProcessMessages();
}

// 传递接口指针到IHTMLDocument2
ICustomDoc *m_spCustDoc;
HRESULT hr;

hr = CppWebBrowser1->Document->QueryInterface(IID_ICustomDoc, (void**) & m_spCustDoc);
if (SUCCEEDED(hr))
{
hr = m_spCustDoc->SetUIHandler(FDocHostUIHandler);
if (hr != S_OK)
{
MessageBox(NULL, AnsiString(AnsiString(
"Can not bind IDocHostUIHandler instance to ")
+ "IHTMLDocument2.Err = " + SysErrorMessage(hr)).c_str(),
NULL, MB_OK | MB_APPLMODAL | MB_ICONWARNING);
}
else {
MessageBox(NULL, "Succeeded", NULL,
MB_OK | MB_APPLMODAL | MB_ICONWARNING);
}
m_spCustDoc->Release();
}
}



参考的资料:

http://flagspot.diandian.com/post/2012-11-09/40041742398

http://bbs.csdn.net/topics/20135139

原创粉丝点击