实现IDocHostShowUI接口

Zark 2006-03-10 03:55:21
在"定制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, 请问应如何实现呢?
...全文
429 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zark 2006-03-24
  • 打赏
  • 举报
回复
因为个人工作原因,此问题已不再有意义,谢谢诸位大佬的支持,先行结帖,后会有期。
pomelowu 2006-03-14
  • 打赏
  • 举报
回复
把聚合改为从IDocHostShowUI和CAxWindow多继承可行不。
我也在做类似的东西,不过没有用ATL的工程,仅仅用了一下CAxWindow作控件的容器,所以简单些。
蒋晟 2006-03-14
  • 打赏
  • 举报
回复
IE本身有自己的host实现。程序充其量可以在DocumentComplete之后,下一次BeforeNavigate之前用ICustomDoc::SetUIHandler设置一个暂时的control site。
Zark 2006-03-14
  • 打赏
  • 举报
回复
修改atlhost方法较为简单易行,缺陷是当build manager做发布时需重新编译,这时他必须同样地修正这个位于系统目录下的h文件。

采用聚合的方法目前尚未试成功。

随之而来了一个新问题,上述情况是在我可以控制host webbroswer control的情况下,如果我想直接使用IE,即采用CoCreateInstance直接生成IE实例,而不是生成webbrower control实型,这时失去了对host的控制,不知道IE的host是个什么东西,也不再可能通atlhost的方法来实现了,不知诸位对此可有什么高见。

pomelowu 2006-03-14
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20030714/16/2026676.html
Zark 2006-03-11
  • 打赏
  • 举报
回复
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的文件是否存在版权问题.

请诸位各抒自见,或对上述解决方法提出意见,或提出新的解决方法.再次对各位百忙之中能抽出时间参加讨论表示感谢.
蒋晟 2006-03-11
  • 打赏
  • 举报
回复
对于MFC7.0,你可以参考MFC实现IDocHostUIHandler接口的方法来实现IDocHostShowUI接口。
蒋晟 2006-03-11
  • 打赏
  • 举报
回复
ATl和MFC 7.0以上版本都直接支持IDocHostUIHandler接口,不过很难扩展它们来实现IDocHostShowUI接口。一个比较简单的办法是将atlhost.h改名并自行扩展其内的类。当然,这个办法过于依赖于ATL类的实现,而且会产生不可升级的代码。另一个方法就是你说的聚合,使用COM_INTERFACE_ENTRY_AGGREGATE_BLIND来重定向COM调用。这种方法的缺点是必须手动创建控件,不能连接到对话框编辑器创建的控件
UDX协议 2006-03-11
  • 打赏
  • 举报
回复
刚研读了atlbrowse,他的方法,完全可以解决你的问题,就象你所说,可能你的程序框架要改动。但是,他已经提供了方法。
蒋晟 2006-03-10
  • 打赏
  • 举报
回复
http://blog.csdn.net/jiangsheng/archive/2003/11/09/3795.aspx
Kudeet 2006-03-10
  • 打赏
  • 举报
回复
http://www.codeguru.com/Cpp/W-D/doc_view/chtmlview/article.php/c3253
http://www.beginthread.com/Article/Ehsan/Advanced%20CHtmlView%20Hosting/
UDX协议 2006-03-10
  • 打赏
  • 举报
回复
同时要实现ioledocument和ioleclientsite,ioledocument和iadvisesink,iallback等,比较复杂。
IDocHostShowUI本身实现不难,但是难在如何和你的web关联起来。要关联必须实现以上这些接口。

3,245

社区成员

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

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