CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  ATL/ActiveX/COM

实现IDocHostShowUI接口

楼主Zark(金陵五月)2006-03-10 03:55:21 在 VC/MFC / ATL/ActiveX/COM 提问

在"定制webbroser控件"(不知翻译是否确切,英文customerized   webbrowser   control)时,   实现了如下的IDocHostUIHandler接口.  
  class   DocHost   :   public   CComObjectRootEx<CComSingleThreadModel>,  
  public   IDispatchImpl<IDocHostUIHandlerDispatch,    
  &IID_IDocHostUIHandlerDispatch,   &LIBID_ATLLib>  
  {  
   
  DrDebug* m_pLog;  
  Param* m_pParam;  
  MainFrame* m_pParent;  
   
  CComQIPtr<IDispatch> m_spExternal;  
   
  public:  
   
  //~   ****************************************************************************  
  //~   DocHost  
  //~    
  //~   Constructor   of   DocHost   class  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  DocHost();  
   
  //~   ****************************************************************************  
  //~   ~DocHost  
  //~    
  //~   Destructor   of   DocHost   class  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  virtual   ~DocHost();  
   
          BEGIN_COM_MAP(DocHost)  
  COM_INTERFACE_ENTRY(IDocHostUIHandlerDispatch)            
          END_COM_MAP()  
   
  //~   ****************************************************************************  
  //~   SetExternal  
  //~    
  //~   Set   pointer   to   external   object  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  void   SetExternal(IDispatch*   pExt);  
   
  //~   ****************************************************************************  
  //~   SetParent  
  //~    
  //~   Set   pointer   to   parent  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  BOOL   SetParent(MainFrame*   pParent);  
   
  //~   ****************************************************************************  
  //~   ShowContextMenu  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   ShowContextMenu(DWORD   dwID,DWORD   x,DWORD   y,  
  IUnknown   *pcmdtReserved,IDispatch   *pdispReserved,HRESULT   *dwRetVal);  
   
  //~   ****************************************************************************  
  //~   GetHostInfo  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   GetHostInfo(DWORD*   pdwFlags,  
  DWORD*   pdwDoubleClick);  
   
  //~   ****************************************************************************  
  //~   ShowUI  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   ShowUI(DWORD   dwID,IUnknown   *pActiveObject,  
  IUnknown   *pCommandTarget,IUnknown   *pFrame,IUnknown   *pDoc,  
  HRESULT   *dwRetVal);  
   
  //~   ****************************************************************************  
  //~   HideUI  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   HideUI();  
   
  //~   ****************************************************************************  
  //~   UpdateUI  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   UpdateUI();  
   
  //~   ****************************************************************************  
  //~   EnableModeless  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   EnableModeless(VARIANT_BOOL   fEnable);  
   
  //~   ****************************************************************************  
  //~   OnDocWindowActivate  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   OnDocWindowActivate(VARIANT_BOOL   fActivate);  
   
  //~   ****************************************************************************  
  //~   OnFrameWindowActivate  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   OnFrameWindowActivate(VARIANT_BOOL   fActivate);  
   
  //~   ****************************************************************************  
  //~   ResizeBorder  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   ResizeBorder(long   left,long   top,long   right,  
  long   bottom,IUnknown   *pUIWindow,VARIANT_BOOL   fFrameWindow);  
   
  //~   ****************************************************************************  
  //~   TranslateAccelerator  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   TranslateAccelerator(DWORD_PTR   hWnd,DWORD   nMessage,  
  DWORD_PTR   wParam,DWORD_PTR   lParam,BSTR   bstrGuidCmdGroup,DWORD   nCmdID,  
  HRESULT   *dwRetVal)   ;  
   
  //~   ****************************************************************************  
  //~   GetOptionKeyPath  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   GetOptionKeyPath(BSTR   *pbstrKey,DWORD   dw);  
   
  //~   ****************************************************************************  
  //~   GetDropTarget  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   GetDropTarget(IUnknown   *pDropTarget,  
  IUnknown   **ppDropTarget);  
   
  //~   ****************************************************************************  
  //~   GetExternal  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   GetExternal(IDispatch   **ppDispatch);  
   
  //~   ****************************************************************************  
  //~   TranslateUrl  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   TranslateUrl(DWORD   dwTranslate,BSTR   bstrURLIn,  
  BSTR   *pbstrURLOut)   ;  
   
  //~   ****************************************************************************  
  //~   FilterDataObject  
  //~    
  //~   IDocHostUIHandler   Implementation  
  //~   Parameters:  
  //~  
  //~   Return:  
  //~   ****************************************************************************  
  HRESULT   STDMETHODCALLTYPE   FilterDataObject(IUnknown   *pDO,IUnknown   **ppDORet);  
     
  };  
   
  在主程序中使用  
  //-   Create   CDosHostUIHandelImpl   instance  
  CComObject<DocHost>* pDocHost   ;  
  hr=CComObject<DocHost>::CreateInstance(&pDocHost);  
  if(FAILED(hr))  
  {  
  m_pLog->FormatTrace(_T("Create   DocHostUIHandleImpl   Failed"));  
  LEAVE_FUNCTION(m_pLog);  
  return   0;  
  }  
   
  //-   link   up   with   host  
  CComQIPtr<IDocHostUIHandlerDispatch> pDocHostDisp;  
  pDocHostDisp=pDocHost;  
  pHost->SetExternalUIHandler(pDocHostDisp);  
   
  (其中pHost的类型是CComPtr<IAxWinHostWindow>)  
  使webbrowser与IDocHostUIHandler相连,   结果是令人满意的.   现在的问题是:   为了获得javascript中alert()函数事件,必须实现IDocHostShowUI,   请问应如何实现呢?  
  问题点数:200、回复次数:12Top

