积极答复者
请教一下,如何屏蔽脚本错误(com技术)

问题
-
自己做的浏览器,用CHtmlView类做的,打开新页面用OnNewWindow2方法
有些网站打开时都会报IE的脚本错误.我想请教一下,如何在我的浏览器屏蔽错误提示.
我想知道,如何一步一步地按下面方法添加,COM一点不会,但这个应该是非常好的解决方法
麻烦各位了~~
这是微软的解决方案:http://support.microsoft.com/kb/261003/zh-cn
STDMETHODIMP CMyBrowser::Exec( const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut ) { HRESULT hr = S_OK; if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CGID_DocHostCommandHandler)) { switch (nCmdID) { case OLECMDID_SHOWSCRIPTERROR: { IHTMLDocument2* pDoc = NULL; IHTMLWindow2* pWindow = NULL; IHTMLEventObj* pEventObj = NULL; BSTR rgwszNames[5] = { SysAllocString(L"errorLine"), SysAllocString(L"errorCharacter"), SysAllocString(L"errorCode"), SysAllocString(L"errorMessage"), SysAllocString(L"errorUrl") }; DISPID rgDispIDs[5]; VARIANT rgvaEventInfo[5]; DISPPARAMS params; BOOL fContinueRunningScripts = true; int i; params.cArgs = 0; params.cNamedArgs = 0; hr = pvaIn->punkVal->QueryInterface(IID_IHTMLDocument2, (void **) &pDoc); hr = pDoc->get_parentWindow(&pWindow); pDoc->Release(); hr = pWindow->get_event(&pEventObj); for (i = 0; i < 5; i++) { // Get the property's dispID. hr = pEventObj->GetIDsOfNames(IID_NULL, &rgwszNames[i], 1, LOCALE_SYSTEM_DEFAULT, &rgDispIDs[i]); // Get the value of the property. hr = pEventObj->Invoke(rgDispIDs[i], IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, ¶ms, &rgvaEventInfo[i], NULL, NULL); SysFreeString(rgwszNames[i]); } (*pvaOut).vt = VT_BOOL; if (fContinueRunningScripts)//这一行不是多余的?因为fContinueRunningScripts为真 { // Continue running scripts on the page. (*pvaOut).boolVal = VARIANT_TRUE; } else { // Stop running scripts on the page. (*pvaOut).boolVal = VARIANT_FALSE; } break; } default: hr = OLECMDERR_E_NOTSUPPORTED; break; } } else { hr = OLECMDERR_E_UNKNOWNGROUP; } return (hr); }
答案
-
很久很久没有写C++代码了,下面的代码你看看是否可以使用:
定义一个CCustomControlSite类,从COleControlSite继承下来:
CustomControlSite.h:#pragma once #include "afxocc.h" class CCustomControlSite : public COleControlSite { public: CCustomControlSite(COleControlContainer *pCnt):COleControlSite(pCnt){} protected: DECLARE_INTERFACE_MAP() BEGIN_INTERFACE_PART(OleCommandTarget, IOleCommandTarget) STDMETHOD_(HRESULT, QueryStatus)(const GUID* pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText); STDMETHOD_(HRESULT, Exec)(const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut); END_INTERFACE_PART(OleCommandTarget) };
#include "stdafx.h" #include "CustomControlSite.h" BEGIN_INTERFACE_MAP(CCustomControlSite, COleControlSite) INTERFACE_PART(CCustomControlSite, IID_IOleCommandTarget, OleCommandTarget) END_INTERFACE_MAP() ULONG FAR EXPORT CCustomControlSite::XOleCommandTarget::AddRef() { METHOD_PROLOGUE(CCustomControlSite, OleCommandTarget) return pThis->ExternalAddRef(); } ULONG FAR EXPORT CCustomControlSite::XOleCommandTarget::Release() { METHOD_PROLOGUE(CCustomControlSite, OleCommandTarget) return pThis->ExternalRelease(); } HRESULT FAR EXPORT CCustomControlSite::XOleCommandTarget::QueryInterface( REFIID iid, void FAR* FAR* ppvObj) { METHOD_PROLOGUE(CCustomControlSite, OleCommandTarget) return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj); } HRESULT FAR EXPORT CCustomControlSite::XOleCommandTarget::QueryStatus( const GUID* pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText) { METHOD_PROLOGUE(CCustomControlSite, OleCommandTarget) return S_OK; } HRESULT FAR EXPORT CCustomControlSite::XOleCommandTarget::Exec( const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut) { HRESULT hr = S_OK; if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CGID_DocHostCommandHandler)) { switch (nCmdID) { case OLECMDID_SHOWSCRIPTERROR: { // Continue running scripts on the page. (*pvaOut).boolVal = VARIANT_TRUE; break; } default: hr = OLECMDERR_E_NOTSUPPORTED; break; } } else { hr = OLECMDERR_E_UNKNOWNGROUP; } return (hr); }
然后将CHtmlView::CreateSite函数重载,代码:
BOOL CMfcieView::CreateControlSite(COleControlContainer *pContainer, COleControlSite **ppSite, UINT nId, REFCLSID clsid) { *ppSite = new CCustomControlSite(this->GetControlContainer()); return TRUE; }
上面的CMfcieView的定义:
class CMfcieView : public CHtmlView { ... public: virtual BOOL CreateControlSite(COleControlContainer* pContainer, COleControlSite** ppSite, UINT nID, REFCLSID clsid); ... };
- 已编辑 Killmyday 2009年7月24日 7:31 修改格式
- 已标记为答案 flyskytoday 2009年7月28日 3:15
全部回复
-
-
关于自定义MFC中的HTML类,实现IOleCommandTarget的示例,参考http://blog.joycode.com/jiangsheng/archive/2005/07/09/58754.aspx
Please mark the post answered your question as the answer, and click the chartreuse pyramid floating over "Vote as helpful" to mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
Visual C++ MVP -
哦,对不起,我是没有仔细看你的问题
看起来你自己定义的WebBrowser需要实现一个接口: IOleCommandTarget,在MFC里面在你的类里面添加这个接口的支持可以参照:
http://msdn.microsoft.com/en-us/library/aa229395(VS.60).aspx
然后你就可以在IOleCommandTarget里面实现你的Exec函数了。如果你还有问题的话,请告诉我,我有空帮你试一下。 -
很久很久没有写C++代码了,下面的代码你看看是否可以使用:
定义一个CCustomControlSite类,从COleControlSite继承下来:
CustomControlSite.h:#pragma once #include "afxocc.h" class CCustomControlSite : public COleControlSite { public: CCustomControlSite(COleControlContainer *pCnt):COleControlSite(pCnt){} protected: DECLARE_INTERFACE_MAP() BEGIN_INTERFACE_PART(OleCommandTarget, IOleCommandTarget) STDMETHOD_(HRESULT, QueryStatus)(const GUID* pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText); STDMETHOD_(HRESULT, Exec)(const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut); END_INTERFACE_PART(OleCommandTarget) };
#include "stdafx.h" #include "CustomControlSite.h" BEGIN_INTERFACE_MAP(CCustomControlSite, COleControlSite) INTERFACE_PART(CCustomControlSite, IID_IOleCommandTarget, OleCommandTarget) END_INTERFACE_MAP() ULONG FAR EXPORT CCustomControlSite::XOleCommandTarget::AddRef() { METHOD_PROLOGUE(CCustomControlSite, OleCommandTarget) return pThis->ExternalAddRef(); } ULONG FAR EXPORT CCustomControlSite::XOleCommandTarget::Release() { METHOD_PROLOGUE(CCustomControlSite, OleCommandTarget) return pThis->ExternalRelease(); } HRESULT FAR EXPORT CCustomControlSite::XOleCommandTarget::QueryInterface( REFIID iid, void FAR* FAR* ppvObj) { METHOD_PROLOGUE(CCustomControlSite, OleCommandTarget) return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj); } HRESULT FAR EXPORT CCustomControlSite::XOleCommandTarget::QueryStatus( const GUID* pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText) { METHOD_PROLOGUE(CCustomControlSite, OleCommandTarget) return S_OK; } HRESULT FAR EXPORT CCustomControlSite::XOleCommandTarget::Exec( const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut) { HRESULT hr = S_OK; if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CGID_DocHostCommandHandler)) { switch (nCmdID) { case OLECMDID_SHOWSCRIPTERROR: { // Continue running scripts on the page. (*pvaOut).boolVal = VARIANT_TRUE; break; } default: hr = OLECMDERR_E_NOTSUPPORTED; break; } } else { hr = OLECMDERR_E_UNKNOWNGROUP; } return (hr); }
然后将CHtmlView::CreateSite函数重载,代码:
BOOL CMfcieView::CreateControlSite(COleControlContainer *pContainer, COleControlSite **ppSite, UINT nId, REFCLSID clsid) { *ppSite = new CCustomControlSite(this->GetControlContainer()); return TRUE; }
上面的CMfcieView的定义:
class CMfcieView : public CHtmlView { ... public: virtual BOOL CreateControlSite(COleControlContainer* pContainer, COleControlSite** ppSite, UINT nID, REFCLSID clsid); ... };
- 已编辑 Killmyday 2009年7月24日 7:31 修改格式
- 已标记为答案 flyskytoday 2009年7月28日 3:15
-
真难啊,不会
下面是在CSDN发的帖子,有兴趣也看一下~
http://topic.csdn.net/u/20090726/16/8ebc4ce1-c271-4320-b23e-61072bcc959a.html