各个大哥,求教!在VC中嵌入WebBrowser浏览页面,但页面中有脚本错误,如何屏蔽该错误 打开本地的htm文件,但页面中有脚本错误,如何屏蔽该错误? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己实现control site, 处理 OLECMDID_SHOWSCRIPTERRORHRESULT CMyOleControlSite::XOleCommandTarget::Exec(const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut ){ HRESULT hr = OLECMDERR_E_NOTSUPPORTED; if (nCmdID == OLECMDID_SHOWSCRIPTERROR) { // Don't show the error dialog, but // continue running scripts on the page. static DWORD s_last_output_time = 0; static DWORD total_script_error = 0; total_script_error++; if(GetTickCount()-s_last_output_time > 1000*60*10) { s_last_output_time = GetTickCount(); CString smsg; smsg.Format(_T("OLECMDID_SHOWSCRIPTERROR script error discard silently for %d times"),total_script_error); OutputDebugString(smsg); } (*pvaOut).vt = VT_BOOL; (*pvaOut).boolVal = VARIANT_TRUE; return S_OK; }//return 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; // Get the document that is currently being viewed. hr = pvaIn->punkVal->QueryInterface(IID_IHTMLDocument2, (void **) &pDoc); // Get document.parentWindow. hr = pDoc->get_parentWindow(&pWindow); pDoc->Release(); // Get the window.event object. hr = pWindow->get_event(&pEventObj); // Get the error info from the window.event object. 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]); } // At this point, you would normally alert the user with // the information about the error, which is now contained // in rgvaEventInfo[]. Or, you could just exit silently. (*pvaOut).vt = VT_BOOL; if (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;//AtlTrace(_T("%s[%d]"),__TFUNCTION__,__LINE__); break; } } else { hr = OLECMDERR_E_UNKNOWNGROUP; //AtlTrace(_T("%s[%d]"),__TFUNCTION__,__LINE__); } //AtlTrace(_T("%s return %08x"),__TFUNCTION__, hr); return (hr);} #include <afxocc.h>#include <afxhtml.h>class CHtmlControlSite : public COleControlSite{public: CHtmlControlSite(COleControlContainer* pParentWnd); ~CHtmlControlSite(); CHtmlView* GetView() const; BEGIN_INTERFACE_PART(DocHostUIHandler, IDocHostUIHandler) STDMETHOD(ShowContextMenu)(DWORD, LPPOINT, LPUNKNOWN, LPDISPATCH); STDMETHOD(GetHostInfo)(DOCHOSTUIINFO*); STDMETHOD(ShowUI)(DWORD, LPOLEINPLACEACTIVEOBJECT, LPOLECOMMANDTARGET, LPOLEINPLACEFRAME, LPOLEINPLACEUIWINDOW); STDMETHOD(HideUI)(void); STDMETHOD(UpdateUI)(void); STDMETHOD(EnableModeless)(BOOL); STDMETHOD(OnDocWindowActivate)(BOOL); STDMETHOD(OnFrameWindowActivate)(BOOL); STDMETHOD(ResizeBorder)(LPCRECT, LPOLEINPLACEUIWINDOW, BOOL); STDMETHOD(TranslateAccelerator)(LPMSG, const GUID*, DWORD); STDMETHOD(GetOptionKeyPath)(OLECHAR **, DWORD); STDMETHOD(GetDropTarget)(LPDROPTARGET, LPDROPTARGET*); STDMETHOD(GetExternal)(LPDISPATCH*); STDMETHOD(TranslateUrl)(DWORD, OLECHAR*, OLECHAR **); STDMETHOD(FilterDataObject)(LPDATAOBJECT , LPDATAOBJECT*); END_INTERFACE_PART(DocHostUIHandler) DECLARE_INTERFACE_MAP()};class CMyOleControlSite : public CHtmlControlSite{public: CMyOleControlSite(COleControlContainer *pCnt = NULL):CHtmlControlSite(pCnt) {} BEGIN_INTERFACE_PART(Authenticate, IAuthenticate) STDMETHODIMP Authenticate( HWND __RPC_FAR *phwnd, LPWSTR __RPC_FAR *pszUsername, LPWSTR __RPC_FAR *pszPassword); END_INTERFACE_PART(Authenticate) BEGIN_INTERFACE_PART(ServiceProvider, IServiceProvider) STDMETHODIMP QueryService(REFGUID guid, REFIID iid, LPVOID * ppv); END_INTERFACE_PART(ServiceProvider) //BEGIN_INTERFACE_PART(ServiceProvider, IServiceProvider) // STDMETHODIMP QueryService(REFGUID guid, REFIID iid, LPVOID * ppv); //END_INTERFACE_PART(ServiceProvider) BEGIN_INTERFACE_PART(OleCommandTarget,IOleCommandTarget) STDMETHOD(QueryStatus)( const GUID *pguidCmdGroup, // Pointer to command group ULONG cCmds, // Number of commands in prgCmds array OLECMD prgCmds[ ], // Array of commands OLECMDTEXT *pCmdText // Pointer to name or status of command ); STDMETHOD(Exec)(const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut); END_INTERFACE_PART(OleCommandTarget) DECLARE_INTERFACE_MAP();}; Onega老大,多谢,不过我对OLE的东西基本上是一个白菜!能否在说明一下,如果我的WEB控件的ID:IDD_WEB,那么我在.h文件中如何来定义exec,在.cpp中如何将将控件和函数联系起来。 WebBrowser控件的SetSilent(true); 这个方法好像可以,但是我每换一个页面之前都的写一次这个调用一次这个方法,有点想不明白,但确实到达了目的。 listctrl插入ico不行啊 一个最简单的程序也会出错? 大讨论:端口被占用、阻塞的几种可能途径? 请教:全局变量和theApp谁先定义? 单步调试时的问题 windows2000里的启动栏的东西怎么去掉? 指针数组内存释放的问题 如何制作可调大小的虚框?就象在画图软件中的选定按钮的功能 VC++使用ADO连接数据库总是连到Master数据库? 我在控件中布置多线程,发现临界量完全不管用了,怎么回事? 命令行参数问题急!!!!! 不想被“桌面显示”使我的对话框最小化该怎么办
HRESULT CMyOleControlSite::XOleCommandTarget::Exec
(const GUID* pguidCmdGroup, DWORD nCmdID,
DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut )
{ HRESULT hr = OLECMDERR_E_NOTSUPPORTED;
if (nCmdID == OLECMDID_SHOWSCRIPTERROR)
{
// Don't show the error dialog, but
// continue running scripts on the page.
static DWORD s_last_output_time = 0;
static DWORD total_script_error = 0;
total_script_error++;
if(GetTickCount()-s_last_output_time > 1000*60*10)
{
s_last_output_time = GetTickCount();
CString smsg;
smsg.Format(_T("OLECMDID_SHOWSCRIPTERROR script error discard silently for %d times"),total_script_error);
OutputDebugString(smsg);
}
(*pvaOut).vt = VT_BOOL;
(*pvaOut).boolVal = VARIANT_TRUE;
return S_OK;
}
//return 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; // Get the document that is currently being viewed.
hr = pvaIn->punkVal->QueryInterface(IID_IHTMLDocument2, (void **) &pDoc);
// Get document.parentWindow.
hr = pDoc->get_parentWindow(&pWindow);
pDoc->Release();
// Get the window.event object.
hr = pWindow->get_event(&pEventObj);
// Get the error info from the window.event object.
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]);
} // At this point, you would normally alert the user with
// the information about the error, which is now contained
// in rgvaEventInfo[]. Or, you could just exit silently. (*pvaOut).vt = VT_BOOL;
if (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;//AtlTrace(_T("%s[%d]"),__TFUNCTION__,__LINE__);
break;
}
}
else
{
hr = OLECMDERR_E_UNKNOWNGROUP; //AtlTrace(_T("%s[%d]"),__TFUNCTION__,__LINE__);
}
//AtlTrace(_T("%s return %08x"),__TFUNCTION__, hr);
return (hr);
}
#include <afxhtml.h>class CHtmlControlSite : public COleControlSite
{
public:
CHtmlControlSite(COleControlContainer* pParentWnd);
~CHtmlControlSite(); CHtmlView* GetView() const; BEGIN_INTERFACE_PART(DocHostUIHandler, IDocHostUIHandler)
STDMETHOD(ShowContextMenu)(DWORD, LPPOINT, LPUNKNOWN, LPDISPATCH);
STDMETHOD(GetHostInfo)(DOCHOSTUIINFO*);
STDMETHOD(ShowUI)(DWORD, LPOLEINPLACEACTIVEOBJECT,
LPOLECOMMANDTARGET, LPOLEINPLACEFRAME, LPOLEINPLACEUIWINDOW);
STDMETHOD(HideUI)(void);
STDMETHOD(UpdateUI)(void);
STDMETHOD(EnableModeless)(BOOL);
STDMETHOD(OnDocWindowActivate)(BOOL);
STDMETHOD(OnFrameWindowActivate)(BOOL);
STDMETHOD(ResizeBorder)(LPCRECT, LPOLEINPLACEUIWINDOW, BOOL);
STDMETHOD(TranslateAccelerator)(LPMSG, const GUID*, DWORD);
STDMETHOD(GetOptionKeyPath)(OLECHAR **, DWORD);
STDMETHOD(GetDropTarget)(LPDROPTARGET, LPDROPTARGET*);
STDMETHOD(GetExternal)(LPDISPATCH*);
STDMETHOD(TranslateUrl)(DWORD, OLECHAR*, OLECHAR **);
STDMETHOD(FilterDataObject)(LPDATAOBJECT , LPDATAOBJECT*);
END_INTERFACE_PART(DocHostUIHandler) DECLARE_INTERFACE_MAP()
};class CMyOleControlSite : public CHtmlControlSite
{
public:
CMyOleControlSite(COleControlContainer *pCnt = NULL):CHtmlControlSite(pCnt) {} BEGIN_INTERFACE_PART(Authenticate, IAuthenticate) STDMETHODIMP Authenticate(
HWND __RPC_FAR *phwnd,
LPWSTR __RPC_FAR *pszUsername,
LPWSTR __RPC_FAR *pszPassword); END_INTERFACE_PART(Authenticate)
BEGIN_INTERFACE_PART(ServiceProvider, IServiceProvider)
STDMETHODIMP QueryService(REFGUID guid, REFIID iid, LPVOID * ppv);
END_INTERFACE_PART(ServiceProvider)
//BEGIN_INTERFACE_PART(ServiceProvider, IServiceProvider)
// STDMETHODIMP QueryService(REFGUID guid, REFIID iid, LPVOID * ppv);
//END_INTERFACE_PART(ServiceProvider)
BEGIN_INTERFACE_PART(OleCommandTarget,IOleCommandTarget)
STDMETHOD(QueryStatus)(
const GUID *pguidCmdGroup,
// Pointer to command group
ULONG cCmds, // Number of commands in prgCmds array
OLECMD prgCmds[ ], // Array of commands
OLECMDTEXT *pCmdText // Pointer to name or status of command
);
STDMETHOD(Exec)(const GUID* pguidCmdGroup, DWORD nCmdID,
DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut);
END_INTERFACE_PART(OleCommandTarget) DECLARE_INTERFACE_MAP();
};