1 楼wwwllg(野蛮人)回复于 2006-03-10 08:20:05 得分 0

同时要实现ioledocument和ioleclientsite,ioledocument和iadvisesink,iallback等,比较复杂。  
  IDocHostShowUI本身实现不难,但是难在如何和你的web关联起来。要关联必须实现以上这些接口。Top

2 楼laiyiling(陌生人[MVP])回复于 2006-03-10 08:24:42 得分 0

http://www.codeguru.com/Cpp/W-D/doc_view/chtmlview/article.php/c3253  
  http://www.beginthread.com/Article/Ehsan/Advanced%20CHtmlView%20Hosting/Top

3 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-03-10 08:39:25 得分 0

http://blog.csdn.net/jiangsheng/archive/2003/11/09/3795.aspxTop

4 楼Zark(金陵五月)回复于 2006-03-11 00:15:41 得分 0

Jiangsheng先生的BLOG谈的是MFC架构下的对浏览器再定制问题,这些功能在我的程序中已经实现了.  
  layyiling先生的两个链接也是谈的MFC架构下的CHtmlView的问题,而我的原程序由于原始设计要求的制约,不可以载入MFC的任何类对象,从上面的部份代码中诸位可以看到这实际上是个ATL下的EXE.而且layyiling先生所提示是关于IDocHostUIHandler的接口讨论,在问题中我已说明IDocHostUIHandler的接口实现是不难的,在MSDN中有例可循.我的问题是关于IDocHostShowUI接口.  
  我同意wwwllg先生的说法,实现IDocHostShowUI本身并不难,就是两个函数.也许是我中文表达得不够清晰.说白了,这个问题就是应该使哪个类去继承IDocHostShowUI.  
   
  我尝试了在DocHost上继承,结果是ShowMessage函数并没有被调用,也尝试了创建另一个单独的COM类继承IDocHostShowUI,结果也没有成功.就目前了解过的情况来看,似乎方向错了,因为我是用CAxWindow去host(这个应翻译成什么?)WebBrowser控件的,所以应该让CAxWindow继承IDocHostShowUI接口,然而CAxWindow是ATL中的COM类,所以无法从中派生.  
   
  因此目前的结论是:    
   
  1.   推翻原设计,去掉CAxWindow,采用类似于MSDN中ATLBrowser范例中CAtlBrCon类的设计.好处:   不用再穷究IDcoHostShowUI的来龙去脉,可以照搬照抄.缺点:   更改原设计,将涉及大面积的代码改动以及更大的责任要求.  
   
  2.   设计一个COM类实现IDocHostShowUI接口,修改CAwWindow(实际上是CAxWinHostWindow)的头文件,使之与那个COM类实现"聚合"(Aggregation).优点:   维持原设计,减小责任.   缺点:   没有参考代码,可能在实现中还会出现其他未知问题,同时作为商业软件来说,更改MS的文件是否存在版权问题.  
   
  请诸位各抒自见,或对上述解决方法提出意见,或提出新的解决方法.再次对各位百忙之中能抽出时间参加讨论表示感谢.  
  Top

