实现IDocHostShowUI接口
在"定制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




