给IE去掉弹出窗口的BHO实现问题?
本人参考中华网的一条关于BHO的例子:
http://tech.china.com/zh_cn/netschool/softwares/ie/628/20010306/01.html(MSDN的例子)
以及CSDN的去掉弹出窗口的例子:
http://www.csdn.net/Develop/Read_Article.asp?Id=10691
想为IE去掉弹出窗口。
参考了许多资料(ATL,BHO,IDISPATCH....)但怎样都调试不出来。有请高手帮我找出错误,我个人的操作步骤如下:
1、新建ATL工程,选择进程内COM(其余都没有选)工程名:TEST。
2、通过ATL Object Wizard创建了Internet Explorer Object的COM(使用缺省设置),接口名:elf。
3、在elf.h在加入 #include <ExDisp.h> ,添加三个变量:
CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> m_spWebBrowser2;
CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> m_spCPC;
BOOL bAD;//OnNewWindow2中的Cancel值。
4、在elf.cpp在加入 #include <ExDispID.h>
5、在接口Ielf上单击右键添加5个方法及写入实现代码:
//=================获取IWebBrowser2的指针=============
STDMETHODIMP Celf::SetSite(IUnknown *pUnkSite)
{
// Retrieve and store the IWebBrowser2 pointer
m_spWebBrowser2 = pUnkSite;
if (m_spWebBrowser2 == NULL)
return E_INVALIDARG;
// Retrieve and store the IConnectionPointerContainer pointer
m_spCPC = m_spWebBrowser2;
if (m_spCPC == NULL)
return E_POINTER;
HRESULT hr;
CComPtr<IConnectionPoint> spCP;
// Receives the connection point for WebBrowser events
hr = m_spCPC->FindConnectionPoint(
DIID_DWebBrowserEvents2,
&spCP);
if (FAILED(hr))
return hr;
return hr;
}
//=========实现IE的事件监听=============
STDMETHODIMP Celf::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pvarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
if (!pDispParams)
return E_INVALIDARG;
// Download Begin
if (dispidMember == DISPID_DOWNLOADBEGIN)
OnDownloadBegin();
// Download complete
if (dispidMember == DISPID_DOWNLOADCOMPLETE)
OnDownloadComplete();
//open AD window
if (dispidMember == DISPID_NEWWINDOW2)
OnNewWindow2(NULL,&bAD);
return S_OK;
}
STDMETHODIMP Celf::OnDownloadBegin()
{
bAD=TRUE;
return S_OK;
}
STDMETHODIMP Celf::OnDownloadComplete()
{
bAD=FALSE;
return S_OK;
}
STDMETHODIMP Celf::OnNewWindow2(LPDISPATCH *ppDisp, BOOL *Cancel)
{
*Cancel=bAD;
return S_OK;
}
========================
编译完成。
但是,我在SetSite方法中加入断点,都没有暂停。
Why???????
是不是存在许多问题(新手上路)。最好点明操作步骤。
最好也能email我修正后源码(legenx@163.com),无比感谢!
问题点数:100、回复次数:10Top
1 楼mickeyx(alanet.51.net)回复于 2002-04-29 16:12:44 得分 0
调试Shell/IE的插件时须预先修改一下系统设置, 见<Debugging With the Shell>Top
2 楼tianlinyi(笨蛋)回复于 2002-04-29 16:55:56 得分 2
upTop
3 楼masterz(www.fruitfruit.com)回复于 2002-04-29 19:44:47 得分 0
add the following to your *.rgs file, you have to modify the CLSID string after "ForceRemove". And rebuild your project.
HKLM
{
SOFTWARE
{
Microsoft
{
Windows
{
CurrentVersion
{
Explorer
{
'Browser Helper Objects'
{
ForceRemove {DADF130D-84E2-46C3-9BE1-3298086F26A7}
}
}
}
}
}
}
}Top
4 楼masterz(www.fruitfruit.com)回复于 2002-04-29 19:53:49 得分 0
add a member to your class
DWORD m_dwCookie;
add this line to your Celf::SetSite(IUnknown *pUnkSite)
hr = spCP->Advise( reinterpret_cast<IDispatch*>(this), &m_dwCookie);
and modify your Invoke(...)
if (dispidMember == DISPID_NEWWINDOW2)
{
//Once you're connected to DWebBrowserEvents2, implement your IDispatch::Invoke so that
//it handles DISPID_NEWWINDOW2. During the IDispatch::Invoke function call for DISPID_NEWWINDOW2,
//the array pDispParams contains two parameters. The first one, at index zero, is a Boolean value
//that tells the WebBrowser Control whether to cancel the new window or not. By default, it is
//FALSE and a new window will open. If you want to cancel new window creation completely,
//set the flag to TRUE.
//you have not passed pDispParams to OnNewWindow2, so I don't think that function can take effect. You can change pDispParams here directly, not using your OnNewWindow2
}
Top
5 楼surfl(晓龙)回复于 2002-04-29 20:36:05 得分 0
学习中。。。!Top
6 楼legenx(legenx)回复于 2002-04-30 10:47:41 得分 0
to: masterz()
那么又怎样可以将值传给OnNewWindow2中的第二个参数?Top
7 楼legenx(legenx)回复于 2002-04-30 11:22:39 得分 0
我试了加入这一行
pDispParams->rgvarg[0].boolVal=TRUE;
到
if (dispidMember == DISPID_NEWWINDOW2){
的下面,但不行,运行IE时仍弹出广告窗口。
Top
8 楼masterz(www.fruitfruit.com)回复于 2002-04-30 11:31:19 得分 98
Cxx::Invoke(...)
{
if (dispidMember == DISPID_NEWWINDOW2)
{
if(bAD)
{
*V_BOOLREF(&pDispParams->rgvarg[0]) = VARIANT_TRUE;
}
else
{
*V_BOOLREF(&pDispParams->rgvarg[0]) = VARIANT_FALSE;
}
}
}Top
9 楼legenx(legenx)回复于 2002-04-30 11:36:41 得分 0
thanks a lot!Top
10 楼myjoy(笑看风云)回复于 2002-04-30 13:23:52 得分 0
收藏!Top
相关问题
- 给IE去掉弹出窗口的BHO实现问题?
- 如何去掉win2000-pro 启动时自动弹出的IE
- 用IE时右下角弹出仿QQ式的广告,很让我烦呀,各位大侠怎么去掉呀
- 能不能用BHO控制IE的弹出菜单??
- 我的ActiveX控件放到IE中浏览时总会弹出安全警告框,谁知道怎样可以去掉?
- 各位兄弟,如何能使弹出来的IE页面只剩下关闭和最小化,最大化,其他的工具栏都去掉?
- 请教两个问题: 如何让弹出页面的母页面自动关闭?如何去掉IE右键功能?谢谢
- 连接ACCESS时,总是要弹出LOGIN窗口,如何去掉?
- 怎么在程序中去掉弹出的对话框
- 求教:ntdll.DbgUserBreakPoint-----CPU窗口总是弹出来,怎末去掉



