描述:
我的开发环境WTL8+VC8+XP(SP2)
代码:
*.H
......
BEGIN_SINK_MAP(CBrowserView)
......
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW2, OnEventNewWindow2, &NewWindow2_Info)
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW3, OnEventNewWindow3, &NewWindow3_Info)
END_SINK_MAP()
__declspec(selectany) _ATL_FUNC_INFO CBrowserView::NewWindow2_Info = { CC_STDCALL, VT_EMPTY, 2, { VT_DISPATCH, VT_BOOL } };
__declspec(selectany) _ATL_FUNC_INFO CBrowserView::NewWindow3_Info = { CC_STDCALL, VT_EMPTY, 5, { VT_DISPATCH, VT_BOOL, VT_I4, VT_BSTR, VT_BSTR } };
--------------------------------------------------------
*.CPP
......
void __stdcall CBrowserView::OnEventNewWindow2(IDispatch* pDisp, VARIANT_BOOL* Cancel)
{
*Cancel = VARIANT_FALSE; //这句出错
}
void __stdcall CBrowserView::OnEventNewWindow3(IDispatch* pDisp, VARIANT_BOOL* Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl)
{
*Cancel = VARIANT_TRUE; //这句出错
}
错误:
Unhandled exception at 0x00456821 in Browser.exe: 0xC0000005: Access violation writing location 0x000042f0.
请高手指点一下!
解决方案1:
NewWindow2_Info 定义错误,应该这样赋值:{ CC_STDCALL, VT_EMPTY, 2, { VT_DISPATCH, VT_BOOL|VT_BYREF } };
NewWindow3_Info 也一样要改第二个参数类型。
还有一个问题,实现的两个Onxxx方法的返回值应该用HRESULT,不要用void
您可能想查找下面的文章:
- 如何用OnNewWindow2()实现新打开的网页在同一网页中显示?80分求助,急急急
- 制作弹出广告拦截器时碰到问题,关于OnNewWindow2IDispatchppDisp,BOOLCancel的
- 如何使用让MFC写的ACTIVEX在IE里面监视NewWindow2事件?
- 关于Iwebbrowser2中用DISPID_NEWWINDOW2的问题。
- 使用ATL如何通过NewWindow2获得弹出URL,建立URL与它弹出的URL的对应关系
- 当WEBBROWSER控件的newwindow2事件响应时,如何能获取当前的URL,事件的第一个参数是空的,里面还没加载URL
- 自己正用VC开发一个基于WEBBROWSER控件的对话框程序,因为NEWWINDOW2无法使用,想知道如何用BHO配合
- NewWindow2新链接如何在原窗口打开
- DISPID_NEWWINDOW2怎么在自己的浏览器弹出新的网页
- 送分题,关于IE、WebBrowser的OnNewWindow2(不是在原窗口显示的老问题啊)