BHO不起作用?

jsycsj 2008-09-25 09:55:26
按照微软的sample一路写完BHO的Sample代码,编译之后没有作用,
我用的是Win server 2003系统,vs.net2005,IE6.0
启动IE时可以在Manage Addons中看到Sample BHO已经被加载(当然注册表里也已存在),但就是没任何反应,
代码中实现了
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
也就是说应该在页面下载完成后就会执行的,可是没任何反应.
请求支援,多谢.
...全文
602 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
csucdl 2008-10-02
  • 打赏
  • 举报
回复
你的IE版本? 如果是ie8的话, 情况要复杂些, 你需要做:
1) 启动一个ie程序。
2) 使用vs的attach工具, 选择进程列表当中没有标题的iexplorer.exe。

如果不是ie8的话, 建议你先关掉所有的ie程序, 并且打开任务管理器, 杀掉explorer.exe进程, 重新调试程序。
yawer 2008-09-28
  • 打赏
  • 举报
回复
有可能之前你已经编译了一个版本,然后已经被IE加载了。你去注册表中把之前编译的组建guid删除。然后编译一个最新的,挂上ie进行debug。well down,good luck.
jameshooo 2008-09-26
  • 打赏
  • 举报
回复
你的意思是DllMain执行了,但是组件没有创建?在构造函数里设置断点看看能否中断
jsycsj 2008-09-26
  • 打赏
  • 举报
回复
Begin_com_map(CHelloworldBHO)
......
Com_Interface_entry(IObjectWithSite)
End_com_map()

这个加了.
jsycsj 2008-09-26
  • 打赏
  • 举报
回复
Begin_com_map(CHelloworldBHO)
......
Com_Interface_entry(IObjectWithSite)
End_com_map()

这个加了.
jsycsj 2008-09-26
  • 打赏
  • 举报
回复
你是指下面的一段?

class ATL_NO_VTABLE CHelloWorldBHO :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
public IObjectWithSiteImpl<CHelloWorldBHO>,
public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>



我已经加了的.
jameshooo 2008-09-26
  • 打赏
  • 举报
回复
可能是你的组件实现得有问题,有没有在接口映射表中添加IObjectWithSite的映射项?
jsycsj 2008-09-26
  • 打赏
  • 举报
回复
有的,我在家里在xp的系统下也写了份类似的代码,也看它加载到IE了,并且能够在DllMain中加入断点进行调试.但就是不会进入到SetSite函数当中去.搞不懂.
如果说win server 2003安全级别高的话,我自己的xp系统应该没那么高的.同时也查看了third party extension,是允许的.所以说的.
这就是微软的Sample,我没看出什么不同的.
http://msdn.microsoft.com/en-us/library/bb250489(VS.85).aspx
jameshooo 2008-09-26
  • 打赏
  • 举报
回复
注册脚本里面有没有下面的内容?如果没有就加上,没有这个的话,IE是不会加载你的。
HKLM
{
NoRemove Software
{
NoRemove Microsoft
{
NoRemove Windows
{
NoRemove CurrentVersion
{
NoRemove Explorer
{
NoRemove 'Browser Helper Objects'
{
ForceRemove {你的CLSID} = s '你的BHO名字'
{
val 'NoExplorer' = d '1'
}
}
}
}
}
}
}
}

jsycsj 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jiangsheng 的回复:]
2003的默认安全设置不允许第三方的扩展的吧
[/Quote]
IE的设置我基本上没有什么限制的,系统的就不太清楚了,我试试看
jsycsj 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jameshooo 的回复:]
把你的BHO项目设置成启动项目,在项目属性里设置调试选项,宿主应用选择IExplorer.EXE,然后设置断点看看SetSite能不能被调用
[/Quote]
我就是这样做的调试,我先用regsvr32调试了注册函数,之后换成了ie作为host program调试,没有进入到SetSite中去.
蒋晟 2008-09-25
  • 打赏
  • 举报
回复
2003的默认安全设置不允许第三方的扩展的吧
wangweixing2000 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jameshooo 的回复:]
把你的BHO项目设置成启动项目,在项目属性里设置调试选项,宿主应用选择IExplorer.EXE,然后设置断点看看SetSite能不能被调用
[/Quote]

好好调试一下,vs2005也可以用调试菜单下的->附加到进程 来调试你的BHO

写着东西不会调试不行啊!
good luck!
jameshooo 2008-09-25
  • 打赏
  • 举报
回复
把你的BHO项目设置成启动项目,在项目属性里设置调试选项,宿主应用选择IExplorer.EXE,然后设置断点看看SetSite能不能被调用
jsycsj 2008-09-25
  • 打赏
  • 举报
回复
在SetSite中加入断点,进行使用IE debugging,无法进入到SetSite函数.所以我也很奇怪的,但到IE的Tools Manage Add-ons当中的确看到了Sample BHO object.而且我用的是win server 2003管理员登陆的,应该不存在什么权限问题的.
jameshooo 2008-09-25
  • 打赏
  • 举报
回复
有跟踪过吗?是否挂接成功了?是否执行了页面加载?
jsycsj 2008-09-25
  • 打赏
  • 举报
回复
补充一下,在SetSite中我调用了DispEventAdvise与browser对象进行了绑定.
STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite)
{
if (pUnkSite != NULL)
{
// Cache the pointer to IWebBrowser2.
HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser);
if (SUCCEEDED(hr))
{
// Register to sink events from DWebBrowserEvents2.
hr = DispEventAdvise(m_spWebBrowser);
if (SUCCEEDED(hr))
{
m_fAdvised = TRUE;
}
}
}
else
{
// Unregister event sink.
if (m_fAdvised)
{
DispEventUnadvise(m_spWebBrowser);
m_fAdvised = FALSE;
}

// Release cached pointers and other resources here.
m_spWebBrowser.Release();
}

// Call base class implementation.
return IObjectWithSiteImpl<CHelloWorldBHO>::SetSite(pUnkSite);
}
jameshooo 2008-09-25
  • 打赏
  • 举报
回复
你只是实现了连接点,还没有把连接点挂接到浏览器控件上,当然收不到事件通知。
在SetSite被执行时获得IWebBrowser2接口,然后调用AtlAdvise函数或者IDispEventSimpleImpl<...>::Advise()来挂接事件。
jsycsj 2008-09-25
  • 打赏
  • 举报
回复
最简单的情况下,BHO 是一个在特定注册表项下注册的进程内 COM 服务器。启动时,Internet Explorer 查找注册表并加载所有将其 CLSID 保存在此处的对象。浏览器初始化对象并要求它提供特定接口。如果发现了这样的接口,Internet Explorer 使用所提供的方法将它的 IUnknown 指针传递给助手对象。图1说明了这一过程。

  浏览器可能在注册表里发现一系列 CLSID,并为每一个 CLSID 创建一个进程内的实例。结果,这些对象被加载到浏览器的上下文,并且可以向内置部件一样使用。然而,由于浏览器本质上是基于 COM 的,加载到进程内部并不很重要。从另外一方面看,BHO 确实能实现一系列潜在的功能,比如说实现窗口的子类或安装线程局域挂钩,但 BHO 的主要目的是脱离浏览器核心操作。为了连接浏览器事件,或者说,将事件自动化,助手对象需要建立一个有权限的并且是基于 COM 的通讯通道。所以,BHO 应实现名为 IObjectWithSite 的接口。实际上, Internet Explorer 通过 IObjectWithSite 传递一个指向它自己的 IUnknown 接口指针。随后,BHO 就将这个指针保存起来,并通过它获得其它所需的接口,如 IWebBrowser2、IDispatch 和 IConnectionPointContainer。


上面一段话是我google出来的一点信息
jsycsj 2008-09-25
  • 打赏
  • 举报
回复
用进程查看的确没发现加载我的Sample BHO object,但是相应的adobe的一些BHO也没有被加载到进程当中的,具体能解释一下什么原因呢,多谢.
加载更多回复(2)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