实现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, 请问应如何实现呢?
...全文
480 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关联起来。要关联必须实现以上这些接口。
内容概要:本文围绕基于CNN-BiLSTM-Attention混合神经网络模型的电力负荷预测展开研究,提出一种结合卷积神经网络(CNN)、双向长短期记忆网络(BiLSTM)与注意力机制(Attention)的深度学习框架,并通过Python代码实现高精度的短期与超短期负荷预测。该模型充分利用CNN对局部特征的提取能力,捕捉负荷数据中的周期性与趋势性模式;借助BiLSTM对时间序列前后向依赖关系的建模能力,增强对动态变化的感知;并通过Attention机制自适应地聚焦关键历史时刻,提升预测准确性。文中详细阐述了数据预处理、模型结构设计、训练流程及超参数调优方法,并在真实负荷数据集上进行了实验验证,结果表明该混合模型相比传统单一模型和其他基准模型具有更优的预测性能,尤其在应对非线性、非平稳负荷波动方面表现突出。; 适合人群:具备一定Python编程能力和机器学习基础,从事电力系统分析、能源管理、智能电网或时序预测相关工作的科研人员、工程师及高校研究生。; 使用场景及目标:①应用于电网调度、电力市场出清、需求响应管理等场景下的精细化负荷预测;②为研究人员提供一套完整的、可复现的深度学习负荷预测代码框架,推动AI技术在能源领域的落地应用;③帮助理解CNN、BiLSTM与Attention模块之间的协同机制及其在时序建模中的集成方式。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点掌握数据归一化、滑动窗口构造、模型搭建与训练技巧,并尝试在不同地区、不同季节的负荷数据上进行迁移测试,以深入理解模型泛化能力与调参策略。
内容概要:本文围绕“MATLAB具有储能的经济调度及机会约束和鲁棒优化”展开,系统研究了电力系统中融合储能技术的经济调度问题,重点探讨了机会约束规划与鲁棒优化方法在应对新能源出力不确定性、负荷波动及系统运行风险中的应用。内容涵盖风光储协同调度、多微网共享储能、电动汽车参与调度、低碳经济调度等多种典型场景,深入分析了储能的选址定容、功率协调控制、状态估计与优化调度模型。核心技术包括粒子群优化(PSO)、分布鲁棒机会约束(DRCC)、模型预测控制(MPC)、鲁棒优化、二阶锥规划(SOCP)等先进算法,并提供了基于Matlab/Simulink的完整仿真代码实现,旨在提升新型电力系统的运行灵活性、经济性与抗风险能力。; 适合人群:具备电力系统、自动化、电气工程或相关专业背景,熟悉Matlab/Simulink仿真环境与基本优化算法,从事新能源并网、微电网运行、储能系统规划、电力市场调度等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习并构建含储能的电力系统经济调度优化模型;② 掌握机会约束与鲁棒优化在处理新能源不确定性问题中的建模思路与求解方法;③ 利用提供的Matlab代码进行算法复现、仿真验证与性能对比,支撑科研项目攻关;④ 为撰写高水平学术论文、学位论文或工程优化方案提供可靠的模型参考与代码支持。; 阅读建议:建议读者结合文档中具体的案例(如风电-水电联合调度、电动汽车集群调度、多微网共享储能等)和配套的Matlab代码进行动手实践,重点关注优化模型的构建逻辑、约束条件设定与求解器配置过程,同时可关注公众号“荔枝科研社”获取完整资源包、复现教程及持续的技术支持。

3,248

社区成员

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

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