BHO的疑惑 有谁能解?

vcPlayer 2007-06-29 01:02:04
打开一个IE窗口时,若这个窗口属于一个新进程,则我的BHO对象只收到一次SetSite();

而当这个窗口不属于一个新进程时(如在hao123.com 的主页上点击时弹出的新窗口),则我的BHO会收到两次SetSite()。这是为什么?关键的是这样一来,我传给BHO的浏览器接口就不能使用了,会引起程序崩溃!!!!!!!!!!!

苦闷中,渴望有人支招!
...全文
778 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcPlayer 2007-07-03
  • 打赏
  • 举报
回复
不好意思,前面又在忙别的事情去了。先结贴,若有疑问再问。谢谢蒋大侠的热情帮助:)。
蒋晟 2007-07-01
  • 打赏
  • 举报
回复
用CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream 或者IGlobalInterfaceTable来列集你的接口
vcPlayer 2007-06-30
  • 打赏
  • 举报
回复
感谢LS两位的热情帮助,现在初步定位为线程问题。

由于我的BHO在执行过程中会有一些界面显示,因此是开了一个线程在执行我的功能代码。这个线程是在构造函数里面创建的,没事的时候就等待一个事件通知;线程的参数为BHO的类对象。

现在极度怀疑:子窗口的BHO在构造的时候,this 指针是否是真的代表“自己”?

还望解惑!谢谢。
蒋晟 2007-06-29
  • 打赏
  • 举报
回复
捕获DWebBrowserEvents2::OnQuit事件,这个事件触发的时候你应该释放你获得的接口
lzf8977 2007-06-29
  • 打赏
  • 举报
回复
DocumentComplete
的消息会比较多,要判断一下是不是最初的webbrowser
vcPlayer 2007-06-29
  • 打赏
  • 举报
回复
MSHTML::IHTMLWindow2Ptr pWin2 = NULL;

//pDoc2 是MSHTML::IHTMLDocument2Ptr对象,是通过IWebBrowser2Ptr接口一步一步正确获得的
pDoc2->get_parentWindow(&spWin2);

就是上面一句出问题。肯定能够保证网页已经“完成”OnDocumentComplete.

这个子窗口一出问题,同一IE进程的所有窗口都将被关闭。我就怀疑是否是接口指针的引用计数或是线程安全属性的继承……引起的?为什么在主窗口中可以这样用,而到子窗口就不行了呢?
蒋晟 2007-06-29
  • 打赏
  • 举报
回复
遍历DOM对象要在DocumentComplete之后才行
vcPlayer 2007-06-29
  • 打赏
  • 举报
回复
逛坛N年,今日终有幸碰见闻名遐迩的蒋兄了!!!!!

可能是我表达不清楚,再解释一下:

不属于一个新进程时=====》是指新窗口与原来的窗口处于同一进程中,而非是新通知旧。

我的BHO就是在SetSite() 中保存这个浏览器接口。但当我新开的这个窗口与前一个窗口处于同一进程中时(比如在一个主页中弹出一个新窗口),那么这个新窗口中的BHO对象收到的浏览器接口就不能正常使用(主要是不能遍历DOM对象),会引起程序崩溃。

补充:BHO线程是公寓模型。是否是线程继承时出了问题?Help me........
蒋晟 2007-06-29
  • 打赏
  • 举报
回复
不属于一个新进程时,实际上是新的进程在通知旧的进程打开窗口之后自己退出
你为什么要给BHO传浏览器接口?SetSite()不就是么
vcPlayer 2007-06-29
  • 打赏
  • 举报
回复
没人来?再多的分数也送不掉!

自己顶一个先。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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