5 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-03-11 03:26:05 得分 150

ATl和MFC   7.0以上版本都直接支持IDocHostUIHandler接口,不过很难扩展它们来实现IDocHostShowUI接口。一个比较简单的办法是将atlhost.h改名并自行扩展其内的类。当然,这个办法过于依赖于ATL类的实现,而且会产生不可升级的代码。另一个方法就是你说的聚合,使用COM_INTERFACE_ENTRY_AGGREGATE_BLIND来重定向COM调用。这种方法的缺点是必须手动创建控件,不能连接到对话框编辑器创建的控件  
  Top

6 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-03-11 03:34:35 得分 0

对于MFC7.0,你可以参考MFC实现IDocHostUIHandler接口的方法来实现IDocHostShowUI接口。Top

7 楼wwwllg(野蛮人)回复于 2006-03-11 14:59:25 得分 25

刚研读了atlbrowse,他的方法,完全可以解决你的问题,就象你所说,可能你的程序框架要改动。但是,他已经提供了方法。Top

8 楼Zark(金陵五月)回复于 2006-03-14 11:58:32 得分 0

修改atlhost方法较为简单易行,缺陷是当build   manager做发布时需重新编译,这时他必须同样地修正这个位于系统目录下的h文件。  
   
  采用聚合的方法目前尚未试成功。  
   
  随之而来了一个新问题,上述情况是在我可以控制host   webbroswer   control的情况下,如果我想直接使用IE,即采用CoCreateInstance直接生成IE实例,而不是生成webbrower   control实型,这时失去了对host的控制,不知道IE的host是个什么东西,也不再可能通atlhost的方法来实现了,不知诸位对此可有什么高见。  
   
  Top

9 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-03-14 12:30:55 得分 0

IE本身有自己的host实现。程序充其量可以在DocumentComplete之后,下一次BeforeNavigate之前用ICustomDoc::SetUIHandler设置一个暂时的control   site。Top

10 楼pomelowu(羽战士)回复于 2006-03-14 12:35:27 得分 25

把聚合改为从IDocHostShowUI和CAxWindow多继承可行不。  
  我也在做类似的东西,不过没有用ATL的工程,仅仅用了一下CAxWindow作控件的容器,所以简单些。Top

11 楼pomelowu(羽战士)回复于 2006-03-14 13:27:47 得分 0

http://topic.csdn.net/t/20030714/16/2026676.htmlTop

12 楼Zark(金陵五月)回复于 2006-03-24 09:16:34 得分 0

因为个人工作原因,此问题已不再有意义,谢谢诸位大佬的支持,先行结帖,后会有期。  
  Top

相关问题

  • IDocHostShowUI 接口 (有请:蒋晟)
  • 接口实现问题
  • 关于接口的实现
  • 没法实现接口?
  • 如何实现 IHWEventHandler 接口
  • 简单问题1:接口可不可以实现接口?
  • 关于接口和它的实现类
  • vc下usb接口的实现
  • javabeans必须实现serializable接口吗?
  • atl如何实现多个接口的?

关键词

  • .net
  • 接口
  • 控件
  • 聚合
  • 先生
  • mfc
  • ie
  • idochostshowui
  • dochost
  • 实现

得分解答快速导航

  • 帖主:Zark
  • jiangsheng
  • wwwllg
  • pomelowu

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo