S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

较难的问题:<object.../>和new ActiveXObject() 为什么不一样?

楼主myy()2005-11-08 21:13:35 在 VC/MFC / ATL/ActiveX/COM 提问

我写了一个ocx,运行在网页内,   想在ocx中获取当前网页的URL地址,代码在网上找到了,  
  也能用,但是发现有个问题,在网页中用<object.../>和new   ActiveXObject()   两种方式  
  载入ocx是,后种方式总是出错,请高手指点一下,不胜感激!  
   
  附代码(BCB的代码,AnsiString可看作VC的CString):  
  ...  
      AnsiString   __fastcall   TMyOcxImpl::GetPageURL(void)  
      {  
          AnsiString   s("");  
          try   {  
              CComPtr<IOleContainer>   iOct;  
              OleCheck(m_spClientSite->GetContainer(&iOct));  
              CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2>   iDoc(iOct);  
              if(iDoc!=NULL)  
              {  
                  CComBSTR   url("");  
                  OleCheck(iDoc->get_URL(&url));  
                  s=AnsiString(url.Copy());  
              }  
          }  
          catch(...)   {  
              s="";  
          }  
          return   s;  
      }  
  问题点数:100、回复次数:9Top

1 楼myy() 回复于 2005-11-08 22:07:56 得分 0

主要是这一句:  
   
  OleCheck(m_spClientSite->GetContainer(&iOct));  
   
  在Debug模式下会在   atlbase.h   内产生一个断言失败。Top

2 楼jiangsheng(蒋晟.Net[MVP]) 回复于 2005-11-09 02:44:58 得分 50

ActiveX   created   by   using   <object>   is   hosted   by   the   DHTML   Document   object,   which   may   supports   IHTMLDocument2.  
  ActiveX   created   by   using   new   ActiveXObject   is   hosted   by   the   script   engine.  
   
  Top

3 楼myy() 回复于 2005-11-09 12:03:52 得分 0

蒋老大你好:  
  为什么   new   ActiveXObject("Microsoft.XMLHttpRequest")   可以send时可以使用相对路径呢?  
   
  我的ocx内部在<object.../>情况时,自动获取当前网页的URL,然后通过UrlCombine()来转化的,不知道XMLHttpRequest如何弄的。Top

4 楼myy() 回复于 2005-11-10 10:09:33 得分 0

uppp...Top

5 楼jiangsheng(蒋晟.Net[MVP]) 回复于 2005-11-10 13:58:00 得分 0

因为URL是一样的……Top

6 楼myy() 回复于 2005-11-10 23:54:17 得分 0

因为URL是一样的……  
  -------------------------  
  哪个跟哪个一样啊?不明白。  
   
   
  页面当前完整URL是   http://aaa.bbb.ccc/ddd/eee/fff.jsp  
  用:  
      var   xobj=new   ActiveXObject("Microsoft.XMLHttpRequest")   ;  
      xobj.send("../a.jsp");  
  能正确的访问到   http://aaa.bbb.ccc/ddd/eee/a.jsp  
   
  用:  
      var   myobj=new   ActiveXObject("Myy.MyOcx")   ;  
      myobj.HttpGet("../a.jsp");  
   
  因为myobj不能自动获取到页面当前完整URL,内部不能用  
  UrlCombine()来合成  
  “http://aaa.bbb.ccc/ddd/eee/fff.jsp”和   “../a.jsp”  
  到  
  “http://aaa.bbb.ccc/ddd/eee/a.jsp”  
  除非我改方法,加个参数:  
      myobj.HttpGet(window.location.href,"../a.jsp");  
   
  但这样使用起来比较不方便啊。Top

7 楼myy() 回复于 2005-11-11 00:03:45 得分 0

蒋老大:  
   
  还记得这个问题吗?  
   
    “如何通过载入的ActiveX来在当前IE进程中创建一个自定义行为的“永久性”线程?”  
      http://community.csdn.net/Expert/topic/4130/4130296.xml?temp=.5653192  
   
  我后来终于找到了解决的办法,其实很简单,ocx   的主文件中有这个输出函数:  
   
  STDAPI   __export   DllCanUnloadNow(void)  
  {  
          //return   (_Module.GetLockCount()==0)   ?   S_OK   :   S_FALSE;  
          return   S_FALSE;   //   为心跳线程,我野蛮地阻止了IE进程卸载我的OCX  
  }  
   
  总是返回   S_FALSE   这样就OK了。  
   
  谢谢您在回复中给了我一些提示。Top

8 楼jiangsheng(蒋晟.Net[MVP]) 回复于 2005-11-11 02:58:09 得分 50

surely   you   can   pass   the   url   or   even   the   HTML   window   object   (external.menuArguments)   to   the   activex   control,   but   you   may   also   implement   IObjectWithSite   to   get   the   IWebBrowser2   interface.   If   your   control   supports   this   interface,   Internet   Explorer   will   call   the   SetSite   method   with   a   pointer,   which   may   be   used   to   query   the   webbrowser   service   via   its   IServiceProvider   interface.Top

9 楼myy() 回复于 2005-11-11 15:27:29 得分 0

呵呵,搞定了!就是通过实现IObjectWithSite接口做的,不过  
  <object.../>和new   ActiveXObject()   两种方式得分别用不同的方法  
   
  前者是:  
  从   m_spClientSite!=NULL,     得到   IOleContainer   ...  
   
  后者是:  
  从   m_spUnkSite!=NULL   ,   得到   IServiceProvider   ,再QueryService到IWebBrowser2...


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理